JComboBox

Hallo. ich programmiere gerade ein GUI in welches eine JComboBox names JCB. bei der Konstruktion habe ich einen Array aus Integer objekten als items reingebracht. Nun versuche ich aber das ausgewählte item herauszuholen. Die Klassenmethode .getSelectedItem soll das ausgewählte item als ein object der klasse Object zurückgeben. die zuweisung eines erzeugten objektes funktioniert nicht, außerdem weiß ich wenn ich wenigstens ein Object hätte, wie ich an der Wert der items herankommen würde- es sind ja Integer items.
hier noch mal quellcode, der das problem deutlich macht:

private JComboBox basisComboBox;

Integer[] basis = { 10,2,8,16};
JComboBox basisComboBox = new JComboBox(basis);

Object base; // = new Object(); macht keinen unterschied
base = basisComboBox.getSelectedItem();

Hallo Ramin.

private JComboBox basisComboBox;

Integer[] basis = { 10,2,8,16};

Ähh, funktioniert das so???
Wenn du das mit Integer machen willst, müsste das IMHO so heißen:

Integer basis[] = new Integer[] {new Integer(10), new Integer(2), new Integer(8), new Integer(16)};

AFAIK bekommt der Compiler bestimmt Probleme, da er die 10, 2, etc. als int-Typen ansieht und sie nicht nach Integer casten kann.

JComboBox basisComboBox = new JComboBox(basis);

Object base; // = new Object(); macht keinen unterschied
base = basisComboBox.getSelectedItem();

Soweit so gut. Nachdem du ja weißt, dass es Integers sind, würde ich versuchen, dahin zucasten. Sprich:

Integer selected = (Integer) base; oder
Integer selected = (Integer) basisComboBox.getSelectedItem();

Müsste so klappen.

CU, Chris

Moin

private JComboBox basisComboBox;

Integer[] basis = { 10,2,8,16};

Ähh, funktioniert das so???
Wenn du das mit Integer machen willst, müsste das IMHO so
heißen:

Integer basis[] = new Integer[] {new Integer(10), new
Integer(2), new Integer(8), new Integer(16)};

AFAIK bekommt der Compiler bestimmt Probleme, da er die 10, 2,
etc. als int-Typen ansieht und sie nicht nach Integer casten
kann.

Der 1.5’er Compiler kann das. Der 1.4 wird bei dem Code kotzen …

cu

Integer[] basis = { 10,2,8,16};

Der 1.5’er Compiler kann das. Der 1.4 wird bei dem Code kotzen

Wusste ich noch nicht. Und das geht auch ohne new?

Hallo zusammen,

Wusste ich noch nicht. Und das geht auch ohne new?

…auch wenn’s möglich ist, heißt das noch lange nicht daß man es machen soll.

Integer[] basis = { 10,2,8,16};

Das ist PFUI!

Wenn der Compiler über solchen Code stolpert, müsste er eigentlich einen Stromschlag auf der Tastatur auslösen… :wink:

SCNR

Grüsse
Martin

Aua…

Wenn der Compiler über solchen Code stolpert, müsste er
eigentlich einen Stromschlag auf der Tastatur auslösen… :wink:

Na dann lass ichs lieber… :wink:

CU, Chris

naja und wie jetzt?
Integer basis[] = new Integer[] {new Integer(10), new Integer(2), new Integer(8), new Integer(16)};
das hat tatsächlich funktioniert.
Integer selected = (Integer) basisComboBox.getSelectedItem(); hat er auch noch akzeptiert. hat er meins vorher aber auch schon, aber bei der ausführung kommen dann viele Exceptions :

Exception in thread „AWT-EventQueue-0“ java.lang.NullPointerException
at IntegerRadixGUI.actionPerformed(IntegerRadixGUI.java:94)
at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1197)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:561)
at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:597)
at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:808)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:232)
at java.awt.Component.processMouseEvent(Component.java:5488)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:476)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1766)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Integer basis[] = new Integer[] {new Integer(10), new
Integer(2), new Integer(8), new Integer(16)};
das hat tatsächlich funktioniert.

Natürlich :wink:

Integer selected = (Integer) basisComboBox.getSelectedItem();
hat er auch noch akzeptiert.

Schön, schön.

Exception in thread „AWT-EventQueue-0“
java.lang.NullPointerException
at IntegerRadixGUI.actionPerformed(IntegerRadixGUI.java:94)

Wie der Exceptionname sagt, handelt es sich dabei um eine NullPointerException. D.h. in der Datei IntegerRadixGUI.java, Zeile 94, greifst du auf ein Objekt zu, dass aber zur Laufzeit null ist.

Warum und wieso, keine Ahnung. Dafür müsste man den Quellcode sehen.

Gruss, Chris

Exception in thread „AWT-EventQueue-0“
java.lang.NullPointerException
at IntegerRadixGUI.actionPerformed(IntegerRadixGUI.java:94)

Wie der Exceptionname sagt, handelt es sich dabei um eine
NullPointerException. D.h. in der Datei IntegerRadixGUI.java,
Zeile 94, greifst du auf ein Objekt zu, dass aber zur Laufzeit
null ist.

Warum und wieso, keine Ahnung. Dafür müsste man den Quellcode
sehen.

mmh das ist genau diese zeile:
Integer base = new Integer((Integer) basisComboBox.getSelectedItem());

Hi.

mmh das ist genau diese zeile:
Integer base = new Integer((Integer) basisComboBox.getSelectedItem());

Und das lässt sich compilieren?

Merkwürdig, denn eigentlich gibt es AFAIK keinen Integer(Integer) Konstruktor. Laut JavaDoc gibt es nur Integer(int) und Integer(String) Konstruktor.
Welche Javaversion benutzt du? Java 1.5.x? Und welche IDE?

Eigentlich müsste

Integer base = (Integer) basisComboBox.getSelectedItem();

reichen.

Ok, aber wenn das so läuft, gibts für das Entstehen der Exception eigentlich nur folgende Möglichkeiten:

Ist basisComboBox richtig erzeugt worden und damit nicht null? Also steht VOR dem Zugriff darauf irgendwo basisComboBox = new JComboBox(…);

Gibt basisComboBox.getSelectedItem() immer eine Wert ungleich null zurück?

Mehr fällt mir dazu auch nicht ein.

CU, Chris

Hey Chris

Ok, aber wenn das so läuft, gibts für das Entstehen der
Exception eigentlich nur folgende Möglichkeiten:

Ist basisComboBox richtig erzeugt worden und damit nicht

null? Also steht VOR dem Zugriff darauf irgendwo basisComboBox
= new JComboBox(…);

danke, danke an der Zeugung :smile: hat es gelegen.

Integer[] basis = new Integer[] {new Integer(10), new Integer(2), new Integer(8), new Integer(16)};
basisComboBox = new JComboBox(basis);

Integer base;
base = ((Integer) basisComboBox.getSelectedItem());

und da lag seltsamerweise der fatale Fehler.
vorher war es:
JComboBox basisComboBox = new JComboBox(basis);
für mich ein mysterium…
Vielen Dank für die Hilfe!

Moin.

vorher war es:
JComboBox basisComboBox = new JComboBox(basis);
für mich ein mysterium…

Hmm, schon etwas merkwürdig. Vielleicht liegts an der Sichtbarkeit deiner basisComboBox. Laut Stacktrace bist du ja in einer actionPerformed Methode und je nach Implementierung kann das etwas anders laufen… Aber dafür müsste man mal den ganzen Quellcode sehen.

Viel Erfolg noch.

Chris

Autoboxing
Ach ja, wen’s interessiert:

Das ganze nennt sich „Autoboxing“
http://java.sun.com/j2se/1.5.0/docs/guide/language/a…

Wenn ich mal das Fazit der Sun-Jungs zitieren darf:
„So when should you use autoboxing and unboxing? Use them only when there is an “impedance mismatch” between reference types and primitives, for example, when you have to put numerical values into a collection. It is not appropriate to use autoboxing and unboxing for scientific computing, or other performance-sensitive numerical code. An Integer is not a substitute for an int; autoboxing and unboxing blur the distinction between primitive types and reference types, but they do not eliminate it.“

… zusätzlich sorgt man dafür, dass der Sourcecode eben nur auf Java 1.5 konformen Compilern übersetzbar ist, weshalb ich davon abraten würde.

Grüße
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]