2 Listener wiedersprechen sich.

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

ich habe zwei Komponenten des Typs JCheckBoxMenuItem die die selbe aufgabe haben.

Wenn eine von den beiden Komponenten angeklickt wird, sollen beide Komponenten des selben Status erhalten.

Es handelt sich für den User scheinbar um ein und die selbe Komponente, an 2 verschiedenen Plätzen.

Problem ist nun das jede Box das Event der anderen auslöst, bzw mit meiner jetzigen Lösung das deselektieren nicht mehr geht, weil ja eine Box zum Zeitpunkt des deselektierens noch selektiert ist.

Mein Listener:

Code:
    private void autoSaveItem2ActionPerformed(java.awt.event.ActionEvent evt) {                                              

        if ( autoSaveItem.getState() || autoSaveItem2.getState() )
            SmallMethods.setAutoSave(true);
        else
            SmallMethods.setAutoSave(false);        
        
    }

Meine Methode setAutoSave:

Code:
    /**
     * Sets the autoSave on or off (true or false).
     * @param booleanValue True or false
     */
    public static void setAutoSave(boolean booleanValue) {
        autoSave = booleanValue;
        if( booleanValue ) {
            MainFrame.saveItem.setEnabled   (false);
            MainFrame.autoSaveItem.setState (true);
            MainFrame.autoSaveItem2.setState(true);
        }
        else {
            MainFrame.saveItem.setEnabled   (true);
            MainFrame.autoSaveItem.setState (false);
            MainFrame.autoSaveItem2.setState(false);
        }
    }

Vorher hatte ich anstatt eines ActionListeners einen ItemListener. Ich sehe 2 möglichkeiten, welche ich beide nicht umsetzen kann:

1. In der jetzigen Variante if ( autoSaveItem.getState() || autoSaveItem2.getState() ) durch sowas wie if ( evt.getComponent.getState() ) zu ersetzen.

2. In der Itemlistener-Methode abfragen ob das Ereignis durch den Benutzer oder eine Methode ausgelöst wurde.

Wie gesagt weis ich bei beidem nicht wie ich es umsetzen kann.

Ich könnte natürlich auch eine eigene Klasse myOwnButton (erbt von JCheckBoxMenuItem) erstellen, aber das ist mir ehrlichgesagt zu viel aufwand, dieses Objekt dann auch noch in den Netbeans-GUI-Builder als Bean zu intigrieren, sollte es einfacher gehen :autsch:

Vielen Dank

Gruß :)
 
G

Guest

Gast
20mithrandir hat gesagt.:
Wie wärs mit event.getSource() abfragen?

Klar geht das, aber von event.getSource() kann ich nicht .getState() abfragen.

----

Ein Fall für Actions? Was zum Henker habe ich denn gemacht? Oó
 

20mithrandir

Aktives Mitglied
Also ganz schnell zusammengeschustert:

Code:
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class CheckboxTest extends JFrame implements ItemListener
{
	JCheckBox	chk1, chk2;

	public CheckboxTest()
	{
		super( "CheckboxTest" );

		this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

		this.chk1 = new JCheckBox( "Checkbox Nr. 1" );
		this.chk1.addItemListener( this );

		this.chk2 = new JCheckBox( "Checkbox Nr. 2" );
		this.chk2.addItemListener( this );

		Container pane = this.getContentPane();

		JPanel chkPanel = new JPanel( new FlowLayout() );
		chkPanel.add( this.chk1 );
		chkPanel.add( this.chk2 );

		pane.add( chkPanel );

		this.setSize( 320, 200 );
	}
	
	public void itemStateChanged( ItemEvent evt )
	{
		Object src = evt.getSource();
		
		System.out.println( src );
		
		if ( this.chk1.equals( src ) )
		{
			this.chk2.setSelected( chk1.isSelected() );
		}
		else if ( this.chk2.equals( src ) )
		{
			this.chk1.setSelected( chk2.isSelected() );
		}
		else
		{
			System.out.println( "Something's wrong..." );
		}		
	}

	public static void main( String[] args )
	{
		new CheckboxTest().setVisible( true );
	}
}

