JComboBox und setSelectedItem

BlubBlub

Bekanntes Mitglied
Hi,
ich hab einem JComboBox Objekt einen ActionListener hinzugefügt.
In meine Programm, setze ich über setSelectedIndex() bzw. setSelectedItem()
den Wert der in der JComboBox angezeigt werden soll.
Nun wird aber jedes mal sobald ich die Methode setSelectedIndex() bzw. setSelectedItem()
verwende, der ActionListener aufgerufen. Gibt es eine Möglichkeit wie ich den Wert setzen kann
ohne dass der ActionListener aufgerufen wird? Nur wenn der Benutzer per Hand den Wert ändert
soll der ActionListener aufgerufen werden.

Java:
JComboBox cb = new JComboBox();
cb.addActionListener(new comboBoxActionListener());
cb.setSelectedIndex()   bzw.    cb.setSelectedItem();
 

beastofchaos

Bekanntes Mitglied
@eRaaa:
"JComboBox.setSelectedIndex(int index)" leitet auf setSelectedItem um. Da steht dann:

Java:
    public void setSelectedItem(Object anObject) {
	Object oldSelection = selectedItemReminder;
        Object objectToSelect = anObject;
	if (oldSelection == null || !oldSelection.equals(anObject)) {
            // ...
	    // Ein paar Überprüfungen ...
            // ...
	    selectingItem = true;
	    dataModel.setSelectedItem(objectToSelect);             // Das ist die entscheidende Stelle, wo das Item geändert wird !!
	    selectingItem = false;

	    if (selectedItemReminder != dataModel.getSelectedItem()) {
		selectedItemChanged();
	    }
	}
	fireActionEvent();                          // Hier wird dann das ActionEvent aufgerufen !!
    }

Wenn du das "fireActionEvent()" umgehen willst, rufst du einfach (so wie dort) model.setSelectedItem(...) auf. Auf das Model komsmt du mit "get...". Also muss du einfach schreiben:

Code:
cb.getModel().getModel().setSelectedItem(comp);

Leider gibt es für das Model die Methode "setSelectedIndex()" nicht, weshalb du selber rausfinden musst, welche Komponente es ist.

Gruß, Thomas
 

Marco13

Top Contributor
Hast du asupropiert, ob der Event dann noch geworfen wird? Ich tippe nämlich auf JA. Wäre IMHO schlecht wenn nicht.
Man wird sich wohl selbst merken müssen, ob man den Event verarbeiten will, oder nicht.
 

bERt0r

Top Contributor
Marco hat recht, das Item event wird trotzdem geworfen weil das DefaultComboBox model selbst auch nochmal ein ListDataEvent event wirft. Das ganze ist anscheinend nur mit einem Workaround zu lösen:
Java:
public class ComboBoxTest extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ComboBoxTest frame = new ComboBoxTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public ComboBoxTest() {
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		JComboBox comboBox = new JComboBox(new String[] {"0","1", "2", "3", "4", "5"});
		class MyItemListener implements ItemListener {
			boolean enabled=true;
			public void itemStateChanged(ItemEvent e) 
			{
				if(enabled && e.getStateChange()==ItemEvent.SELECTED)
				{
					System.out.println(e.getItem());
				}
			}
			
			public void setEnabled(boolean b)
			{
				enabled=b;
			}
		};
		comboBox.addItemListener(new MyItemListener());
		comboBox.setSelectedIndex(4);
		for(ItemListener i:comboBox.getItemListeners())
		{
			if(i instanceof MyItemListener)
			{
				((MyItemListener) i).setEnabled(false);
			}
		}
		comboBox.setSelectedIndex(0);
		for(ItemListener i:comboBox.getItemListeners())
		{
			if(i instanceof MyItemListener)
			{
				((MyItemListener) i).setEnabled(true);
			}
		}
		
		comboBox.getModel().setSelectedItem("Ferdinand");
		comboBox.setSelectedItem("Karl-Heinz");
		

		contentPane.add(comboBox, BorderLayout.SOUTH);
	}

}
 

beastofchaos

Bekanntes Mitglied
Ja schon, aber es wird nun nur die Methode "contentsChanged(ListDataEvent e)" von allen ListDataListenern aufgerufen, nicht aber "actionPerformed(ActionEvent e)" von den ActionListenern.
Und genau das, wolltest du doch im ersten Post.

Außerdem wird in deinem letzten Quellcode ein ItemListener hinzugefügt. Wird der dann auch aufgerufen? Schließlich werden nur die ListDataListener benutzt in "fireContentsChanged()".

Wenn du es noch mit einem ItemListener/ListDataListener machst und der wird aufgerufen, dann musst du das Problem halt mit einem boolean-Wert umgehen, der public z.B. in deinem ActionListener liegt...

Hier mal ein Beispiel, wie das bei einem ActionListener aussehen würde
Java:
public boolean dontPerforme = false;

...
dontPerforme = true;
cb.setSelectedIndex(2);
...

@Override
public void actionPerformed(ActionEvent e){
    if (dontPerforme){
        dontPerforme = false;
        return;
    }
    ...
}

Bitte klär mich jetzt nochmal auf, welchen Listener du überhaupt umgehen willst, bzw. welche Methode nicht aufgerufen werden soll(Action-, Item- oder ListDataListener).
Gruß, Thomas
 

BlubBlub

Bekanntes Mitglied
Wenn du das "fireActionEvent()" umgehen willst, rufst du einfach (so wie dort) model.setSelectedItem(...) auf. Auf das Model komsmt du mit "get...". Also muss du einfach schreiben:

cb.getModel().getModel().setSelectedItem(comp);

Hi, also ich möchte sowohl den ActionListener als auch den ItemListener umgehen.
Bei mir feuert er aber weiterhin neben den ItemListenern auch den ActionListener,
wenn ich folgendes schreibe.

Java:
ComboBoxModel cbm = cb.getModel();
cbm.setSelectedItem("zwei");
 

Dit_

Bekanntes Mitglied
Wenn du das "fireActionEvent()" umgehen willst, rufst du einfach (so wie dort) model.setSelectedItem(...) auf. Auf das Model komsmt du mit "get...". Also muss du einfach schreiben:

Code:
cb.getModel().getModel().setSelectedItem(comp);

blöd das fireActionEvent() im Modell aufgerufen wird... :eek: Stichwort: MVC

1. Möglichkeit. Initphase ohne Listener. Zuerst Items einfügen/selektieren, dann Listener registrieren.
2. Möglichkeit. Schlechte. Wenn du ein Item einfügst/selektierst, entferne alle Listener, nach dem Einfügen wieder Listener "adden".
3. Möglichkeit. Naja... Wenn du ein Item einfügst/selektierst, setze die globale variable vom Typ boolean auf true.
Code:
ignoreAction = true
, danach wieder auf false.
Java:
            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource().equals(_comboBox)) {
                    
                    if (ignoreAction) {
                        return;
                    } else {
                        ...
                    }
                }
                
            }
 
Zuletzt bearbeitet:

beastofchaos

Bekanntes Mitglied
@Dit_:
Kleiner Tipp, benutz lieber nicht "equals" bei der Abfrage. Du könntest zum Beispiel zwei gleiche Objekte haben, aber willst nur auf eines reagieren. An der Stelle vergleicht er ja mit " = " nicht, den Inhalt(der bei beiden gleich wäre), sondern die ID des jeweiligen Objekt. Und schließlich hat jedes Objekt eine eigene ID ;)


Und ich hab nochmal in JComboBox nachgeschaut. In "new JComboBox().setSelectedItem(new Object())" steht ganz am Ende:
Code:
fireActionEvent();

Im "new DefaultCOmboBoxModel().setSelectedItem(new Object())" steht nur:
Code:
fireContentsChanged(this, -1, -1);

Und da steht:
Java:
protected void fireContentsChanged(Object source, int index0, int index1)
    {
	Object[] listeners = listenerList.getListenerList();
	ListDataEvent e = null;

	for (int i = listeners.length - 2; i >= 0; i -= 2) {
	    if (listeners[i] == ListDataListener.class) {
		if (e == null) {
		    e = new ListDataEvent(source, ListDataEvent.CONTENTS_CHANGED, index0, index1);
		}
		((ListDataListener)listeners[i+1]).contentsChanged(e);
	    }	       
	}
    }

Mir fältl aber grad auf, man kann einer JComboBox direkt keinen ListDataListener geben - nur dem Model. Möglicherweise werden damit alles ActionListener oder so aufgerufen (?). Sonst wüsst ich nicht, wie er auf die ActionListener und ItemListener (von denen ja bisher nirgendswo im Quelltext zu lesen war) zugreift. Sonst sind die 3 vorgeschlagenen Lösung eig ganz gut ;)

Gruß, Thomas
 

Dit_

Bekanntes Mitglied
@Dit_:
Kleiner Tipp, benutz lieber nicht "equals" bei der Abfrage. Du könntest zum Beispiel zwei gleiche Objekte haben, aber willst nur auf eines reagieren. An der Stelle vergleicht er ja mit " = " nicht, den Inhalt(der bei beiden gleich wäre), sondern die ID des jeweiligen Objekt. Und schließlich hat jedes Objekt eine eigene ID ;)

Aha dann schau doch mal wie die Methode von JComboBox.equals(obj) implementiert ist. Und wozu bitteschön werde ich 2 gleiche ComboBoxen mit gleichem Inhalt haben? Ach ja es ist wohl kaum ID, sondern Referenz. ID hat ein Objekt in der DB.

kleiner Tipp ;)
 

Dit_

Bekanntes Mitglied
Mir fältl aber grad auf, man kann einer JComboBox direkt keinen ListDataListener geben - nur dem Model. Möglicherweise werden damit alles ActionListener oder so aufgerufen (?). Sonst wüsst ich nicht, wie er auf die ActionListener und ItemListener (von denen ja bisher nirgendswo im Quelltext zu lesen war) zugreift.

JComboBox implementiert selbst ActionListener
Wenn der Benutzer ein Objekt selectiert, passiert follgendes:
Java:
public void actionPerformed(ActionEvent e) {
        Object newItem = getEditor().getItem();
        setPopupVisible(false);
        getModel().setSelectedItem(newItem);
	String oldCommand = getActionCommand();
	setActionCommand("comboBoxEdited");
	fireActionEvent();
	setActionCommand(oldCommand);
    }
 

beastofchaos

Bekanntes Mitglied
Ist ja behindert :p Und wie wird dieses implementierte "actionPerformed" von der JComboBox aufgerufen? Hab den Aufruf bisher noch nicht finden können :/

Und oh ja, hast recht, dass equals eigentlich das gleiche ist.
 

bERt0r

Top Contributor
Hi, also ich möchte sowohl den ActionListener als auch den ItemListener umgehen.
Bei mir feuert er aber weiterhin neben den ItemListenern auch den ActionListener,
wenn ich folgendes schreibe.

Java:
ComboBoxModel cbm = cb.getModel();
cbm.setSelectedItem("zwei");

Hast du dir meinen Code schon angesehen/ihn ausprobiert? Ich vermute mal nein.
Ansonsten hoffe ich dass du Punkt 1 von dit (Initphase ohne Listener. Zuerst Items einfügen/selektieren, dann Listener registrieren.) berücksichtigst. Das ist eigentlich die normale Prozedur beim erstellen eines Komponenten.
 

BlubBlub

Bekanntes Mitglied
1. Möglichkeit. Initphase ohne Listener. Zuerst Items einfügen/selektieren, dann Listener registrieren.
2. Möglichkeit. Schlechte. Wenn du ein Item einfügst/selektierst, entferne alle Listener, nach dem Einfügen wieder Listener "adden".
3. Möglichkeit. Naja... Wenn du ein Item einfügst/selektierst, setze die globale variable vom Typ boolean auf true. ignoreAction = true , danach wieder auf false.

Hi,
also die erste Möglichkeit kommt nur beim einmaligen Intialisieren in Betracht. In meinem Programm wird aber dynamisch je nach Benutzerauswahl neu initialisiert. Kurz gesagt die erste Möglichkeit reicht nicht.
Die zweite Möglichkeit habe ich auch schon selbst in Betracht gezogen und auch momentan implementiert, weil dies momentan die einzig zuverlässige Lösung ist, meines achtens.
Die dritte Möglichkeit ist etwas aufwändiger in der Umsetzung, auf Grund der Variablen. Durch Erstellung eines vernünftigen Konzeptes könnte man diese sicherlich in erwägung ziehen, aber um mein Programm nicht unnötig zu verkomplizieren und bereits implementiere Konzepte und Zusammenhänge nicht neu aufbrechen zu müssen, habe ich mich für Möglichkeit 2 entschieden, auch wenn sie nicht so schön ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JComboBox setSelectedItem() und getSelectedItem() NullPointer AWT, Swing, JavaFX & SWT 2
O JComboBox nach erkennt Wert nach setSelectedItem() nicht AWT, Swing, JavaFX & SWT 3
N Swing Focus von JComboBox entfernen, ohne einem anderen Feld den Focus zuzuweisen AWT, Swing, JavaFX & SWT 4
hannibalstgt Fehler bei JCOMBOBOX GUI Anzeige AWT, Swing, JavaFX & SWT 4
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
R JComboBox abfragen AWT, Swing, JavaFX & SWT 1
Esquid If Befehl bei JComboBox AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
D JComboBox Strings aus JTextFields zuordnen AWT, Swing, JavaFX & SWT 2
F JComboBox und Model AWT, Swing, JavaFX & SWT 10
I Editierbare JComboBox, die nur Ganzzahlen als Eingabewerte zulässt AWT, Swing, JavaFX & SWT 3
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
Hatsi09 JCombobox default wert AWT, Swing, JavaFX & SWT 6
D Swing JCombobox Aktion löscht Grafik AWT, Swing, JavaFX & SWT 1
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
R Swing Java9 NullPointerException bei JComboBox AWT, Swing, JavaFX & SWT 13
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
D Swing JCombobox Weiße Leerzeilen AWT, Swing, JavaFX & SWT 10
G JComboBox: Arrow-Button permanent anzeigen AWT, Swing, JavaFX & SWT 4
D Swing Java JComboBox Example AWT, Swing, JavaFX & SWT 16
K Swing JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 4
D Swing "blaues" Element aus JComboBox erhalten AWT, Swing, JavaFX & SWT 6
F JComboBox und Einträge AWT, Swing, JavaFX & SWT 3
gamillton Swing JComboBox mit extra Inhalt + breiteres Popupmenü AWT, Swing, JavaFX & SWT 0
T JPanelsteuerung mit JComboBox AWT, Swing, JavaFX & SWT 5
N Swing Duplikate im Jcombobox vermeiden AWT, Swing, JavaFX & SWT 15
L Swing JComboBox kann nicht erstellt werden! AWT, Swing, JavaFX & SWT 2
C JComboBox Objecte übergeben und Eintrag auswählen AWT, Swing, JavaFX & SWT 3
M Swing JComboBox mit Laufwerksbuchstaben (Windows) AWT, Swing, JavaFX & SWT 6
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
3 JComboBox - Action - Auslesen & Umwandeln AWT, Swing, JavaFX & SWT 9
M Alle Schriftarten in JComboBox AWT, Swing, JavaFX & SWT 5
M Swing JComboBox eigenes Design AWT, Swing, JavaFX & SWT 3
Sin137 JComboBox mit Generics AWT, Swing, JavaFX & SWT 14
R JComboBox erweitern AWT, Swing, JavaFX & SWT 5
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
V Editierbare JComboBox AWT, Swing, JavaFX & SWT 2
D Swing JCombobox in einem JTable vorbelegen AWT, Swing, JavaFX & SWT 4
F neuen Menüpunkt in jcombobox einfügen AWT, Swing, JavaFX & SWT 1
F Swing Jcombobox mit manueller Rückgabe AWT, Swing, JavaFX & SWT 4
W JComboBox auffristen nach Listenänderung AWT, Swing, JavaFX & SWT 20
S JComboBox mit mehreren Spalten? AWT, Swing, JavaFX & SWT 6
J JComboBox + ItemListener AWT, Swing, JavaFX & SWT 12
T Swing jComboBox auslesen mit Datenbankanbindung AWT, Swing, JavaFX & SWT 3
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
D Swing Erstes Item einer JCombobox in JTable anzeigen AWT, Swing, JavaFX & SWT 2
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3
H Swing jComboBox Ausgabe -1/null AWT, Swing, JavaFX & SWT 4
C Arrow Farbe bei JComboBox AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
O JTextfield und JComboBox Wert in SQL Database speichern AWT, Swing, JavaFX & SWT 4
S JComboBox UTF-8 Codierung zuweisen AWT, Swing, JavaFX & SWT 5
A JComboBox mit Array aktualisieren AWT, Swing, JavaFX & SWT 7
S JComboBox nach auswahl erneuern AWT, Swing, JavaFX & SWT 4
S Swing JComboBox mit Listener aktualisieren AWT, Swing, JavaFX & SWT 13
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
I JComboBox gibt bei ausgewählten ITem NullPointer an... AWT, Swing, JavaFX & SWT 3
D Swing JCombobox - Tooltip Location ändern AWT, Swing, JavaFX & SWT 4
J JComboBox Dropdown Icon AWT, Swing, JavaFX & SWT 2
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
A Swing bei Auswahl und klick eines JComboBox buttons die Klasse eines anderen Projekts aufrufen AWT, Swing, JavaFX & SWT 3
F Swing jComboBox auslesen AWT, Swing, JavaFX & SWT 6
O Swing TableCellRenderer und JComboBox AWT, Swing, JavaFX & SWT 4
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
C Swing JComboBox, ItemListener gibt 2x aus AWT, Swing, JavaFX & SWT 2
O JComboBox - autom. Selektieren AWT, Swing, JavaFX & SWT 6
J JComboBox - wie getSelectedItem() überschreiben? AWT, Swing, JavaFX & SWT 8
S Swing Jcombobox und array AWT, Swing, JavaFX & SWT 6
D Swing JComboBox aktualisieren AWT, Swing, JavaFX & SWT 4
E JComboBox AWT, Swing, JavaFX & SWT 8
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
H Swing Element aus JComboBox auswählen AWT, Swing, JavaFX & SWT 2
H JCombobox inhalt löschen AWT, Swing, JavaFX & SWT 17
N Swing JCombobox - PopupMenu-Inhalt mit KSKB AWT, Swing, JavaFX & SWT 2
O JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 3
S Swing JComboBox mit Datenbank füllen AWT, Swing, JavaFX & SWT 16
S Inhalt einer JComboBox aktualisieren AWT, Swing, JavaFX & SWT 6
F Swing JComboBox in JTable AutoComplete + Tab AWT, Swing, JavaFX & SWT 4
O JComboBox getSelectedItem AWT, Swing, JavaFX & SWT 4
M JComboBox Hintergrundfarbe des gewählten Items AWT, Swing, JavaFX & SWT 3
B Swing Problem: Horizontaler Scrollbalken in JComboBox hinzufügen AWT, Swing, JavaFX & SWT 4
M JCombobox mit ID und Text AWT, Swing, JavaFX & SWT 4
A JComboBox-Inhalt durch neues Array ersetzen AWT, Swing, JavaFX & SWT 2
C Swing Dynamische JComboBox (Filter) AWT, Swing, JavaFX & SWT 28
M JComboBox Item-Auswahl in JTable AWT, Swing, JavaFX & SWT 2
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
D JCombobox mit Linien Styles AWT, Swing, JavaFX & SWT 4
H Unterschiedliche JComboBox je JTable Zeile AWT, Swing, JavaFX & SWT 4
B jCombobox addItem funktioniert nicht AWT, Swing, JavaFX & SWT 9
G JComboBox mit CellRenderer (Auswahl) AWT, Swing, JavaFX & SWT 11
G Swing JComboBox anpassen AWT, Swing, JavaFX & SWT 6
M Item in JComboBox umbenennen AWT, Swing, JavaFX & SWT 5
M Swing Busy Waiting Problem (JComboBox) AWT, Swing, JavaFX & SWT 11
C JComboBox Renderer Problem AWT, Swing, JavaFX & SWT 7
N Renderer Editoren und die JCombobox AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben