PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Checkbox in Dialog Dynamisch erstellen



lutoma
08.02.2009, 20:09
Huhu,
für ein kleines Update-System soll der User in einem Dialog per Checkbox auswählen können, was installiert werden soll... Die Checkbox-Sache an sich geht auch, das hab ich momentan so:


JCheckBox[] rdl = { new JCheckBox("update1."),new JCheckBox("update.") };
rdl = new JCheckBox[] { new JCheckBox("In Zukunft nicht mehr fragen.") };
Object[] message = new Object[updates];
message[0] = "Es wurden " + updates + " Updates gefunden.\nWelche sollen Installiert werden?";
message[1] = rdl[0];
message[2] = rdl[1];
Das ganze soll jetzt nurnoch dynamisch sein...
Die zuweisungen bei message[1] = rdl[0] usw. sind kein problem, das kann ich einfach per while-schleife machen. Was mir eher Kopfzerbrechen bereitet ist die Sache, wie ich die Checkboxen an sich erstellen soll.... Wenn ich das ganze so versuche:


JCheckBox[] rdl = { };
i=-1;
while(i < updates){
i++;
rdl[i] = new JCheckBox("update1");
}
Object[] message = new Object[updates];
message[0] = "Es wurden " + updates + " Updates gefunden.\nWelche sollen installiert werden?";
i=-1;
while(i < updates){
i++;
message[i+1] = rdl[i];
}
kompiliert er mir das zwar, aber beim ausführen krieg ich diesen fehler:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
at start.checkForUpdates(start.java:358)
at start.access$0(start.java:301)
at start$1.actionPerformed(start.java:460)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2012)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2335)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:404)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:253)
at java.awt.Component.processMouseEvent(Component.jav a:6108)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3276)
at java.awt.Component.processEvent(Component.java:587 3)
at java.awt.Container.processEvent(Container.java:210 5)
at java.awt.Component.dispatchEventImpl(Component.jav a:4469)
at java.awt.Container.dispatchEventImpl(Container.jav a:2163)
at java.awt.Component.dispatchEvent(Component.java:42 95)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4461)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4125)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4055)
at java.awt.Container.dispatchEventImpl(Container.jav a:2149)
at java.awt.Window.dispatchEventImpl(Window.java:2478 )
at java.awt.Component.dispatchEvent(Component.java:42 95)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 604)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:138)


Ich hoffe jemand kann mir helfen ?(
Danke im Voraus, Lutoma

SkydiverBS
08.02.2009, 21:48
Servus!


Wenn ich das ganze so versuche:


JCheckBox[] rdl = { };
i=-1;
while(i < updates){
i++;
rdl[i] = new JCheckBox("update1");
}
Object[] message = new Object[updates];
message[0] = "Es wurden " + updates + " Updates gefunden.\nWelche sollen installiert werden?";
i=-1;
while(i < updates){
i++;
message[i+1] = rdl[i];
}
kompiliert er mir das zwar, aber beim ausführen krieg ich diesen fehler:


Zunächst solltest du das rdl-Array genauso erzeugen, wie das message-Array. Mit deinem jetzigen Code erzeugst du ein leeres Array, was unweigerlich zu einer ArrayIndexOutOfBoundsException führt, wenn du auf irgendeinen Array-Index zugreifst. Weiterhin muss das message-Array ein Element mehr aufnehmen können, also musst du es mit
new Object[updates + 1] initialisieren.

Außerdem finde ich deine Schleifen-Konstruktion etwas merkwürdig. Ich nehme mal an, dass die while-Schleifen pro Update nur einmal durchlaufen werden sollen, richtig? Da du i aber mit -1 initialisierst und direkt am Anfang erhöhst, wird die Schleife einmal mehr durchlaufen. Besser wäre meiner Ansicht nach:

i=0;
while(i < updates){
// do something
i++;
}
oder du verwendest gleich eine for-Schleife.

Ich hoffe meine Vorschläge bringen dich weiter!

Gruß,
Philip

lutoma
09.02.2009, 00:10
Hey Danke, das funktioniert perfekt.

Du hast meinen Tag gerettet :D
.
.
.
EDIT (autom. Beitragszusammenführung) :
.
Soo, jetzt hab ich aber noch ein Problem: Dadurch dass das Array jetzt ein Object ist kann ich kein isSelected mehr dazutun (Listerner gehn auch nicht)... Aber irgendwie muss ich ja erkennen können welche checkboxen selektiert sind...

SkydiverBS
10.02.2009, 22:28
Hey Danke, das funktioniert perfekt.

Du hast meinen Tag gerettet :D

Gern geschehen :) !


Soo, jetzt hab ich aber noch ein Problem: Dadurch dass das Array jetzt ein Object ist kann ich kein isSelected mehr dazutun

Natürlich, du musst nur das Object zu einer JCheckBox casten:

JCheckBox checkbox = (JCheckBox) message[1];
checkbox.isSelected();
Das sollte funktionieren. Natürlich musst du dazu wissen das hinter dem Object message[n] auch ein JCheckBox steckt, weil du sonst einen Fehler bekommst. Bei deinem Code auf Anhieb nicht ganz trivial, da z.B. message[0] ein String ist.

Allerdings kannst du die Nachricht in message[0] in eine eigene Variable packen, dann könntest du ein reines JCheckBox-Array erzeugen, musst nicht mehr casten (was unschön ist) und würdest dir eine while-Schleife sparen. Mal als Vorschlag:


String message = "Es wurden " + updates + " Updates gefunden.\nWelche sollen installiert werden?";
JCheckBox[] rdl = new JCheckBox[updates];
for (int i = 0; i < updates; i++) {
rdl[i] = new JCheckBox("update" + (i + 1));
}


Kommt halt darauf an wie du das Array danach weiterverarbeitest.

Gruß,
Philip