Was funktioniert daran nicht? Sollte auch mit den MenuItems gehen...
 
G

Guest

Gast
Sicher das es geht?

Ich habe jetzt equivalent zu deinem Code folgendes:

Code:
    private void autoSaveItemItemStateChanged(java.awt.event.ItemEvent evt) {                                              

        if ( evt.getSource() == autoSaveItem ) {
            SmallMethods.setAutoSave(autoSaveItem.getState());
            autoSaveItem2.setState  (autoSaveItem.getState());
        }
        else {
            SmallMethods.setAutoSave(autoSaveItem2.getState());
            autoSaveItem.setState   (autoSaveItem2.getState());            
        }
        
    }

Code:
    /**
     * Sets the autoSave on or off (true or false).
     * @param booleanValue True or false
     */
    public static void setAutoSave(boolean booleanValue) {
        autoSave = booleanValue;
        if( booleanValue ) {
            MainFrame.saveItem.setEnabled (false);
        }
        else MainFrame.saveItem.setEnabled(true);
    }

Allerdings wird das Immer 2 mal aufgerufen. Da ja der Status verändert wird. Hau mal bei deinem Code ein

Code:
System.out.println("Ohoh");

rein. Dann siehst dus.
 
G

Guest

Gast
Edit:\

Das eben war eine veraltete Methode. Sorry.. die neue sieht natürlich so aus:

Code:
    /**
     * Sets the autoSave on or off (true or false).
     * @param booleanValue True or false
     */
    public static void setAutoSave(boolean booleanValue) {
        autoSave = booleanValue;
        if( booleanValue ) {
            autoSave = true;
        }
        else autoSave = false;
    }
 

20mithrandir

Aktives Mitglied
Ich muss gestehen, dass mir deine Code-Auszüge nicht unbedingt sehr viel verraten. Aber die MenuItems funktionieren bei mir identisch:

Code:
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;

public class CheckboxTest extends JFrame implements ItemListener
{
	JCheckBox	chk1, chk2;
	
	JCheckBoxMenuItem	men1, men2;

	public CheckboxTest()
	{
		super( "CheckboxTest" );

		this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		
		
		this.men1 = new JCheckBoxMenuItem( "Menuitem Nr. 1" );
		this.men1.setSelected( true );
		this.men1.addItemListener( this );
		
		this.men2 = new JCheckBoxMenuItem( "Menuitem Nr. 2" );
		this.men2.setSelected( true );
		this.men2.addItemListener( this );

		this.chk1 = new JCheckBox( "Checkbox Nr. 1" );
		this.chk1.addItemListener( this );

		this.chk2 = new JCheckBox( "Checkbox Nr. 2" );
		this.chk2.addItemListener( this );
		

		
		JMenuBar mb = new JMenuBar();
		JMenu menu = new JMenu( "Menu" );
		menu.add( men1 );
		menu.add( men2 );
		mb.add( menu );
		
		this.setJMenuBar( mb );
		
		Container pane = this.getContentPane();

		JPanel chkPanel = new JPanel( new FlowLayout() );
		chkPanel.add( this.chk1 );
		chkPanel.add( this.chk2 );

		pane.add( chkPanel );

		this.setSize( 320, 200 );
	}
	
	public void itemStateChanged( ItemEvent evt )
	{
		Object src = evt.getSource();
		
		System.out.println( src );
		
		if ( this.chk1.equals( src ) )
		{
			this.chk2.setSelected( chk1.isSelected() );
		}
		else if ( this.chk2.equals( src ) )
		{
			this.chk1.setSelected( chk2.isSelected() );
		}
		else if ( this.men1.equals( src ) )
		{
			this.men2.setSelected( men1.isSelected() );
		}
		else if ( this.men2.equals( src ) )
		{
			this.men1.setSelected( men2.isSelected() );
		}
		else
		{
			System.out.println( "Something's wrong..." );
		}		
	}

	public static void main( String[] args )
	{
		new CheckboxTest().setVisible( true );
	}
}

Objekt-Vergleiche würde ich übrigens immer mit der equals() Methode machen.
 
G

Guest

Gast
Danke für deine Hilfe, doch hast du den Code jeh ausgeführt?

Füge in Zeile 82 (also vor men1.setSelected()) das ein:

Code:
 System.out.println("Ouch!");

Nun Starte das Prog und betrachte die Konsole. Du bekommst IMMER ein Ouch ausgegeben wenn du ein MenuItem anklickst.

Und genau diesen Nebeneffekt möchte ich doch vermeiden.
 

20mithrandir

Aktives Mitglied
Was bedeutet "jedes Mal"? Natürlich kommst du jedes Mal wenn du eine Selektion änderst so für beide Checkboxen / MenuItems in die Listener-Methode. Das war ja doch auch so gedacht, dass beide immer denselben selected-Wert haben, oder?
 
G

Guest

Gast
20mithrandir hat gesagt.:
Was bedeutet "jedes Mal"? Natürlich kommst du jedes Mal wenn du eine Selektion änderst so für beide Checkboxen / MenuItems in die Listener-Methode. Das war ja doch auch so gedacht, dass beide immer denselben selected-Wert haben, oder?

Klar. Nur möchte ich eben nicht, dass das setStatus (von Hand) ein Event auslöst, bzw das Event genau das erkennen kann.

Warum?

Die MenuItems haben natürlich auch eine Funktion. Bei Selektieren/Deselektieren rufen sie methoden auf und diese würden bei mir momentan 2x ausgelöst
 

20mithrandir

Aktives Mitglied
Das müsste sich ja so abfragen lassen:

Code:
else if ( this.men1.equals( src ) )
{
	if ( this.men1.isSelected() == this.men2.isSelected() )
	{
		System.out.println( "Men2 hat sich geändert..." );
	}
	
	this.men2.setSelected( men1.isSelected() );
}
else if ( this.men2.equals( src ) )
{
	if ( this.men1.isSelected() == this.men2.isSelected() )
	{
		System.out.println( "Men1 hat sich geändert..." );
	}
	
	this.men1.setSelected( men2.isSelected() );
}
 
G

Guest

Gast
LoL natürlich XD Da hätte ich auch drauf kommen müssen. Dankeschön.

Merkwürdig ist, dass ganze beim ersten Funktioniert und beim zweitem nicht :autsch:

ein Klick auf autosaveItem führt die Methode SmallMethods.setAutoSave einmal aus und
ein Klick auf autosaveItem2 führt die Methode "" zweimal aus Oo

Bahnhof? :?: Ich verstehs nicht.

In der Methode erscheint ein JOptionPane, deshalb weis ich wie oft sie ausgeführt wird.

Code:
    private void autoSaveItemItemStateChanged(java.awt.event.ItemEvent evt) {                                              

        if ( evt.getSource() == autoSaveItem ) {
            if( autoSaveItem.getState() == autoSaveItem2.getState() && autoSaveItem.getState() )
                SmallMethods.setAutoSave(autoSaveItem.getState());
            autoSaveItem2.setState  (autoSaveItem.getState());
        }
        else if ( evt.getSource() == autoSaveItem2 ) {
            if( autoSaveItem.getState() == autoSaveItem2.getState() && autoSaveItem2.getState() )
                SmallMethods.setAutoSave(autoSaveItem2.getState());
            autoSaveItem.setState   (autoSaveItem2.getState());            
        }
        
    }

Mein &&-Zusatz stellt sicher, dass die Komponente aktiviert wurde und nicht deaktiviert
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
D String value change listener Java Basics - Anfänger-Themen 2
topi WindowAdapter / Listener / Event Java Basics - Anfänger-Themen 4
L Problem mit Listener Java Basics - Anfänger-Themen 0
P Listener registrieren Java Basics - Anfänger-Themen 40
Salo JTabel Selection listener Bsp. Java Basics - Anfänger-Themen 3
W JLabel, Farbe durch Listener ändern Java Basics - Anfänger-Themen 6
M Listener für Button - Wert von Variablen verändern Java Basics - Anfänger-Themen 14
V JTable welcher Listener ? Java Basics - Anfänger-Themen 7
J Verständnis Problem Java-Listener. Java Basics - Anfänger-Themen 59
M Compiler-Fehler Using action listener Java Basics - Anfänger-Themen 1
F Listener schreiben Java Basics - Anfänger-Themen 1
P Eigene Knöpfe mit eigenem Listener Java Basics - Anfänger-Themen 5
B Listener beim Laden (deserialize) wieder hinzufügen bzw. mitspeichern? Java Basics - Anfänger-Themen 3
J Listener Java Basics - Anfänger-Themen 4
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
llabusch Kombinationsfeld - LISTENER Java Basics - Anfänger-Themen 0
S Eigenen Listener zu eigenen Button! Java Basics - Anfänger-Themen 5
S Listener reagieren nicht mehr Java Basics - Anfänger-Themen 3
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
E Mein eigener Listener (Hilfe gesucht) Java Basics - Anfänger-Themen 2
K On Click listener Problem Java Basics - Anfänger-Themen 4
L JTextField/Listener Input Problem Java Basics - Anfänger-Themen 2
M Listener einerm JPanel hinzufuegen Java Basics - Anfänger-Themen 3
G Listener ohne Objekt Java Basics - Anfänger-Themen 5
T Button Text mit Action Listener [Hilfe!] Java Basics - Anfänger-Themen 10
H Eigenen Listener einbauen Java Basics - Anfänger-Themen 5
K Key Listener bei 2 gleichzeitig gedrückten tasten Java Basics - Anfänger-Themen 3
M Bäume und Listener Java Basics - Anfänger-Themen 2
K Erste Schritte table Listener noob frage Java Basics - Anfänger-Themen 3
E eigenständige Listener-Klasse Java Basics - Anfänger-Themen 9
T Motion listener Java Basics - Anfänger-Themen 10
U Listener erstellen Java Basics - Anfänger-Themen 16
N Variablen aus Action Listener lesen und weiterverarbeiten Java Basics - Anfänger-Themen 12
M listener Java Basics - Anfänger-Themen 16
L Listener Problem in Klasse Java Basics - Anfänger-Themen 8
P Listener für mehrere Buttons Java Basics - Anfänger-Themen 3
L Window Listener Java Basics - Anfänger-Themen 2
Kenan89 JTable: Listener Java Basics - Anfänger-Themen 4
N Klassen auf den Action Listener in einer andere Klasse zugreifen Java Basics - Anfänger-Themen 6
A action listener Java Basics - Anfänger-Themen 8
M Netbeans Listener - Anonymous, inner class, main class? Java Basics - Anfänger-Themen 4
K Action Listener reagiert nicht auf Button druck mehr??? Java Basics - Anfänger-Themen 4
E Mehrere Listener auf einen Button? Java Basics - Anfänger-Themen 3
P Input/Output InputStream Listener? Java Basics - Anfänger-Themen 7
X Problem bezüglich Key Listener Java Basics - Anfänger-Themen 3
Y Button hört nicht auf Listener Java Basics - Anfänger-Themen 5
H JTable, Listener und CellEditor Java Basics - Anfänger-Themen 8
H Listener und Events entfernen Java Basics - Anfänger-Themen 2
B OOP Eigener Event-Listener erstellen Java Basics - Anfänger-Themen 4
M Listener Objekte Java Basics - Anfänger-Themen 12
S Applet Key Listener Java Basics - Anfänger-Themen 6
J Action Listener Java Basics - Anfänger-Themen 2
G Probleme mit Listener Java Basics - Anfänger-Themen 27
B Wert einer Variable mit Listener ueberwachen Java Basics - Anfänger-Themen 3
F Port Listener Java Basics - Anfänger-Themen 9
J JComboBox Listener Java Basics - Anfänger-Themen 6
J Window-Listener funktionieren nicht Java Basics - Anfänger-Themen 7
N Frage zu Listener für Textfelder Java Basics - Anfänger-Themen 5
Benji0815 Eigenen Listener schreiben Java Basics - Anfänger-Themen 13
M Probleme beim Aufruf von Listener in anderer Klasse Java Basics - Anfänger-Themen 9
S Key-Listener richtig "einbauen" Java Basics - Anfänger-Themen 42
S Listener von ausserhalb aufrufen Java Basics - Anfänger-Themen 2
S Action Listener Java Basics - Anfänger-Themen 6
Sweety Listener in Swing Java Basics - Anfänger-Themen 8
Hamstinator Design und Listener in verschiedenen Klassen Java Basics - Anfänger-Themen 6
Developer_X Mouse MOTION listener example Java Basics - Anfänger-Themen 5
J Mouse-Listener Java Basics - Anfänger-Themen 3
I Listener Klassen in Package Java Basics - Anfänger-Themen 3
StickToFreak Applet -> GameLoop + Listener / Listener funktioniert nicht Java Basics - Anfänger-Themen 22
B externer Listener für Zeichenbereich? Java Basics - Anfänger-Themen 2
D dialog listener? Java Basics - Anfänger-Themen 2
G Key Listener arbeitet Fehlerhaft Java Basics - Anfänger-Themen 6
C Listener und Events Java Basics - Anfänger-Themen 10
E Listener Java Basics - Anfänger-Themen 2
hdi keylistener hat keinen fokus oder: listener ohne frame? Java Basics - Anfänger-Themen 10
G jtable listener wenn zeile markiert wird Java Basics - Anfänger-Themen 6
S Action Listener Funktioniert nicht Java Basics - Anfänger-Themen 6
D Kombinationsfeld => Realisierung im Listener? Java Basics - Anfänger-Themen 2
G LIstener bei JavaMail Java Basics - Anfänger-Themen 2
G Context Listener des Apache Tomcat verwenden Java Basics - Anfänger-Themen 4
D Listener bzw. Interfaces Java Basics - Anfänger-Themen 7
A Wo/Wie Event Listener Java Basics - Anfänger-Themen 3
G Window Listener? Java Basics - Anfänger-Themen 2
G Listener für JPanel für Statusmeldungen Java Basics - Anfänger-Themen 3
F Listener für Variable Java Basics - Anfänger-Themen 29
A Gibt es standardmässig in Java einen Verzeichnis-Listener? Java Basics - Anfänger-Themen 6
N Listener für datei Java Basics - Anfänger-Themen 13
S Mit Listener AWT Objekte ansprechen Java Basics - Anfänger-Themen 2
G listener für radiobutton Java Basics - Anfänger-Themen 1
G Listener Java Basics - Anfänger-Themen 5
G Listener Problem Java Basics - Anfänger-Themen 3
B Wiso funktioniet das nicht? (Listener) Java Basics - Anfänger-Themen 6
H Key Listener macht nicht das was er soll Java Basics - Anfänger-Themen 4
T Wartet Klasse auf Listener? Java Basics - Anfänger-Themen 3
D Listener? Java Basics - Anfänger-Themen 2
S Listener auf JTextfeld Java Basics - Anfänger-Themen 8
B Kommunikation zwischen Klasse und Listener Java Basics - Anfänger-Themen 2
C Benutzereingaben vor Listener abfangen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben