JButton ActionListener nach einmaligem Ausführen zurücksetzen

Alja

Mitglied
Hallo.
Habe ein Problem mit ActionListener.
In einem Programm soll bei mir der ActionListener eines Buttons erst nach der "Aktivierung" eines anderen Buttons erfolgen. Klappt soweit wunderbar. Nur wenn ich den "Aktivierungsbutton" (im Code b1) erneut anklicke, und dann wieder den zweiten (b2), führt mir der zweite Button sein Befehl gleich zwei mal aus.
Hat vielleicht jemand eine Idee, wie man nach dem einmaligen Ausführen den ActionListener irgendwie auf den Anfangszustand setzten kann?
Hier TestCode:
Java:
package Test;
public class ButtonTest extends java.awt.Frame {
	
	 javax.swing.JButton b1 = new javax.swing.JButton();;
	 javax.swing.JButton b2 = new javax.swing.JButton();
	 javax.swing.JPanel jPanel1 = new javax.swing.JPanel();

    public ButtonTest() {
        initComponents();
    }

    private void initComponents() {

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });
        b1.setText("b1");
        jPanel1.add(b1);
        b2.setText("b2");
        jPanel1.add(b2);
        add(jPanel1, java.awt.BorderLayout.CENTER);
        pack();
        
        b1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                 
                 print();
            }
        });
    }

    public void print(){ 
    	System.out.println("führe Test durch");       
        b2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
               System.out.println("test");
            }
        });
    }

   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ButtonTest().setVisible(true);
            }
        });
    }
    private void exitForm(java.awt.event.WindowEvent evt) {                          
        System.exit(0);
    } 
}
 

eRaaaa

Top Contributor
naja, du rufst ja im ActionListener voin b1 print() auf...innerhalb dieser Methode, fügst du dem Button b2 auch einen ActionListener an...das machst du jetzt aber jedes mal ! d.h. nach 2 mal klicken von b1, hast du 2 Listener an b2 rangehangen !

Mit
if (b2.getListeners(java.awt.event.ActionListener.class).length == 0) {
könntest du abfragen ob der Button schon ActionListener registriert hat..aber irgendwie erscheint mir das komisch :D

Wäre vllt nicht eher setEnabled(boolean..) eine bessere Alternative?
 

Alja

Mitglied
aber mit setEnable(false) schalte ich den Button doch ganz aus.. er soll aber doch ansprechbar bleiben :( ... er soll nur irgendwie den ActionListener von neu aufrufen ... wahrscheinlich denke ich mir grad einen totalen Mist aus, gell :oops: ...
 

eRaaaa

Top Contributor
Naja, ich meinte es eher so, dass er zu Beginn mit setEnabled(false) deaktiviert ist, du den Listener ganz normal an ihm registrierst, aber dann in der actionPerformed von b1, b2 aktivierst..
Java:
//vorher b2 setEnabled(false); + Listener registriert!

	b1.addActionListener(new java.awt.event.ActionListener() {
	    public void actionPerformed(java.awt.event.ActionEvent evt) {
		print();
		if (!b2.isEnabled()) {
		    b2.setEnabled(true); // aktiviere b2
		}
	    }
	});

irgendwie so halt... (in print() ist jetzt wirklich nur das System.out, mehr nicht !!)

Oder versteh ich irgendwas falsch von dem, was du eig. willst?

/edit: p.s. : du mixed hier übrigens awt mit swing = keine gute Idee in der Regel :D
 
Zuletzt bearbeitet:

Alja

Mitglied
das eigentliche Programm, in dem ich diese Problem habe, ist anders. das ist nur so ein BeispielCode, um das Problem zu beschreiben. Im eigentlichen Programm kann ich wirklich nicht umgehen, dass der zweite Button erst nach dem ersten funktioniert. Und das ganze programm funktioniert auch wunderbar, wenn ich den Befehl des ersten Buttons nur einmal ausführe, beim zweiten Mal macht er leider alles doppelt. Ich sehe auch warum er das macht. Ich dachte nur, ich kann es dem Button irgendwie "beibringen", dass er sich nach jedem Ausführen irgendwie "bereinigt" (mir fällt irgendiwe kein passender Begriff ein, sorry :) )
 

eRaaaa

Top Contributor
Was gefällt dir denn an meinem Vorschlag mit setEnabled nicht? Wenn der Button noch keinen Listener hat (oder eben noch nichts machen soll) macht es doch auch keinen Sinn ihn aktiviert darzustellen, das verwirrt einen Benutzer doch nur...er klickt und klickt und wundert sich wieso nichts passiert....

Wenn du allerdings immer noch auf deine Idee beharrst, könntest du eben wie ich schon sagte mit getListener abfragen ob b2 schon Listener hat...oder du erstellst dir halt eben selbst irgend ein Flag...aber nunja... ;(
 

Alja

Mitglied
setEnabled löst das problem leider auch nicht .... es ist egal, ob der zweite Button zuerst eingeschaltet ist oder nicht. Das erste mal schreibt er nur ein mal "test", das zweite mal aber 2 mal.
Ich weiß, ich erkläre nicht richtig, was ich eigentlich will... ist irgendwie schwierig... aber wenn du mein Code ausführen lässt, und zwar in der Reihenfolge:
1. Button b1 klicken,
2. b2 klicken,
3. noch mal b1 klicken,
4. und jetzt noch mal b2 klicken.
jetzt kannst du sehen was er macht. beim zweiten klicken auf b2 - führt er System.out. 2 mal durch ...
Aber irgendiwe ist es mir auch schon zu peinlich andere Menschen mit so einem Quatsch zu beschäftigen... muss mir wahrscheinlich was anderes überlegen ... Danke Dir aber für deine Vorschläge... vor allem das mit awt und swing mixen muss ich noch ändern! Danke ...
 

eRaaaa

Top Contributor
nein nein, ich verstehe dein Problem schon (denke ich zu mindestens), aber ich glaube du verstehst noch nicht so recht wie ich das meinte. Daher folgt jetzt mal,basierend auf deinem Code, ein Beispiel wie ich das ca. meinte:
Java:
public class ButtonTest extends java.awt.Frame {

    javax.swing.JButton b1 = new javax.swing.JButton();;
    javax.swing.JButton b2 = new javax.swing.JButton();
    javax.swing.JPanel jPanel1 = new javax.swing.JPanel();

    public ButtonTest() {
	initComponents();
    }

    private void initComponents() {

	addWindowListener(new java.awt.event.WindowAdapter() {
	    public void windowClosing(java.awt.event.WindowEvent evt) {
		exitForm(evt);
	    }
	});
	b1.setText("b1");
	jPanel1.add(b1);
	b2.setText("b2");
	b2.setEnabled(false);
	jPanel1.add(b2);
	add(jPanel1, java.awt.BorderLayout.CENTER);
	pack();

	b1.addActionListener(new java.awt.event.ActionListener() {
	    public void actionPerformed(java.awt.event.ActionEvent evt) {
		print();
		if (!b2.isEnabled()) {
		    b2.setEnabled(true);
		}
	    }
	});

	b2.addActionListener(new java.awt.event.ActionListener() {
	    public void actionPerformed(java.awt.event.ActionEvent evt) {
		System.out.println("test");
	    }
	});
    }

    public void print() {
	System.out.println("führe Test durch");
    }

    public static void main(String args[]) {
	java.awt.EventQueue.invokeLater(new Runnable() {
	    public void run() {
		new ButtonTest().setVisible(true);
	    }
	});
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
	System.exit(0);
    }
}
zu Beginn ist Button zwei deaktiviert, wird Button eins gedrückt, wird Button zwei aktiviert und man kann nun so oft wie man will auch Button 2 drücken (und es wird auch nur einmal der Code ausgeführt :D )
 

Alja

Mitglied
:( ... leider ist es nicht die Lösung, die mir hilft... das Problem ist ja grad, dass der ActionListener vom Button b2 in der methode print() sein soll, und nicht ausserhalb ... gerade dadurch ensteht ja auch das Problem mit 2 mal den befehl ausführen ... klar, wenn ich ActionListener aus print() auslagere, dass es funktioniert (auch ohne setEnabled), aber der zweite Button muss nun wirklich in print() sein :(
 
Zuletzt bearbeitet:

Marco13

Top Contributor
AWT und Swing mixt du doch gar nicht?!

Ein ... Vorschlag:
Java:
    private ActionListener currentActionListener = null;
    public void print()
    { 
        if (currentActionListener != null) 
        {
            b2.removeActionListener(currentActionListener);
        }
        System.out.println("führe Test durch");       
        currentActionListener = new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
               System.out.println("test");
            }
        };
        b2.addActionListener(currentActionListener);
    }

Sieht aber immernoch ein bißchen .. krampfig aus... wenn man genauer wüßte, was das am Ende werden soll, könnte man ggf. eine "angemessenere" Lösung finden...
 

Alja

Mitglied
:toll: :toll: Super! DANKE Marco13 ... das mit dem aktuellen ActionListener removen funktioniert super!!! Genau das was ich suchte, wusste nur nicht, wie ich den Listener remove. Danke, noch mal!!! :applaus:
 
Zuletzt bearbeitet:

Alja

Mitglied
--> public class ButtonTest extends java.awt.Frame
-->javax.swing.JButton b1 = new javax.swing.JButton();;
javax.swing.JButton b2 = new javax.swing.JButton();
javax.swing.JPanel jPanel1 = new javax.swing.JPanel();

mhm?

Solche "Fehler" passieren solchen Faulenzern wie mir, die importe nicht selber schreiben, sondern per Mausklick irgendwas reinimprotieren ohne genau zu schaeun, was da grad vorgeschlagen wird :D ... Verzeiht mir der ordentliche Programmierer solche Unsauberkeiten :oops:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JButton reagiert nicht auf actionListener Java Basics - Anfänger-Themen 15
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
S JButton mit ActionListener Java Basics - Anfänger-Themen 5
S 2 ActionListener 1 JButton, welcher reagiert zuerst Java Basics - Anfänger-Themen 2
Hilde22 Neu Start JButton einfügen Java Basics - Anfänger-Themen 2
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
M JButton setBackground() färbt nicht den ganzen Knopf Java Basics - Anfänger-Themen 4
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
J Jbutton blinkt Java Basics - Anfänger-Themen 5
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
E JButton und JTextField Java Basics - Anfänger-Themen 1
V_Fynn03 Erste Schritte JButton funktioniert nicht trotz richtiger Methode. Java Basics - Anfänger-Themen 17
J Erste Schritte if Abfrage von JButton in 2. Klasse Java Basics - Anfänger-Themen 27
krgewb Icon von JButton ändern Java Basics - Anfänger-Themen 1
P JButton -Arrays Java Basics - Anfänger-Themen 4
A JButton in anderer Klasse bearbeiten. Java Basics - Anfänger-Themen 2
L Erste Schritte JButton reagiert nicht Java Basics - Anfänger-Themen 5
S Bild über JButton legen Java Basics - Anfänger-Themen 3
V Einem JButton anweisungen geben Java Basics - Anfänger-Themen 4
D Methoden JButton und JLabel in einer Methode erstellen Java Basics - Anfänger-Themen 5
F Interface JButton von anderer Klasse hinzufügen Java Basics - Anfänger-Themen 2
J JButton macht was er will Java Basics - Anfänger-Themen 3
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
H JButton - Wechsel der Textfarbe alle 500ms Java Basics - Anfänger-Themen 10
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1
N JButton anpassen Java Basics - Anfänger-Themen 3
S JButton soll für bestimmte Zeit verschwinden Java Basics - Anfänger-Themen 5
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
D JButton in JDialog mit Action belgen Java Basics - Anfänger-Themen 6
V JButton einer anderen Klasse übergeben? Java Basics - Anfänger-Themen 6
F JButton [] mit Werten hinterlegen Java Basics - Anfänger-Themen 10
M Code um per jButton ein neues Fenster zu öffnen Java Basics - Anfänger-Themen 3
A weiter JButton Fehler Java Basics - Anfänger-Themen 3
W JTable mit einem JButton-Array füllen Java Basics - Anfänger-Themen 4
S JCombobox und JButton verknüpfen Java Basics - Anfänger-Themen 6
V wie kann ich eine Schleife pausieren, bis ein Jbutton gedrückt wird ? Java Basics - Anfänger-Themen 17
N Erste Schritte JButton reagiert nur einmal. Java Basics - Anfänger-Themen 12
S JButton Java Basics - Anfänger-Themen 2
A Farben wechseln mit JButton Java Basics - Anfänger-Themen 2
S Farbe eine Zeile in JTable ändern, wenn JButton geklickt wurd Java Basics - Anfänger-Themen 4
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
A Labels Inner JButton Event Erstellbar? Java Basics - Anfänger-Themen 3
K JButton alles zurücksetzen Java Basics - Anfänger-Themen 1
U JButton: Beschriftung ueber Variable zuweisen Java Basics - Anfänger-Themen 6
S JButton erscheint erst bei Mouseover Java Basics - Anfänger-Themen 10
S JDK installieren JButton BorderPoints?! Java Basics - Anfänger-Themen 7
E Problem mit erben von JButton Java Basics - Anfänger-Themen 7
J Bei Hinzufügen von JButton Programm langsam Java Basics - Anfänger-Themen 3
J Verknüpfung von JButton to JTextField Java Basics - Anfänger-Themen 4
S Jbutton per Passworteingabe aktivieren Java Basics - Anfänger-Themen 2
G über JButton Action einen anderen Button verändern Java Basics - Anfänger-Themen 7
H JButton - Icon(.png) aus resources laden Java Basics - Anfänger-Themen 23
M Hintergrundbild für JButton Java Basics - Anfänger-Themen 6
A jbutton - icon linksbündig, text zentriert Java Basics - Anfänger-Themen 10
M Input/Output JFrame mit JButton und JTextfield Java Basics - Anfänger-Themen 114
J Hilfe bei JButton Java Basics - Anfänger-Themen 6
A JButton[] und String[] in doppelter For-Schleife Java Basics - Anfänger-Themen 4
W JButton in gleiche Größe bringen Java Basics - Anfänger-Themen 4
pg1337 JButton zuschneiden Java Basics - Anfänger-Themen 3
T Modales JDialog schliessen mit JButton Java Basics - Anfänger-Themen 2
D JButton Array setBackground Java Basics - Anfänger-Themen 2
F JButton wie selektierter JTabbebPane-Header Java Basics - Anfänger-Themen 7
G jButton bei Klick String +1 Java Basics - Anfänger-Themen 5
C OOP Java JButton mit Funktion belegen Java Basics - Anfänger-Themen 3
S JButton wird nicht angezeigt Java Basics - Anfänger-Themen 14
C JButton.getIcon() != null Java Basics - Anfänger-Themen 3
E JButton-Text wird in Schleife nicht geändert Java Basics - Anfänger-Themen 4
F welches Layout für JButton-Liste verwenden Java Basics - Anfänger-Themen 6
T JButton Text ändern Java Basics - Anfänger-Themen 4
L JButton erscheint nur mit pack() Java Basics - Anfänger-Themen 3
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
E JButton Hintergrund / Rahmen entfernen? Java Basics - Anfänger-Themen 4
L Bild auf einem JButton Java Basics - Anfänger-Themen 4
K JButton.setText Problem Java Basics - Anfänger-Themen 6
M JButton und DisabledIcon Java Basics - Anfänger-Themen 2
K jButton zur Laufzeit hinzufügen Java Basics - Anfänger-Themen 22
A GUI - JButton problem! Java Basics - Anfänger-Themen 5
M JButton selbst nachprogrammieren Java Basics - Anfänger-Themen 3
A JButton Textrahmen Java Basics - Anfänger-Themen 7
A Platzierung eines JButton Java Basics - Anfänger-Themen 4
D JButton oder ImageIcon klickt "langsam" Java Basics - Anfänger-Themen 5
E JButton klassenübergreifend nutzen? Java Basics - Anfänger-Themen 6
R Liste graphischer Objekte z.B. JButton dynamisch erstellen Java Basics - Anfänger-Themen 13
J JList Inhalt nach JButton Klick aktualisieren Java Basics - Anfänger-Themen 8
S JButton trotz Box-Layout skalieren Java Basics - Anfänger-Themen 6
P JButton identifizieren Java Basics - Anfänger-Themen 8
K Funktion zu einem JButton hinzufügen Java Basics - Anfänger-Themen 27
D HTML Text von jButton disablen Java Basics - Anfänger-Themen 2
E Auf JButton in Arraylist zugreifen Java Basics - Anfänger-Themen 6
E Andere Form eines JButton Java Basics - Anfänger-Themen 17
B JButton Größe einstellen? Java Basics - Anfänger-Themen 3
E Zeilenumbruch in JButton mit Variable Java Basics - Anfänger-Themen 2
A JButton erscheint nicht (BlueJ) Java Basics - Anfänger-Themen 2
M JButton sieht komisch aus :-) Java Basics - Anfänger-Themen 5
B JPanel über JButton umändern Java Basics - Anfänger-Themen 9
D JButton transparent bekommen? Java Basics - Anfänger-Themen 5
H JButton Unsichtbar Java Basics - Anfänger-Themen 7
R JTextField mittels JButton in Konsole ausgeben Java Basics - Anfänger-Themen 2
J Variable die bei JButton Clicks mitzählt Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben