Dynamische Checkboxes welche geklickt?

thedood

Grünschnabel
Halloo

Ich habe folgendes problem:

Ich kann zwar alle Checkboxes schön anzeigen lassen, und ich kann rumklicken ;) aber nachdem ich den Button für OK klicke will ich am schluss natürli herausfinden, welche ich nun geklickt hab.
Die Situation sieht folgendermassen aus:

Die JCheckBoxen erstellen:
Code:
    	  panel = new JPanel();
    	  for(int i=0; i<choices.length; i++){
    		  j = new JCheckBox(choices[i]);
    		  panel.add(j);
    		  j.addItemListener(this);
    	  }
    	  add (panel, BorderLayout.CENTER);
Der Itemlistener sagt mir schön welche items ich angeklickt habe:
Code:
	public void itemStateChanged(ItemEvent e) {
		JCheckBox j = (JCheckBox)e.getSource();
		int change = e.getStateChange();
		if (change == ItemEvent.SELECTED) {
		System.out.println(j.getText() + ": SELECTED ");
		} else if (change == ItemEvent.DESELECTED) {
		System.out.println(j.getText() + ": DESELECTED ");
		}

und nun die methode welche die selektierten icons heraussuchen sollte:
Code:
    private Object[] getSelected(){ 
    	return j.getSelectedObjects();
    }

Alle selektierten icons sollten also in ein einziges Objekt. Und genau da ist mein problem, wie bring ich das am besten hin?

Hoffe um eure hilfe und bin um jeden ratschlag fro.

MfG thedood
 
Grafische Elemente mit einer Schleife anzulegen halte ich persönlich für nicht so eine gute Lösung. Wenn du das ganze schon in einer Schleife hast solltest du darauf achten, das du immernoch nach dem erzeugen auf die verschiedenen Instanzen zugreifen kannst.
Das heißt du solltest statt der variable "j" lieber ein Array oder eine Arraylist anlegen. Diese(s) beinhaltet dann alle Checkbox-Objekte, welche du dann später einer anderen Liste mit allen Selektierten Checkboxes mitgeben kannst.

Java:
ArrayList<JCheckBox> selectedcblist = new ArrayList<JCheckBox>(); 

private ArrayList getSelected(){ 
     return selectedcblist;
}

In der itemStateChanged() befüllst du einfach die Liste.

Gruss

Ben
 
Hej Ben

Danke viel mals für deinen lösungsvorschlag! Habe das ganze mit arrays nun gemacht, und dann bei itemStateChanged selectedcblist.add(j); und selectedcblist.remove(j), wenn man wieder auf deselected klickt.

Nun das problem ist noch, dass bei der Methode getSelected, er ein Object will. (So wie ich das in den Handbücher gelesen habe ist ja ein Array auch ein object...?)

Aufjedenfall siehts dan so aus:
Code:
    private Object[] getSelected(){ 
    	return selectedcblist.toArray(); // 
        //return j.getSelectedObjects(); // geht! aber eben nur ein CheckBox(da kein Array vorhanden)
    }

muss ich bei selectedcblist.toArray() noch irgend was hinzufügen damit es gleichgültig ist mit "getSelectedObjects" ?

Wenn ich ein System.out.println auf j.getSelectedObjects() mache bekomme ich:
Code:
CHECKBOX 1
Was korrekt ist... Nur dass die ausgabe am schluss eben nur eine CheckBox ist, was ich durch das array geändert habe...

beim System.out.println auf selectedcblist zeigt er alle angeklickten checkboxes, aber nur in einem anderen format oder so was:

Code:
javax.swing.JCheckBox[,155,5,124x24,alignmentX=0.0,alignmentY=0.5,border=javax.s
wing.plaf.BorderUIResource$CompoundBorderUIResource@ee1ede,flags=296,maximumSize
=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,m
argin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBord
er=false,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rollove
rSelectedIcon=,selectedIcon=,text=CHECKBOX 5];javax.swing.JCheckBox[,13,5,13
7x24,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$Comp
oundBorderUIResource@ee1ede,flags=296,maximumSize=,minimumSize=,preferredSize=,d
efaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUI
Resource[top=2,left=2,bottom=2,right=2],paintBorder=false,paintFocus=true,presse
dIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,te
xt=CHECKBOX 4];javax.swing.JCheckBox[,13,34,137x24,alignmentX=0.0,alignmen
tY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@ee1ede,
flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,di
sabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom
=2,right=2],paintBorder=false,paintFocus=true,pressedIcon=,rolloverEnabled=true,
rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=CHECKBOX 2];javax.s
wing.JCheckBox[,155,34,124x24,alignmentX=0.0,alignmentY=0.5,border=javax.swing.p
laf.BorderUIResource$CompoundBorderUIResource@ee1ede,flags=296,maximumSize=,mini
mumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=
javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=fal
se,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelec
tedIcon=,selectedIcon=,text=CHECKBOX 1]

Diese ausgabe zeigt immerhin dass er die richtigen Checkboxes die ich angeklickt habe als Selected bewerted :) Nur muss das ganze noch im richtigen format sein vermute ich mal.? (Ich hoffe es ist nicht zu verwirrend und unverständlich :))

Liebe grüsse
 
Zuletzt bearbeitet:
ich muss noch hinzufügen wegen der ausgabe, dass da noch eine Methode ist, welche ich vergessen habe zu erwähnen, die dann die selektierten objekte auseinander nimt:
Code:
public String getFormatedSelection() {
    Object[] selection = getSelected(); // holt dieses array oder eben object
    if (selection.length > 0) {
      StringBuilder buffer = new StringBuilder();
      for (Object obj : selection ) {
        buffer.append(obj.toString()).append(";");
      }
      // Remote the last ;
      buffer.deleteCharAt(buffer.length()-1);
      System.out.println(buffer.toString()); // HIER SIND DIE AUSGABEN WELCHE BEIM POST ^ GEMEINT SIND
      return buffer.toString();
    }
      else {
        return "";
      }
  }
 
Hej Ben

Danke viel mals für deinen lösungsvorschlag! Habe das ganze mit arrays nun gemacht, und dann bei itemStateChanged selectedcblist.add(j); und selectedcblist.remove(j), wenn man wieder auf deselected klickt.

Nun das problem ist noch, dass bei der Methode getSelected, er ein Object will. (So wie ich das in den Handbücher gelesen habe ist ja ein Array auch ein object...?)

Ja, eine Array ist auch ein Objekt, aber du müsstest hier ein explizites Object[] erzeugen und zurückgeben. änder das Object[] einfach durch den Typ den du zurückgibst. Also z.b. ArrayList<JCheckbox> o.ä.!

Aufjedenfall siehts dan so aus:
Code:
    private Object[] getSelected(){ 
    	return selectedcblist.toArray(); // 
        //return j.getSelectedObjects(); // geht! aber eben nur ein CheckBox(da kein Array vorhanden)
    }

Wenn ich ein System.out.println auf j.getSelectedObjects() mache bekomme ich:
Code:
CHECKBOX 1
Was korrekt ist... Nur dass die ausgabe am schluss eben nur eine CheckBox ist, was ich durch das array geändert habe...

Das dein j.getSelectedObjects geht bezweifle ich nicht, das Problem ist das du mit j mehrere Objekte vom Typ JCheckbox erzeugst und j dann nur noch von der letzten JCheckbox das j erstellt hat weiß. Du hast also quasi 10 Objekte, von denen du aber nur noch 1 mit j ansprechen kannst drum habe ich gemeint das du eine Liste/Array brauchst.


beim System.out.println auf selectedcblist zeigt er alle angeklickten checkboxes, aber nur in einem anderen format oder so was:

Code:
javax.swing.JCheckBox[,155,5,124x24,alignmentX=0.0,alignmentY=0.5,border=javax.s
wing.plaf.BorderUIResource$CompoundBorderUIResource@ee1ede,flags=296,maximumSize
=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,m
argin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBord
er=false,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rollove
rSelectedIcon=,selectedIcon=,text=CHECKBOX 5];javax.swing.JCheckBox[,13,5,13
7x24,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$Comp
oundBorderUIResource@ee1ede,flags=296,maximumSize=,minimumSize=,preferredSize=,d
efaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUI
Resource[top=2,left=2,bottom=2,right=2],paintBorder=false,paintFocus=true,presse
dIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,te
xt=CHECKBOX 4];javax.swing.JCheckBox[,13,34,137x24,alignmentX=0.0,alignmen
tY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@ee1ede,
flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,di
sabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom
=2,right=2],paintBorder=false,paintFocus=true,pressedIcon=,rolloverEnabled=true,
rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=CHECKBOX 2];javax.s
wing.JCheckBox[,155,34,124x24,alignmentX=0.0,alignmentY=0.5,border=javax.swing.p
laf.BorderUIResource$CompoundBorderUIResource@ee1ede,flags=296,maximumSize=,mini
mumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=
javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=fal
se,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelec
tedIcon=,selectedIcon=,text=CHECKBOX 1]

Diese ausgabe zeigt immerhin dass er die richtigen Checkboxes die ich angeklickt habe als Selected bewerted :) Nur muss das ganze noch im richtigen format sein vermute ich mal.? (Ich hoffe es ist nicht zu verwirrend und unverständlich :))

Liebe grüsse

Mit dem .toArray lässt du dir dein Array und dessen Inhalt/Verhalten in einem String zurückgeben, du könntest den String zwar mit Regular Expressions oder per Hand zerlegen und dir so die Checkboxes angeben, aber das wäre nur umständlich.
Lass das .toArray beim return von getSelected einfach weg und änder Object[] in den Objecttyp den du erwartest, dann müsste alles klappen.
Solltest du noch Probleme haben kannst du deinen kompletten Code ja mal in code-tags reinsetzen dann schau ich es mir an wenn ich Zeit habe.

Gruss Ben
 
hmmmm... wenn ich den weg gehe und den eelends langen string auseinander nehme, wo man sagt:

nimm den ganzen string und gebe aus: zwischen "text=" und "]"

(das wäre dann also der text name der JCheckBox)

gibt es da eine möglichkeit die nicht alll zu aufwendig ist`?

(sorry, bin nicht der java spezialist:))
 
Wenn du nicht der spezialist bist solltest du dennoch versuchen Dinge alleine zu lösen, sonst bleibst du immer Abhängig. Lies dir mal die API von String und Pattern durch.

Ich schreib dir trotzdem mal ne Lösung in der Hoffnung das du dennoch was lernst und nicht nur den Code nimmst und dir dann alles egal ist.

Java:
import java.util.regex.Pattern;

public class RegExHex {

	public static void main(String[] args){
		
		String toarraystring = "javax.swing.JCheckBox[,155,5,124x24,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@ee1ede,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=false,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=CHECKBOX 5];javax.swing.JCheckBox[,13,5,137x24,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@ee1ede,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=false,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=CHECKBOX 4];javax.swing.JCheckBox[,13,34,137x24,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@ee1ede,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=false,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=CHECKBOX 2];javax.swing.JCheckBox[,155,34,124x24,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@ee1ede,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=false,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=CHECKBOX 1]";
		
		Pattern p = Pattern.compile("text=|\\]");	// the regexpattern
		
		String[] selectedcbs = p.split(toarraystring);
		
		for(int i = 0; i < selectedcbs.length ; i++){
			if(selectedcbs[i].substring(0, 8).equals("CHECKBOX")){
				System.out.println("Checkbox: " + selectedcbs[i]);
			}
		}
	}
}

Wenn es das war markier den Thread bitte als erledigt mit einen Klick auf "Erledigt"

Gruss Ben
 
Hej Gen

Danke für dein Beispiel.
Ne, einfach so abschreiben ohne zu überlegen tu ich nicht :P nur auf pattern bin ich nicht gekommen.
habs mit StringTokenizer versucht, aber irgend wie net geklapt...

Jo aber mit pattern gehts schon besser, werd mich da noch bisschen durchschlagen.

Gruss dood
 
Hallo,

Ich möchte das mal als "von hinten durch die Brust ins Auge"-Programmierung nennen !

Ich teile kaMiis Meinung das es nicht schön ist GUI-Elemente mit einer Schleife anzulegen.

Aber das scheint ja der "dynamische" Aspekt in deinem Fall zu sein.

Du scheinst ja ein Array mit Strings zu halten (choices) dessen länge ja bekannt ist.
Du erzeugst eine entsprechende Menge an Checkboxen. Da auch hier die Anzahl
bekannt ist bietet sich ein normales Array als "Ablage" dafür an !

z.B. :
Code:
JCheckBox[] boxes = new JCheckBox[lenght.choices]

Die Sache mit dem ItemListener würde ich so nicht praktizieren.

Besser wäre es in deiner getSelected-Methode das boxes-Array
einmal durchzugehen um mit
Code:
boxes[i].isSelected[]
die selektierten
Checkboxen zu erkennen und auf diese Art ein Rückgabewert zu erstellen.

Den Umweg über das Parsen der String-Repräsentation des Arrays ist ja wohl gruselig !

Beim durchgehen des boxes-Arrays lieber für alle selektierten Boxes ein
Code:
boxes[i].getText[]
ausführen um den Text zu bekommen (alternativ aus dem choices-Array)
und die Strings dann z.B. in die ArrayList als Rückgabewert legen.



Gruß JAdix
 
Hallo JAdix

Ich war so auf meine lösung konzentriert, dass ich immer weiter ins verderben rutschte :P
jo, der itemlistener hat mir eigendlich von anfang an nicht so gut gefallen (da es sinnlos war den aktuellsten status herauszufinden), aber es Funktionierte so weit, und da hab ich nicht nach einer anderen lösung gesucht...

Habs nun neu gemacht, mit arrays: private JCheckBox[] boxes;, die ich dann am schluss nach isSelected durchkämme und so klapts viel besser, logischer und einfacher :P


Danke dir für den Hinweis!

gruss dood
 
Zurück