JButton reagiert nicht auf actionListener

CConraths

Aktives Mitglied
Hallo Forum
ich habe mir eine kleine Anwendung zum Üben geschrieben.
Meine Klasse implementiert den ActionListener.
Mein Button bekommt den Actionlistener zugewiesen(addAction Listener(this).
Die Methode actionPerformed wird nach buttonclick aufgerufen this.btn.... ist aber null
????
Hilfe wäre erforderlich :oops:
 
G

Gelöschtes Mitglied 65838

Gast
du übergibst im regelfall eine anonyme klasse ...die klasse ansich implementiert nicht den action listener
 

Jw456

Top Contributor
du übergibst im regelfall eine anonyme klasse ...die klasse ansich implementiert nicht den action listener
wie er schreibst wird er in der Klasse in der der Button ist das ActionListener Interface Implementiert haben und keine anonyme Klasse haben. (implements ActionListener).

@CConraths was meist du mit this.btn.... ist aber null?
zeige mal was du machen willst.
 
G

Gelöschtes Mitglied 65838

Gast
wie er schreibst wird er in der Klasse in der der Button ist das ActionListener interface implenentirt haben und keine anonyme Klasse haben. (implements ActionListener).
das meinte ich ja... dass das schonmal schmarn ist

er präsentiert problem X und hat eine Lösung Y und er versucht das problem bie Y zu lösen obwohl X das eigetnliche problem ist
 

KonradN

Super-Moderator
Mitarbeiter
Also erst einmal ist es vollkommen egal, ob die Klasse selbst ActionListener implementiert oder ob er es als Anonyme Klasse aufbaut: Beides ist komplett Out of Date und führt zu unleserlichem Code. Und es ist nur eine Nebelkerze des eigentlichen Problems:
this.btn.... ist aber null
Da ist die Frage lediglich, wie der Code genau aussieht. Es gibt mehrere triviale Probleme, die sowas hervor rufen würden:
- mehrere Instanzen einer Klasse werden erzeugt und man erwartet Werte einer Instanz in der Anderen.
- Bei der Initialisierung wir etwas in eine lokale Variable geschrieben, die die Instanzvariable verdeckt
- ...

Wenn der TE Code liefern sollte wäre es aber sehr toll, wenn ihm dann bezüglich Action Listener saubere Varianten gezeigt würden und nicht eine veraltete Praxis durch eine andere, ebenso veraltete Praxis ersetzt wird. (Just my 2 Cent)
 

CConraths

Aktives Mitglied
Also erst einmal ist es vollkommen egal, ob die Klasse selbst ActionListener implementiert oder ob er es als Anonyme Klasse aufbaut: Beides ist komplett Out of Date und führt zu unleserlichem Code. Und es ist nur eine Nebelkerze des eigentlichen Problems:

Da ist die Frage lediglich, wie der Code genau aussieht. Es gibt mehrere triviale Probleme, die sowas hervor rufen würden:
- mehrere Instanzen einer Klasse werden erzeugt und man erwartet Werte einer Instanz in der Anderen.
- Bei der Initialisierung wir etwas in eine lokale Variable geschrieben, die die Instanzvariable verdeckt
- ...

Wenn der TE Code liefern sollte wäre es aber sehr toll, wenn ihm dann bezüglich Action Listener saubere Varianten gezeigt würden und nicht eine veraltete Praxis durch eine andere, ebenso veraltete Praxis ersetzt wird. (Just my 2 Cent)
Java:
package zaehlerstaende;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.BorderLayout;

public class buttontest implements ActionListener{   
    private JFrame frame= new JFrame();
    JButton btnSpeichern = new JButton("Speichern");
    
    public static void main(String[] args) {
        buttontest bt = new buttontest();
        bt.fuellen();

    }

    private void fuellen() {
        
        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(this);
        frame.getContentPane().add(btnNewButton, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);       
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == this.btnSpeichern) {     
            frame.pack();
        }
    }

}

zu frame.pack kommt er garnicht ist das == falsch ???
 

KonradN

Super-Moderator
Mitarbeiter
Du hast eine Instanzvariable btnSpeichern. Dieser weist Du einen neuen Button zu, den Du erstellst. Diesen fügst Du aber der Oberfläche nicht hinzu.

Die Methode fuellen erstellt einen neuen Button. Den fügst Du dem Panel hinzu. Diesen Button hast Du aber nur in einer lokalen Variable gespeichert.

Um Deinen Code zum laufen zu kriegen könntest Du den neu erstellten Button in der Instanzvariable speichern:
Java:
package zaehlerstaende;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.BorderLayout;

public class buttontest implements ActionListener{   
    private JFrame frame= new JFrame();
    JButton btnSpeichern; // Hier keine Initialisierung mehr
    
    public static void main(String[] args) {
        buttontest bt = new buttontest();
        bt.fuellen();
    }

    private void fuellen() {
        btnSpeichern = new JButton("New button"); // Hier jetzt speichern des Buttons in Instanzvariable.
        btnSpeichern.addActionListener(this);
        frame.getContentPane().add(btnSpeichern, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);       
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // Hier ist jetzt btnSpeichern gefüllt ...
        if (e.getSource() == this.btnSpeichern) {     
            frame.pack();
        }
    }

}

Aber was ich schon etwas angesprochen habe: Dieser Aufbau ist veraltet. Dieser ganze Aufbao mit Abfrage, welcher Button denn das Event ausgelöst hat und so ist unnötig. Statt dessen kann man z.B. mittels sogenannter Methodenreferenz eine Methode vorgeben:

Du schreibst einfach eine Methode, was eben gemacht werden soll. Die Methode heisst auch so, dass der Name beschreibt, was denn da gerade gemacht wird. Also etwas wie:

Java:
public void endProgram(ActionEvent e) {
    System.exit();
}

Diese Methode kannst Du nun direkt zuweisen:
btnSpeichern.addActionListener(this::endProgram);

Damit dies funktioniert, muss die Methode von den Parametern passend sein. Aber das Beispiel zeigt ja, dass die Methode den Parameter ggf. gar nicht braucht:
Java:
public void endProgram() {
    System.exit();
}

Das kann dann nicht mehr mittels Methodenreferenz sondern statt dessen mit einem Lambda Ausdruck aufgerufen werden:
btnSpeichern.addActionListener(e -> endProgram());

Das wären so die üblichen Wege. Der Vorteil ist hierbei vor allem, dass du eine Methode schreibst, die genau das macht, was der Bezeichner der Methode auch aussagen sollte. Und es wird unnötiger Code vermieden.

Das einfach einmal in Kürze dazu. Methodenreferenz und Lambda Ausdrücke ansonsten einfach einmal nachlesen - dazu gibt es im Netz viele Einführungen.
 
G

Gelöschtes Mitglied 65838

Gast
btnSpeichern.addActionListener(this::endProgram);
das ist nur die kurze version von
btnspeichern.Add..(event->endProgram(event));
und das ist nur die kurz form voneiner anonymen klasse
Java:
btnSpeichern.Add..(new ActionListener(){
    handle...{
        
    }
})
unter veraltet versteht man "soll" man nicht hernehmen... du nimmst aber die anonyme klasse genauso her
 

CConraths

Aktives Mitglied
Also erst einmal ist es vollkommen egal, ob die Klasse selbst ActionListener implementiert oder ob er es als Anonyme Klasse aufbaut: Beides ist komplett Out of Date und führt zu unleserlichem Code. Und es ist nur eine Nebelkerze des eigentlichen Problems:

Da ist die Frage lediglich, wie der Code genau aussieht. Es gibt mehrere triviale Probleme, die sowas hervor rufen würden:
- mehrere Instanzen einer Klasse werden erzeugt und man erwartet Werte einer Instanz in der Anderen.
- Bei der Initialisierung wir etwas in eine lokale Variable geschrieben, die die Instanzvariable verdeckt
- ...

Wenn der TE Code liefern sollte wäre es aber sehr toll, wenn ihm dann bezüglich Action Listener saubere Varianten gezeigt würden und nicht eine veraltete Praxis durch eine andere, ebenso veraltete Praxis ersetzt wird. (Just my 2 Cent)
 
G

Gelöschtes Mitglied 65838

Gast
das ist nur die kurze version von

und das ist nur die kurz form voneiner anonymen klasse
Java:
btnSpeichern.Add..(new ActionListener(){
    handle...{
       
    }
})
unter veraltet versteht man "soll" man nicht hernehmen... du nimmst aber die anonyme klasse genauso her
durch die aussage zweifel ich es nicht an dass die methoden referenz besser ist... aber wenn man nicht weis was dahinter steht dann versteht man auch nicht die referenz
 

CConraths

Aktives Mitglied
hallo nochmal

habe die Version implementiert in der von actionLister des buttons direkt eine Methode mit sprechendem Namen gerufen wird
das mit -> e methodenname() habe ich noch nicht kapiert ist das die Lambda Version ???

macht Spaß aber ist zum Teil harte Kost für mich
danke an euch für die Erklärungen
 
G

Gelöschtes Mitglied 65838

Gast
was halt fancy ist an solchen lambdas, man kann sie nochmal kürzen
in dem man eine Methoden referenz übergibt
dh aus
e->methode(e)
wird
this::methode

weil das "e" ansich doppelt ist
 

KonradN

Super-Moderator
Mitarbeiter
@Joreyk Bitte mache Dich doch erst einmal schlau, ehe Du meinst jemanden angehen zu müssen.

Die Methodenreferen und die Lambda Expression haben nichts mit einer anonymen Klasse zu tun. Das sind absolut unterschiedliche Dinge! Es wird durch die neuen Konsrukte keine anonyme Klasse erzeugt! (Kannst Du z.B. an den nicht vorhandenen KlassenName$1.class und so erkennen!)

Und im Code hat man riesen Unterschiede - Zum einen die Möglichkeit, die Methode abweichend zu benennen und zum anderen die geringere Anzahl an Zeilen. Was ich doch auch geschrieben habe...

genau deswegen meinte ich dass man ohne grundkenntnisse nicht mit der referenz in die tür ffallen soll
f
Und er hat die Methodenreferenz richtig anwenden können. Damit hat es doch etwas gebracht, dass ich dies erwähnt habe. Er hat zwei Möglichkeiten aufgezeigt bekommen, eine davon direkt verstanden und die zweite kann er sich auch noch anlesen ==> Er lernt dazu! Das, wozu das Forum da ist!
 

Oneixee5

Top Contributor
Um das noch mal zu zeigen, folgender Code:
Java:
package playground;

import java.util.Arrays;

public class Play {

    public static void main(final String[] args) {
        Arrays.sort(new String[] {"A", "B"}, String::compareTo);
    }

}
Kompiliert zu: Play.class - keine anonyme Klasse im Package!

Aber folgender Code:
Java:
package playground;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Play {

    public static void main(final String[] args) {

        final MouseListener listener = new MouseListener() {
            @Override
            public void mouseReleased(final MouseEvent e) {}
            @Override
            public void mousePressed(final MouseEvent e) {}
            @Override
            public void mouseExited(final MouseEvent e) {}
            @Override
            public void mouseEntered(final MouseEvent e) {}
            @Override
            public void mouseClicked(final MouseEvent e) {}
        };

        System.out.println(listener);

    }

}
Kompiliert zu: Play.class und Play$1.class - hier wurde eine anonyme Klasse erstellt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Erste Schritte JButton reagiert nicht Java Basics - Anfänger-Themen 5
N Erste Schritte JButton reagiert nur einmal. Java Basics - Anfänger-Themen 12
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
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
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
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
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 JButton mit ActionListener Java Basics - Anfänger-Themen 5
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
A JButton ActionListener nach einmaligem Ausführen zurücksetzen Java Basics - Anfänger-Themen 13
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