Mehrere Buttons mit einem ActionListener abdecken

favas

Mitglied
Hallo,
ich bin dabei Java zu lernen und habe mir nun vorgenommen mittels Java Swing ein paar grafische Komponenten auszutesten. Dabei bin auf JMenu gestoßen. Meine eigentliche Frage ist wie ich es hin bekomme, dass ich mit nur einem ActionListener alle JMenuIcons abdecke, ich schaffe es zwar diese zu verbinden aber weiß nicht wie je nach Quelle etwas anderes passieren soll.

Java:
package pack1;

// import declarations

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Fenster {

    // variables
    private JMenuBar mb;
    private JFrame fenster;
    private JMenu[] m;
    private String[] namen = {"File","Edit", "Search"};
    private JMenuItem[][] mi = {{new JMenuItem("New"), new JMenuItem("Open File"), new JMenuItem("Close")},
                                {new JMenuItem("Copy"), new JMenuItem("Paste"), new JMenuItem("Delete")},
                                {new JMenuItem("File"), new JMenuItem("Java"), new JMenuItem("Remote")},
                                };
    private ActionListener[] al=    {new MeinActionListener()};

   
    //method
    public void FensterMachen() {
   
   
    fenster = new JFrame();
    fenster.getContentPane().setBackground(Color.cyan);
    fenster.setSize(500,500);
   
   
    mb = new JMenuBar();
    m = new JMenu[3];
   
    for(int i = 0 ; i<m.length;i++) {
        mb.add(m[i] = new JMenu("" + namen[i]));
       
        for(int j = 0; j<3;j++) {
            m[i].add(mi[i][j]);
        mi[i][j].addActionListener(al[0]);
        }
       
    }
   
    fenster.setJMenuBar(mb);
    fenster.setVisible(true);
   
    }

    //Listener
    public class MeinActionListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent arg0) {
            Object quelle = arg0.getSource();
   
        }
       
    }
   
}
 

Java xyrse123

Bekanntes Mitglied
Mit getActionCommand kannst du den Namen der gekilckten Komponente herausfinden.

Java:
class MeinActionListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent arg0) {
           String action = arg0.getActionCommand();
 
           if(action.equals("File")) {        
           }
        
           if(action.equals("Open")) {         
           }
        
        }
 
 }
 
Zuletzt bearbeitet:
X

Xyz1

Gast
@favas Beschreib doch büdde nochmal genau was Du willst....
Hast Du schonmal von Casten gehört?
Du kannst die Rückgabe von .getSource() casten.
 

Robat

Top Contributor
Kannst auch einfach mit einer switch-case die einzelnen Fälle abdecken. (oder eben mit if-else)
Java:
@Override
public void actionPerformed(ActionEvent e) {
    switch(e.getSource()) {
        case menuItem1:
             doSomething();
             break;
        case menuItem2:
             doSomething2();
             break;
        ...
    }
}
Du kannst die Rückgabe von .getSource() casten.
Und dann?

Na weil sich der Text des Button immer ändern kann
Dann macht man eben Konstanten draus. Dann ist es egal ob die sich ändern.
 
X

Xyz1

Gast
Fachsimpeln ist ja okay .. sollte dann aber auch zum Thema passen.
Gibt es hier noch welche Fragen? Bad practice und Gründe habe ich genannt.
Auch der konstruktive Lösungsvorschlag (good practice) ist dabei.


sehe hier auch keinen Grund, zu casten.
Im Nachfolgendem wird er sicher auf Attribute des Button greifen wollen.


casten verändert den dynamischen Typ nicht
Grundl. nachlesen bitte.
 

Meniskusschaden

Top Contributor
Grundl. nachlesen bitte.
Was soll man da denn noch nachlesen? Kann man doch einfach ausprobieren:
Java:
    public static void main(String[] args) {
        Object object = new JButton();
        System.out.println(object.getClass());
        JButton button = (JButton)object;
        System.out.println(button.getClass());
    }
Ausgabe:
Code:
class javax.swing.JButton
class javax.swing.JButton
 

Blender3D

Top Contributor
Meine eigentliche Frage ist wie ich es hin bekomme, dass ich mit nur einem ActionListener alle JMenuIcons abdecke, ich schaffe es zwar diese zu verbinden aber weiß nicht wie je nach Quelle etwas anderes passieren soll.
Code:
..
 item.setActionCommand("hallo");
..
Code:
..
public void actionPerformed(ActionEvent e) {
if ( e.getActionCommand().equals("hallo") )
..
Das wäre eine Möglichkeit
 

mrBrown

Super-Moderator
Mitarbeiter
Da ja auf die Frage schon antworten kamen, warum willst du denn alle Menü-Einträge mit einem ActionListener abdecken?
 

favas

Mitglied
Ok, vielen Dank schon mal
Ich war einfach dabei die Sachen ein bisschen auszuprobieren und dachte, dass man mit einem ActionListener für alle Buttons vielleicht weniger schreiben muss, aber das scheint ja dann wohl nicht so zu sein.
Dann noch eine Frage, ist es besser (oder schöner) für jeden Button einen eigenen Listener zu erstellen?
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Als Neuling habe ich auch einen einzelnen ActionListener bevorzugt. Mittlerweile bin ich auf die Anonyme Klassenvariante umgestiegen als favorisierte Vorgehensweise. Mit Lambda kannst du es verkürzt so schreiben:

Java:
button.addActionListener(e -> {
            // tu etwas
        });
 

favas

Mitglied
Vielen Dank euch allen,
Mittlerweile bin ich auf die Anonyme Klassenvariante umgestiegen als favorisierte Vorgehensweise. Mit Lambda kannst du es verkürzt so schreiben:
Interessant, das werde ich mir auf jeden Fall genauer anschauen:)
dann hab ich zunächst keine weiteren Fragen mehr.
 

Neumi5694

Top Contributor
Letztendlich ist das alles Geschmackssache. Das ActionCommand ist dann eine gute Alternative, wenn die Quelle nicht wichtig ist, wenn du z.B. einen Toolbar-Button UND ein Menu hast, die beide den "Datei Öffnen" Dialog aufrufen sollen.
Mit getSource() kriegst du hingegen das Objekt geliefert, von welchem aus der Event erstellt wurde.
Mit Lambdas weist du jedem Button mit relativ wenig Schreibaufwand einen eigenen Listener zu, das ist die direkteste Methode. Allerdings heißt das auch, dass du den Code für jeden Listener in der Methode hast, in der die Buttons initialisiert werden.
Ich hab das gern getrennt, deswegen verwende ich eine Methode außerhalb der Initialisierungsmethode als Listener (wird mit addActionListener(this::myMethodWhichAccepptsAActionCommand) zugewiesen.
In der Methode frage ich dann einfach mit getSource die Quelle ab.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich nutze einfach eine eigene Methode pro möglicher Aktion, die wird dann den entsprechenden Buttons als Methodenreferenz übergeben.

Alles liegt dann in Methoden, die machen jeweils genau eine Sache und man muss weder mit Source noch ActionCommands rumhantieren.

(Mit JavaFX und FXML hält man dann auch noch die Zuordnung aus dem Code raus)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Listener für mehrere Buttons Java Basics - Anfänger-Themen 3
G MouseListener für mehrere Buttons Java Basics - Anfänger-Themen 11
P OnClickListener für mehrere Buttons Java Basics - Anfänger-Themen 5
R mehrere Buttons erstellen Java Basics - Anfänger-Themen 5
G mehrere Buttons mit Methode erstelen, was ist falsch? Java Basics - Anfänger-Themen 8
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
Buroto Klassen Mehrere .txt Datein verbienden und anschließend auslisten Java Basics - Anfänger-Themen 10
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
Kotelettklopfer Mehrere Projekte in einem Git verwalten Java Basics - Anfänger-Themen 10
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
M mehrere Rückgabenwerte aus Methode Java Basics - Anfänger-Themen 7
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
R Mehrere Buchstaben aus einem String entfernen Java Basics - Anfänger-Themen 1
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
C Mehrere Zufallswerte Java Basics - Anfänger-Themen 4
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
R Error, wenn mehrere Clients gleichzeitig die Verbindung beenden Java Basics - Anfänger-Themen 16
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
Henri Mehrere Ordner umbenennen Java Basics - Anfänger-Themen 11
E Mehrere Arrays addieren mit Übertrag Java Basics - Anfänger-Themen 13
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
J Mehrere paintComponenten in einem Programm Java Basics - Anfänger-Themen 0
B Jeweils den Parent bekommen -> mehrere Ebenen Java Basics - Anfänger-Themen 2
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
L Mehrere Jars im Unterordner Java Basics - Anfänger-Themen 2
L LibGDX - mehrere Screens Java Basics - Anfänger-Themen 1
J Sudoku mehrere Lösungen Java Basics - Anfänger-Themen 29
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
T Mehrere JFrames gleichzeitig öffnen Java Basics - Anfänger-Themen 6
O Erste Schritte Scanner mehrere male benutzen (Konsole) Java Basics - Anfänger-Themen 7
S mehrere If Bedingungen Java Basics - Anfänger-Themen 5
F Mehrere Zeilen zu einer Zeile zusammenfügen und in eine Datei schreiben Java Basics - Anfänger-Themen 1
B Mehrere Zahlen speichern Java Basics - Anfänger-Themen 60
M mehrere extends? Java Basics - Anfänger-Themen 19
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
C ButtonController löst mehrere Methoden aus Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
F mehrere eingegebene Zahlen mit Zahlen von 1-9 multiplizieren Java Basics - Anfänger-Themen 18
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
J Mehrere Eingabefelder programmiert (Zeigt Fehler an) Java Basics - Anfänger-Themen 6
Jinnai4 Mehrere Textfelder überprüfen Java Basics - Anfänger-Themen 16
N Mehrere Forms auf einem Panel Java Basics - Anfänger-Themen 6
Tommy Nightmare Variable auf mehrere Ungleichheiten prüfen Java Basics - Anfänger-Themen 18
D Mehrere Objekte in ein Objekt zusammenfassen Java Basics - Anfänger-Themen 16
D Input/Output Mehrere Befehle nacheinander ausführen Java Basics - Anfänger-Themen 20
K Mehrere Objekte anlegen Java Basics - Anfänger-Themen 23
N Integers aus Textdatei auslesen und mehrere Arrays erstellen Java Basics - Anfänger-Themen 9
S Verständnis - Frage mehrere SQL Statements in While Schleife Java Basics - Anfänger-Themen 0
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
J Mehrere IF Anweisungen und dazugehörige ELSE Java Basics - Anfänger-Themen 6
I Klassen Mehrere Java Klassen in einer .java Datei Java Basics - Anfänger-Themen 7
V Mehrere Dateien aus JFileChooser in eine ArrayList speichern Java Basics - Anfänger-Themen 2
F Mehrere Konstruktoren Java Basics - Anfänger-Themen 10
A Mehrere Radiobuttons Java Basics - Anfänger-Themen 3
B Klassen Mehrere Objekte mit Schleife erstellen - How? Java Basics - Anfänger-Themen 1
T Mehrere Methoden in der main-Methode verknüpfen und aufeinander anwenden Java Basics - Anfänger-Themen 2
V OOP Aufnahme von Dreiecken in ein/mehrere Objekte Java Basics - Anfänger-Themen 0
Q OOP Mehrere Instanzen auf ein Feld Java Basics - Anfänger-Themen 13
C Klasse auf mehrere Objekte zugreifen lassen Java Basics - Anfänger-Themen 26
G Mehrere If-else-Sätze der Reihe nach durchlaufen lassen Java Basics - Anfänger-Themen 2
K Mehrere String.valueOf() kürzer schreiben / "packen"? Java Basics - Anfänger-Themen 2
F String mehrere male ausgeben? Java Basics - Anfänger-Themen 4
H wie mehrere variablen in einfacher for-schleife? Java Basics - Anfänger-Themen 2
H möglichkeiten für for-schleife? (mehrere ausgangsvariablen?) Java Basics - Anfänger-Themen 9
M PdfBox - mehrere Formularseiten Java Basics - Anfänger-Themen 2
Z Mehrere XML-Dateien zu einer zusammenfügen Java Basics - Anfänger-Themen 3
M GUI- mehrere Komponenten auf Container adden Java Basics - Anfänger-Themen 2
I Erste Schritte Resource Bundle - Alles in einem File oder mehrere? => Faktor Performance Java Basics - Anfänger-Themen 2
F Methoden split() - Mehrere Zeichen Java Basics - Anfänger-Themen 5
F Erste Schritte Mehrere nextInt() Eingaben nebeneinander ausgeben Java Basics - Anfänger-Themen 12
A mehrere Panels in eigenen Klasssen in einem Frame Java Basics - Anfänger-Themen 16
A Mehrere 100.000 Elemente verlgeichen Java Basics - Anfänger-Themen 8
T Compiler-Fehler Mit Array und "for" mehrere ImageIcon erstellen Java Basics - Anfänger-Themen 7
N Mehrere berechnungen auf einem Button legen? Java Basics - Anfänger-Themen 19
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Speicherlast mehrere GB durch kleine png files? Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben