ActionListener Source vergleichen

Tarnpflanze

Mitglied
Hallo

Ich möchte in meinem Taschenrechner abfragen, welcher JButton gedrückt wird. Ich habe die Methode "getSource()" verwendet und es sollte, wenn ich den Button "nr1" drücke dem String "zeichen" die Zahl 1 reinschreiben. Jedoch kommt es immer beim "if-Code" zu else.

Wieso das?

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;


public class DerListener implements ActionListener{
    
    String zeichen;
    JLabel eingabe;
    JButton nr1, nr2, nr3, nr4, nr5, nr6, nr7, nr8, nr9, nr0, punkt, negation,
            clear, klammerAuf, klammerZu;
    
    DerListener(String zeichen){
        this.zeichen = zeichen;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        
        Object source = e.getSource();
        
        if(source == nr1){
            zeichen += "1";
        }else{
            zeichen += "";
        }
    }
}

Ich habe in einer anderen Klasse, bei der ich die Buttons erstellt habe, den ActionListener dem Button hinzugefügt mit der Zeile:

Java:
nr1.addActionListener(new DerListener(zeichen));
 

senior.weber

Mitglied
Ich habe in einer anderen Klasse, bei der ich die Buttons erstellt habe

Ist der Button also eine andere Instanz ? Damit das funktioniert, müsstest du wohl sowas schreiben:

Code:
DerListener listener = new DerListener(zeichen);
listener.nr1 = nr1;
nr1.addActionListener(listener);
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Alle deine JButton Instanzen sind nicht initialisiert und somit null (es sei denn, sie werden von außerhalb der Klasse initialisiert, was, da sie nicht private sind, durchaus möglich wäre). Der Vergleich auf Identität mit irgendeinem anderen Objekt liefert deshalb immer false.
 

Tarnpflanze

Mitglied
(es sei denn, sie werden von außerhalb der Klasse initialisiert, was, da sie nicht private sind, durchaus möglich wäre)


Wie kann ich meine Buttons denn initialisieren? Ich habe bemerkt, über den Konstruktor "DerListener" kann ich nicht mehrere Datentypen übergeben.

(Wahrscheinlich ist es komplett einfach. Aber dies ist mein 1. Projekt, welches ich programmiere)
 

Harry Kane

Top Contributor
Wie kann ich meine Buttons denn initialisieren? Ich habe bemerkt, über den Konstruktor "DerListener" kann ich nicht mehrere Datentypen übergeben.
Da die Klasse "DerListener" von dir ist, kannst du den mit Parametern versehen, wie du willst. Ich würde aber davon abraten, alle JButtons in deiner Listener-Klasse zu initialisieren (so wie von Senior.Weber beschrieben).
Ich versuche Listenern immer so zu programmieren, daß sie alle Objekte möglichst genau kennen, mit denen sie arbeiten sollen, aber auch nur die. Das ganze sieht dann z. B. so aus:
Java:
public class ParametrizedActionListener {

    public static void main(String[] args) {
        JFrame main = new JFrame("Demo");
        JTextField tf = new JTextField();
        main.add(tf, BorderLayout.NORTH);
        JPanel grid = new JPanel();
        grid.setLayout(new GridLayout(3, 3));
        HashMap<JButton, String> map = new HashMap<JButton, String>();
        TextAppender ta = new TextAppender(tf, map);
        for (int i = 1; i < 10; i++) {
            String s = String.valueOf(i);
            JButton jb = new JButton(s);
            map.put(jb, s);
            jb.addActionListener(ta);
            grid.add(jb);
        }
        main.add(grid);
        main.pack();
        main.setVisible(true);
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    static class TextAppender implements ActionListener {

        private JTextField target;
        private Map<JButton, String> map;

        TextAppender(JTextField target, Map<JButton, String> map) {
            this.target = target;
            this.map = map;
        }

        public void actionPerformed(ActionEvent ae) {
            if (!(ae.getSource() instanceof JButton)) {
                return;
            }
            JButton jb = (JButton) ae.getSource();
            String text = map.get(jb);
            if (text != null) {
                target.setText(target.getText() + text);

            }
        }
    }

}
 

senior.weber

Mitglied
Hallo,

Lieber "Henry Kane", warum würdest du

davon abraten, alle JButtons in deiner Listener-Klasse zu initialisieren (so wie von Senior.Weber beschrieben).

- das ist doch gar nicht, was mein Code macht. Er setzt nur den Variablenpointer nr1 auf einen offensichtlich bereits initialisierten Button "nr1". Was genau ist daran problematisch?

- Einen Listener zu bauen, dem man eine Map mit JButtons übergibt, die dann die Information "Text auf dem JButton" redundanterweise beinhaltet - ist imo Blödsinn^2 :) - diese Info bekomm man ja auch über getText()



Hier mal ein sehr gutes Tutorial:

ActionEvent und ActionListener


Das hat den ActionListener in der Klasse definiert, in der auch die Buttons übergeben werden - das hat den Vorteil, dass der Listener alle Komponenten "kennt", aber den Nachteil, dass der Listener nicht woanders verwendet werden kann. Aber für deinen Anwendungsfall wäre es imo völlig in Ordnung.

Als anderer Ansatz könntest du auch JButton#setName(String name) in Swing verwenden, um Aktionen bei bestimmten Buttons (unabhängig vom angezeigten Text auf dem Button) auszuführen:

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
 
 
public class DerListener implements ActionListener{
 
    String zeichen;

    /*dieser Konstruktor macht keinen Sinn, da Strings immutable sind
DerListener(String zeichen){
        this.zeichen = zeichen;
    }*/

  public String getActualString(){
     return zeichen;
  }
 
    @Override
    public void actionPerformed(ActionEvent e) {
 
        JButton source = (JButton) e.getSource();
 
        if(source.getName().equals("nr1")){
            zeichen += "1";
        }else{
            zeichen += "";
        }

        //oder zb
        zeichen+=source.getName();//name ist auf "1" gesetzt
    }
}
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
- das ist doch gar nicht, was mein Code macht. Er setzt nur den Variablenpointer nr1 auf einen offensichtlich bereits initialisierten Button "nr1". Was genau ist daran problematisch?

- Einen Listener zu bauen, dem man eine Map mit JButtons übergibt, die dann die Information "Text auf dem JButton" redundanterweise beinhaltet - ist imo Blödsinn^2 :) - diese Info bekomm man ja auch über getText()
Zu 1: Beschäftige dich mal mit dem Unterschied zwischen "Deklaration" und "Initialisierung". Und ich halte es für sinnlos, in einer Klasse 9 JButtons nr1 bis nr9 zu deklarieren und initialisieren und in einer 2. Klasse dasselbe zu tun. Im günstigsten Fall ist das überflüssige Tipparbeit. In einem ungünstigeren Fall erzeugt man dadurch ein zu enge Kopplung zwischen den beteiligten Klassen. Dann kann man gleich alles in eine Klasse klatschen.
Zu 2: Prinzipiell ein korrekter Einwand. Ich finds nur grundätzlich etwas heikel, basierend auf dem Text von JButtons eine Logik aufzubauen. Wenn später die Zahlen durch Icons dargestellt werden sollen, oder wenn bei Drücken einer Taste nicht mehr Zeichen in ein JTextField eingetragen werden sollen, sondern z. B. Funktionen auf einen Stack (immerhin gings hier um einen Taschenrechner), funktioniert das nicht mehr. Wenn man eine Map verwendet, müsste man die Deklaration der Map natürlich anpassen und die Logik im Listener, aber das "Grundgerüst" bliebe bestehen.


Das "sehr gute" Tutorial hat absolutes Einsteigerniveau. Wenn ich schon lese "class XYZ extends JFrame implements ActionListener" - kein Kommentar. Die gezeigten Beispiele sind übrigens für die eigentliche Problematik (das es nämlich mehrere JButtons gibt und je nach JButton ähnliche Aktionen ausgelöst werden sollen) eher irreführend. Es kann doch nicht dein Ernst sein, für 9 JButtons eine 9-stufige If-else-Abfrage zu empfehlen.


Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
 
 
public class DerListener implements ActionListener{
 
    String zeichen;

    /*dieser Konstruktor macht keinen Sinn, da Strings immutable sind
DerListener(String zeichen){
        this.zeichen = zeichen;
    }*/

  public String getActualString(){
     return zeichen;
  }
 
    @Override
    public void actionPerformed(ActionEvent e) {
 
        JButton source = (JButton) e.getSource();
 
        if(source.getName().equals("nr1")){
            zeichen += "1";
        }else{
            zeichen += "";
        }

        //oder zb
        zeichen+=source.getName();//name ist auf "1" gesetzt
    }
}
Dein Kommentar zu dem Konstruktor von DerListener macht für mich keinen Sinn. Wenn man den Konstruktor so wie du empfiehlst, auskommentiert, fliegt eine NPE, sobald auf zeichen zugegriffen wird. S. o.: Schau dir die Basics zu Deklaration und Initialisierung an.
 

senior.weber

Mitglied
Lieber Harry Kane,

die Frage wurde von einem "absoluten Einsteiger", Tarnpflanze gestellt. Deshalb ist ein Tutorial "auf Einsteigerniveau" genau das Richtige.

Mein beispielhafter Code gibt eine NPE - hier der Fix:

Java:
String zeichen="";

Einsteiger tendieren dazu, zu denken, dass der übergebene String im weiteren Verlauf "geändert wird" - was nicht der Fall ist. Um dem zu entgehen, habe ich den Konstruktor auskommentiert. Falls seine Intention war "'zeichen' ist der String bevor ich weitere Zeichen anhänge" - OK, kann man so machen - jedoch sieht man in seinem Code nicht, wo er den am Ende erstellten String (+= 1) weiter verwendet.

Beste Grüße
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
E ActionListener Java Basics - Anfänger-Themen 4
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
U HILFE! - per ActionListener Felder enablen....... Java Basics - Anfänger-Themen 5
C JButton reagiert nicht auf actionListener Java Basics - Anfänger-Themen 15
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
J Array Actionlistener Java Basics - Anfänger-Themen 9
J ActionListener von JCheckBox im Knoten von JTree funktioniert nicht Java Basics - Anfänger-Themen 2
P Erste Schritte ActionListener Java Basics - Anfänger-Themen 2
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
krgewb ActionListener Java Basics - Anfänger-Themen 1
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
T Konsolenscanner startet nicht durch Aufruf von Actionlistener Java Basics - Anfänger-Themen 4
F ActionListener mit Files etc Java Basics - Anfänger-Themen 12
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
CptK Auf ActionListener von anderer Klass aus zugreifen Java Basics - Anfänger-Themen 5
F Mehrere Buttons mit einem ActionListener abdecken Java Basics - Anfänger-Themen 24
U ActionListener mit JMenuItems verknüpfen Java Basics - Anfänger-Themen 1
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
L Problem bei Java-ActionListener Java Basics - Anfänger-Themen 4
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
D Einen Wert unter einen ActionListener weitergeben Java Basics - Anfänger-Themen 1
T Übernahme einer Variablen im ActionListener/ActionEvent Java Basics - Anfänger-Themen 2
JavaNewbie2.0 ActionListener Java Basics - Anfänger-Themen 11
Voreck Actionlistener problem Java Basics - Anfänger-Themen 1
G Im ActionListener eine "äußere" Variable verändern Java Basics - Anfänger-Themen 13
T Fehler beim ActionListener Java Basics - Anfänger-Themen 2
M public static int in ActionListener Java Basics - Anfänger-Themen 6
S actionlistener timer Java Basics - Anfänger-Themen 9
J Interface ActionListener in eigener Klasse Java Basics - Anfänger-Themen 27
P aus ActionListener auf HauptFrame zugreifen Java Basics - Anfänger-Themen 4
A Klassen Bool Actionlistener Java Basics - Anfänger-Themen 2
K Methoden ActionListener wird übersprungen Java Basics - Anfänger-Themen 3
S actionlistener Java Basics - Anfänger-Themen 29
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
J ActionListener Java Basics - Anfänger-Themen 5
A ActionListener Java Basics - Anfänger-Themen 9
R Problem mit ActionListener für Buttons Java Basics - Anfänger-Themen 5
Z ActionListener wird nicht erkannt? Java Basics - Anfänger-Themen 5
T Frage zum ActionListener Java Basics - Anfänger-Themen 5
R ActionListener mit for Schleife füllen. Java Basics - Anfänger-Themen 4
K Button's mit versch. Aufgaben/ActionListener Java Basics - Anfänger-Themen 12
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
I ActionListener reagiert nicht Java Basics - Anfänger-Themen 6
N Probleme mit ActionListener und Logischer Abfrage Java Basics - Anfänger-Themen 4
D Erste Schritte Buttons mit actionlistener Problem Java Basics - Anfänger-Themen 3
S JButton mit ActionListener Java Basics - Anfänger-Themen 5
S ActionListener, Methoden und Variablen Java Basics - Anfänger-Themen 4
X Variablen Actionlistener | Variablen-namen Java Basics - Anfänger-Themen 5
G ActionListener implementieren Java Basics - Anfänger-Themen 12
T Erste Schritte Berechnete Variable im ActionListener zurückführen Java Basics - Anfänger-Themen 6
D Panel sichtbar/unsichtbar machen im ActionListener Java Basics - Anfänger-Themen 3
U JFrame durch ActionListener erweitern Java Basics - Anfänger-Themen 4
M Button , actionlistener Java Basics - Anfänger-Themen 11
P Erste Schritte JTable mit Daten aus Acces DB füllen und Actionlistener einsetzen Java Basics - Anfänger-Themen 29
M Actionlistener Java Basics - Anfänger-Themen 9
D Problem mit ausgelagertem Actionlistener Java Basics - Anfänger-Themen 4
D KeyListener und ActionListener Problem Java Basics - Anfänger-Themen 6
M Klassen Durch den ActionListener das GUI einer anderen Klasse verändern Java Basics - Anfänger-Themen 8
T NullPointerException im ActionListener Java Basics - Anfänger-Themen 3
C Erste Schritte GUI - ActionListener - Exception Nullpointer Java Basics - Anfänger-Themen 5
Kenan89 ActionListener in eigene Klasse Java Basics - Anfänger-Themen 8
E JMenu ActionListener reagiert nicht? Java Basics - Anfänger-Themen 6
V ActionListener in einer for-Schleife Java Basics - Anfänger-Themen 2
S Erste Schritte ActionListener auf Buttons einrichten Java Basics - Anfänger-Themen 3
M Variablen Variable lässt sich durch ActionListener nicht ändern Java Basics - Anfänger-Themen 5
P ActionListener Action Event Java Basics - Anfänger-Themen 5
L ActionListener zerschießt AnchorLayout Java Basics - Anfänger-Themen 8
D ActionListener braucht zwei Klicks auf Button??? Java Basics - Anfänger-Themen 2
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
Y Actionlistener passt nicht zu Dataset Java Basics - Anfänger-Themen 6
W Problem mit FileWriter / ActionListener Java Basics - Anfänger-Themen 6
F actionListener Java Basics - Anfänger-Themen 3
T ActionListener auslagern Java Basics - Anfänger-Themen 14
S Actionlistener funktionieren nicht in der .jar Java Basics - Anfänger-Themen 9
E ActionListener abwarten lassen? Java Basics - Anfänger-Themen 11
E ActionListener in anderer Klasse erkennen Java Basics - Anfänger-Themen 13
H ActionListener Verbesserung möglich? (This) Java Basics - Anfänger-Themen 3
E ActionListener erkennt instanz nicht Java Basics - Anfänger-Themen 9
V ActionListener bei vielen Modulen Java Basics - Anfänger-Themen 3
J ActionListener Java Basics - Anfänger-Themen 2
T JLabel durch ActionListener ändern Java Basics - Anfänger-Themen 4
S ActionListener Java Basics - Anfänger-Themen 4
U actionListener - eine Kleine Frage Java Basics - Anfänger-Themen 7
K Actionlistener Java Basics - Anfänger-Themen 7
M ActionListener außerhalb des EDT ausführen Java Basics - Anfänger-Themen 2
A ActionListener im JMenu - Problem Java Basics - Anfänger-Themen 2
M ActionListener reagiert nicht Java Basics - Anfänger-Themen 4
N ActionListener + GUI Java Basics - Anfänger-Themen 8
H Bewegtes Bild im ActionListener [Problem] Java Basics - Anfänger-Themen 12
D Liste+ActionListener Java Basics - Anfänger-Themen 6
L wie Jframe an ActionListener übergeben Java Basics - Anfänger-Themen 4
U ActionListener und KeyListener - KeyListener funktioniert nicht Java Basics - Anfänger-Themen 2
A JButton ActionListener nach einmaligem Ausführen zurücksetzen Java Basics - Anfänger-Themen 13
Luk10 Problem mit ActionListener Java Basics - Anfänger-Themen 6
R Viereck zeichnen über TextField-Eingabe /ActionListener Java Basics - Anfänger-Themen 9
C ActionListener problem beim starten von programmen Java Basics - Anfänger-Themen 3
C ActionListener problem Java Basics - Anfänger-Themen 4
L Tray-Einträge und dazu passende ActionListener dynamisch erzeugen? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben