# JComboBox immer ItemStateChanged werfen



## The_S (30. Apr 2007)

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!


----------



## André Uhres (30. Apr 2007)

Versuch's mal mit ActionListener, statt ItemListener.


----------



## The_S (30. Apr 2007)

Hab ich schon, hilft leider nichts.


----------



## Wildcard (30. Apr 2007)

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.


----------



## L-ectron-X (30. Apr 2007)

Das ItemEvent besteht doch aus zwei Teilen. Kannst du nicht beide verarbeiten?


----------



## Gast (30. Apr 2007)

@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?


----------



## The_S (30. Apr 2007)

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!


----------



## Wildcard (30. Apr 2007)

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.


----------



## The_S (30. Apr 2007)

Das wäre lieb. Ich muss zwar morgen den Tag über lernen, werd aber parallel dazu weiter probieren. Danke!


----------



## L-ectron-X (30. Apr 2007)

Gast hat gesagt.:
			
		

> SELECTED und DESELECTED? Oder was meinst du jetzt?


Genau. Bin ich da auf'm verkehrten Dampfer?


----------



## André Uhres (30. Apr 2007)

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!


----------



## Gast (30. Apr 2007)

also bei mir nicht. Mom, ich mach mal ein KSKB.


----------



## The_S (30. Apr 2007)

Sry, Gast war schon wieder ich 


```
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.


----------



## Roar (30. Apr 2007)

bei mir funktioinierts
du wählst das item aber auch schon aus und klickst nicht nur 2mal auf die box drauf?


----------



## The_S (30. Apr 2007)

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 (30. Apr 2007)

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?


----------



## The_S (30. Apr 2007)

kleiner_held hat gesagt.:
			
		

> Hobbit_Im_Blutrausch hat gesagt.:
> 
> 
> 
> ...



Also in der echten Applikation schon (wobei JGoodies nicht exotisch ist  ), aber in diesem Testprogramm nicht.


----------



## Roar (30. Apr 2007)

liegt an deiner jre 6, hab ja schon immer gesagt is scheiße


----------



## kleiner_held (30. Apr 2007)

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.


----------



## The_S (30. Apr 2007)

Roar hat gesagt.:
			
		

> liegt an deiner jre 6, hab ja schon immer gesagt is scheiße



Das mag schon sein, aber bei Leuten mit ner 6er JRE hab ich dann halt n Prob ...  :cry:


----------



## André Uhres (30. Apr 2007)

Roar hat gesagt.:
			
		

> liegt an deiner jre 6, hab ja schon immer gesagt is scheiße


Kann ich nur bestätigen


----------



## The_S (30. Apr 2007)

Aber leider hilft das mir und all den anderen, kleinen Java-Programmieren, die einfach nur JRE 6 kompatible Programme schreiben wollen, nicht weiter  .


----------



## Roar (30. Apr 2007)

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


----------



## The_S (30. Apr 2007)

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.


----------



## kleiner_held (30. Apr 2007)

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.


----------



## The_S (1. Mai 2007)

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  .


----------



## Wildcard (1. Mai 2007)

Das würde zum Beispiel funktionieren:

```
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);
   }
}
```


----------



## Wildcard (1. Mai 2007)

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.


----------



## The_S (1. Mai 2007)

Danke, haste das auch mit 6er JRE getestet?


----------



## Wildcard (1. Mai 2007)

Ja, aber auf Linux. Das sollte allerdings mit ItemListeners auf jeder JRE funktionieren, da setPopupVisible immer aufgerufen werden muss.


----------



## The_S (1. Mai 2007)

OK, danke. Hab nämlich gerade keine 6er JRE da ...


----------

