JComboBox immer ItemStateChanged werfen

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Hi,

wie kann ich eine JComboBox so konfigurieren bzw. was muss ich wie überschreiben, damit bei jeder Selektion (egal ob das Item bereits ausgewählt wurde oder nicht) immer ein itemStateChanged geworfen wird?

Hintergrund: Wenn ein Element in der JComboBox ausgewählt wird, öffnet sich ein Fenster mit Informationen zum ausgewählten Element (Modaler Dialog mit Owner). Die soll natürlich immer geschehen, auch wenn eine Information zweimal hintereinander abgerufen wird, und nicht nur bei Auswahl einer neuen Information.

Danke!
 
Ich hätte auch gedacht der der ActionListener funktioniert. ???:L
Mach mal einen kleinen Versuch:
setz nach jedem Event selectedItemReminder = null und schau mal ob er dann events feuert.
 
@Wildcard

hab ich schon probiert, funktioniert aber nicht (zumindest nicht bei itemStateChanged, kanns aber auch nochmal mit dem ActionListener versuchen)

@LeX

Zwei Teile? SELECTED und DESELECTED? Oder was meinst du jetzt?
 
Sry, Gast war ich und selectItemRemainder nach jedem Event auf null zu setzen nützt leider auch beim ActionListener nichts 🙁

aber danke schonmal an alle!
 
Wenn du bis dahin noch keine Lösung hast schau ich morgen abend mal was ich tun kann.
Aus dem Kopf fällt mir nichts ein.
 
Das wäre lieb. Ich muss zwar morgen den Tag über lernen, werd aber parallel dazu weiter probieren. Danke!
 
Hobbit_Im_Blutrausch hat gesagt.:
Hab ich schon, hilft leider nichts.
Was heisst das: hilft nichts? Die Combobox feuert ein Action Event wenn der Benutzer ein Item aus dem Menü der Combobox auswählt, sogar wenn er immer das Gleiche Item auswählt!
 
Sry, Gast war schon wieder ich 😳

Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboBoxTest {

	public static void main(String[] args) {
		JComboBox box = new JComboBox();
		JFrame frame = new JFrame();
		box.addItem("eins");
		box.addItem("zwei");
		frame.add(box);
		box.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				System.out.println("blob");
			}
		});
		frame.pack();
		frame.setVisible(true);
	}
}

"blob" wird nur ausgegeben, wenn ein anderes Element als das bereits selektierte ausgewählt wird.
 
bei mir funktioinierts
du wählst das item aber auch schon aus und klickst nicht nur 2mal auf die box drauf?
 
ja, ich wähle es aus. Also ich hab n Fenster mit der JComboBox, in welcher "eins" steht. Dann klicke ich auf die JComboBox und es öffnet sich ganz normal das PopupMenu. Dort fahre ich dann mit meiner Maus auf die "eins" Anzeige des PopupMenus und klicke. Tut sich nichts. Funktioniert nur, wenn vorher ein anderes Item ausgewählt wurde.

JRE ist 6 und kompilieren tuts der Eclipse-Compiler. OS ist Windows XP Prof
 
kleiner_held hat gesagt.:
Hobbit_Im_Blutrausch hat gesagt.:
"blob" wird nur ausgegeben, wenn ein anderes Element als das bereits selektierte ausgewählt wird.
Hmm also bei mir funktionierts. Kann es sein, dass Du wieder irgendein exotisches L&F verwendest?

Also in der echten Applikation schon (wobei JGoodies nicht exotisch ist 😉 ), aber in diesem Testprogramm nicht.
 
Naja ich hab leider kein 1.6 am laufen sondern nur 1.5
aber unter 1.5 ist das so:

1. JComboBox.setSelectedItem(Object anObject)
macht immer am ende ein fireActionEvent();

2. JComboBox.setSelectedIndex(int anIndex)
ruft immer setSelectedItem(Object) auf (oder wirft eine IllegalStateException)

3. BasicComboPopup.Handler.mouseReleased(MouseEvent e)
ruft immer comboBox.setSelectedIndex(int); auf, wenn man die Maus über der JList losgelassen hat.
 
Aber leider hilft das mir und all den anderen, kleinen Java-Programmieren, die einfach nur JRE 6 kompatible Programme schreiben wollen, nicht weiter 😉 .
 
dann mach das halt anders. die idee dass man nen item auswählen muss um es bearbeiten zu können ist sowieso doof, vor allem muss man als user auch erstmal drauf kommen. deamweaver macht das auch so und das nervt .x
 
Das ist schon logisch aufgebaut. Grob gesagt werden .ini bzw. xml-files ausgewertet. Daraus wird dann eine Benutzeroberfläche mit n-Topics (ComboBox Namen) und n-Unterpunkte (und noch anderem Zeug, ist aber nicht von relevanz) generiert.

Ich persönlich fände aber ne Benutzeroberfläche mit über 20-Buttons äußerst unübersichtlich. Deswegen die JComboBox Lösung. Ne andere Viele mir spontan auch nicht wirklich ein.
 
Wie wäre es mit JLists anstatt von JComboboxen? Dann könntest Du deinen InfoDialog an die rechte Maustaste binden, was den Vorteil hätte, das Info-Abruf und Selektion unabhängig voneinander wären.
 
JList verbraucht zuviel Platz, ich hab jetzt anstelle eines Action bzw. ItemListener einen PopupMenuListener verwendet. Der modale Info-Dialog muss dann über SwingUtilities#invokeLater aufgerufen werden, da sonst das PopupMenu sichtbar bleibt, bis der Info-Dialog wieder geschlossen wird (das nur so zur Info).

Falls sonst noch jemand eine andere Lösung kennt, immer her damit 😉 .
 
Das würde zum Beispiel funktionieren:
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboBoxTest {

   public static void main(String[] args) {
      JComboBox box = new JComboBox() {
	
		@Override
		public void setPopupVisible(boolean v) {
			// TODO Auto-generated method stub
			super.setPopupVisible(v);
			if(!v && selectedItemReminder==getSelectedItem())
				fireActionEvent();
		}
	
	};
      JFrame frame = new JFrame();
      box.addItem("eins");
      box.addItem("zwei");
      frame.add(box);
      box.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            System.out.println("blob");
         }
      });
      frame.pack();
      frame.setVisible(true);
   }
}
 
Du solltest allerdings besser diese Technik auf einen ItemListener anwenden, die dieser AFAIK auch bei älteren JREs nicht informiert wird wenn sich die Selection nicht ändert.
 
Ja, aber auf Linux. Das sollte allerdings mit ItemListeners auf jeder JRE funktionieren, da setPopupVisible immer aufgerufen werden muss.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben