Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht

_Andi91

Bekanntes Mitglied
Hi,

habe folgendes Verhalten festgestellt:
Wenn eine Komponente von einem der Typen JToggleButton (JCheckBox, JRadioButton), JRadioButtonMenuItem, JCheckBoxMenuItem zuerst ein ItemListener hinzugefügt wird, in dem die Checkbox disabled wird und dann ein ActionListener hinzugefügt wird, wird der ActionListener nicht aufgerufen.

Code Beispiel:

Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JFrame;
import javax.swing.JCheckBox;

public class Testers extends JFrame
{
	private static final long serialVersionUID = 867647910472799215L;
	private JCheckBox checkBox;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		Testers frame = new Testers();
		frame.setVisible(true);
	}

	/**
	 * Create the frame.
	 */
	public Testers()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		
		checkBox = new JCheckBox("New check box");
		add(checkBox, BorderLayout.CENTER);
		
		checkBox.addItemListener(new ItemListener()
		{
			public void itemStateChanged(ItemEvent e)
			{
				if(e.getStateChange() == ItemEvent.SELECTED)
				{
					checkBox.setEnabled(false);
				}
			}
		});
		
		checkBox.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.out.println("Action Performed called");
			}
		});
	}
}


Ist das ein Bug oder so gewünscht? Ich persönlich finds nicht so schön...
 
Was erwartest du denn stattdessen für nen verhalten?
Als erstes wird der ItemListener aufgerufen, der disabled dann die checkbox. Eine Komponente dies nicht aktiv ist feuert keine events.
 
mh naja aber im Prinzip zum Zeitpunkt als das Event ja eigentlich ausgelöst wurde war die Komponente ja aktiv. Wenn ich jetzt einen ActionListener an die Checkbox häng erwarte ich doch auch dass der dann durchloffen wird, wenn auf die Komponente geklickt wird.
In meinem Fall is es halt so, dass es sein kann, dass mit der Komponente vorher im ItemListener zB schon irgendwas gemacht wird wovon ich nix weis. Ich häng mich blos hintendran.
Wenn ich jetzt in meinem Code den ItemListener durch einen ActionListener ersetze und dort die Checkbox disable, wird der zweite ActionListener ja auch durchloffen. Warum ist mir schon klar es wird halt ne Schleife durchloffen die das Event an alle ActionListener feuert. Zu dem Zeitpunkt ist die Prüfung schon vorbei.
Aber ich find das steht dann doch im Widerspruch zu der Aussage:
"Eine Komponente dies nicht aktiv ist feuert keine events. "
 
Es werden nicht alle Listener aus der Listener Liste des Models gleichzeitig informiert. ItemListener stehen in der Reihenfolge vor den ActionListenern. In dem Bsp. wird dadurch die Box deaktiviert. Bevor die ActionListener informiert werden wird allerdings auf isEnabled() überprüft und somit das feuert des ActionEvents nicht ausgeführt.
Wenn man statt des ActionListeners einen zweiten ItemListener registriert wird, sieht man, dass dieser trotz Deaktivierung angesprochen wird. Genauso verhält es sich, wenn man die Box im ActionListener deaktiviert. Die ItemListener reagieren trotzdem.
 
Wohl nicht direkt ein "Bug", aber zumindest ein amöbenartiges Scheinfüßchen am Randbereich dessen, was spezifiziert (oder auch nur spezifizierBAR) ist... Man sollte sich wohl zumindest nicht drauf verlassen.
 

Zurück
Oben