PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Event von JComboBox läuft immer 2x?



SeeksTheMoon
22-07-2003, 13:15
Hi!

Ich hab in einem Java-Programm JComboBoxen, an denen ein Listener vom Typ java.awt.event.ItemListener hängt.
Wenn ich den Inhalt der Combobox per Mausklick ändere, dann wird die itemStateChanged-Methode immer 2x ausgeführt. (Offenbar das erste Mal für den Urzustand und das zweite Mal für den neuen Zustand)

Beispiel:
Ich will in dieser Methode den Wert eines JSpinners um 1 senken, aber weil die Methode 2x durchlaufen wird, wird der Wert um 2 verringert:

start:
Spinnerwert vorher:3
Spinnerwert nachher:2
Spinnerwert vorher:2
Spinnerwert nachher:1


gibt es einen ActionListener, der nur 1x ausgeführt wird? Ich wüßte nämlich nicht, wie man den doppelten Durchlauf sonst verhindern kann.
Falls es so einen Listener gibt, dann muss die ihm übergebene Eventklasse die Methode getSource() besitzen (oder ich muss sonstwie an die Quelle des Events kommen).

Ich kann auch leider kein Observer-Pattern mehr machen, weil meine ComboBox bereits von einer Klasse erbt...

SeeksTheMoon
22-07-2003, 13:42
hat sich erledigt:

hehe, man nehme ActionListener und ActionEvent, das wird nur 1x ausgeführt

anda_skoa
22-07-2003, 14:50
Bei einem ItemListener muss man den Stte Change auswerten.

In deinem Fall ist der ActionListener besser geeignet, aber bei eine ComboBox muss man ja eventuell wissen, welches Item deselektiert wurde, etc.

Ciao,
_

SeeksTheMoon
23-07-2003, 18:59
Das muss ich sogar wissen, aber die Methode darf nicht 2x ausgeführt werden.

Ich hab mir eine ComboBoxvon JComboBox abgeleitet, die eine Methode hat, mit der ich auf selectedItemReminder zugreifen kann.
Laut API ist das böse, aber ich hab keine andere Möglichkeit gefunden.

bischi
23-07-2003, 21:25
Das erste Mal: Du klickst es an, Liste erscheint
Zweites Mal: Du wählst etwas aus

Aber was ich nicht ganz sehe: Wieso willst du mit einer ComboBox den Wert eines JSpinners ändern?

MfG Bischi

PS: Du könntest beispielsweise einfach eine int-Variable erstellen, dieser am Anfang den Wert 0 geben, bei jedem Durchlauf diese um 1 erhöhen und mit if feststellen, ob si auf 2 ist. Ist dies der Fall, so setzt du sie auf 0 zurück und erhöst deinen JSpinner :D

anda_skoa
24-07-2003, 10:02
Original geschrieben von SeeksTheMoon
Das muss ich sogar wissen, aber die Methode darf nicht 2x ausgeführt werden.


Wo ist da das Problem?

Du weißt ja auf Grund des states, welcher der beiden Aufrufe es ist.
Hintert dich niemand daran, in den beiden Fällen anderen Code auszuführen, oder?

Ciao,
_

bischi
24-07-2003, 10:52
Anda hat wie immer Recht, aber genau das habe ich ihm ja auf Vorgeschlagen (Man bin ich gut ;) ).

MfG Bischi

SeeksTheMoon
24-07-2003, 19:35
Original geschrieben von bischi
Das erste Mal: Du klickst es an, Liste erscheint
Zweites Mal: Du wählst etwas aus

[quote]Aber was ich nicht ganz sehe: Wieso willst du mit einer ComboBox den Wert eines JSpinners ändern?
Weil ich das machen muss :D Steht in der Combo Wert x, dann ändere ich die Zahl im Spinner, steht y in der Box, bekommt der Spinner nen anderen Wert. Is halt so, vertrau mir *g*


PS: Du könntest beispielsweise einfach eine int-Variable erstellen, dieser am Anfang den Wert 0 geben, bei jedem Durchlauf diese um 1 erhöhen und mit if feststellen, ob si auf 2 ist. Ist dies der Fall, so setzt du sie auf 0 zurück und erhöst deinen JSpinner :D
Jo, aber dann hab ich Overhead im Programm: Methode wird ausgeführt, ich brauch ne Variable in der Klasse ich mach ein if, dann setz ich sie auf 0...

Mit dem state das peil ich nicht: Es gibt zwar das Field ITEM_LAST, aber das ist 1. ein int und zweitens wüßte ich nicht welche der Methoden ich benutzen soll, um darauf zuzugreifen:
getItem()
getItemSelectable()
getStateChange()
paramString()
das scheint irgendwie alles nicht zu passen. getStateChange würde wohl am besten passen, aber wie soll man die Beschreibung "Returns the type of state change (selected or deselected)" verstehen? Was ist jetzt was und welche Werte können da kkommen, bzw wie sind sie zu interpretieren?
Das ist irgendwie nicht ganz koscher...

bischi
24-07-2003, 20:07
Ich weiss, Google ist noch nicht bei allen angekommen. Ebenfalls wissen noch nicht alle, dass Sun eine Homepage hat (gut, ich gebs ja zu, ich mache jeweils auch einen weiten Bogen um diese).

Aber es gibt da so einen schönen Link: http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html

Ein Sun Tut, wie du Comboboxen brauchen tust und auf deren Eingaben reagierst.

MfG Bischi

SeeksTheMoon
24-07-2003, 20:35
ja und sogar die benutzen den normalen ActionListener. Ich bin schnell drübergeflogen und hab auch keinen Hinweis bekommen, wie man auf das letzte ausgewählte Element zugreift (weil die ComboBox das standardmäßig auch gar nicht erlaubt). Die sagen nur: "Thus two item events are fired each time the user selects a different item from the menu." und "getStateChange() Returns the new state of the item"

Was solls, meine Methode klappt und falls es eine andere, offizielle gibt, so ist sie nicht offensichtlich. Widmen wir uns den wichtigen Dingen im Leben....