Wie mach ich diesen MouseListener

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hey, und zwar würd ich gerne wissen wie man das am besten macht:

Eine JMenuBar mit einigen JMenus, die wiederum einige JMenuItems enthalten.

Ich könnte jetzt für jedes JMenuItem einen eigenen MouseListener adden, weil man ja aber immer alle Methoden implementieren muss hat man da bei 10 Menüpunkten schon gute 150 Zeilen Source-Code, der sich quasi ständig wiederholt (die meisten der implementierten Methoden braucht man ja eh nicht)

Ich wollte nun einen einzigen Listener für die komplette JMenuBar machen.
Hier mein Versuch:

Code:
        JMenuBar menu = new JMenuBar();
        menu.add(game);     // hat 3 JMenutItems
        menu.add(settings);  // hat 2
        menu.add(help);       // hat 3

        menu.addMouseListener(new MouseListener(){

            public void mouseClicked(MouseEvent e) {

                if (e.getSource() == this.getMenu(0).getItem(0)){
                    
                    // im Menü "game" wurde der erste Menüpunkt geklickt.
                }
                else if ....
                }
            }
       );

allerdings geht es nicht, da er die Methoden "getMenu()" und "getItem()" nicht kennt. Scheinbar ist "this" nicht das richtige, weglassen kann ich's aber auch nicht.

Wie würdet ihr das ganze jetzt lösen? Wie gesagt, ich brauch eigentlich nur die clicked-Methode für alle Items, und würde halt gerne per if-else abfrage dann alles in eine einzige Methode reinhauen und für jeden Menüpunkt halt dann seine Aktionen machen.

Dankeschön
 
hi,
du brauchst keinen MouseListener.
Du kannst jedem JMenuItem ein ActionCommand zuweisen (setActionCommand) und dies dann im implementierten ActionLIstener mit evt.getActionCommand() abfragen.

Eine weitere möglichkeit wäre einfach über die Objekte zu gehen.

sieht etwa so aus:

Code:
...
...
menuItem_ES = new JMenuItem("Einzelspieler");
        menuItem_ES.addActionListener(this);
        menu.add(menuItem_ES);
...
...


public void actionPerformed(ActionEvent e) {
       if (e.getSource().equals(menuItem_ES)) {...}


Gruß

Angelchr
 
hey, irgendwie kann ich keinen ActionListener machen ??

Code:
public class Main extends JFrame{

         public Main(){
         //...

        JMenu help = new JMenu("Hilfe");
        JMenuItem rules = new JMenuItem("Spielregeln");
        help.addActionListener(this);             // fehler: addActionListener cannot be applied to Main
        help.add(rules);
        JMenuItem console = new JMenuItem("Konsole");
        console.addActionListener(this);       // fehler: addActionListener cannot be applied to Main
        help.add(console);

        // Build Menu

        JMenuBar menu = new JMenuBar();
        menu.add(game);
        menu.add(settings);
        menu.add(help);
        add(menu, BorderLayout.NORTH);
        
        // Menu Items Action Listener 
        
        addActionListener( new ActionListener(){ // fehler: cannot find method addActionListener

            public void actionPerformed(ActionEvent arg0) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
            
        });
        }
}

importiert ist alles.
hab auch versucht den Listener an die JMenuBar zu heften, aber irgendwie checkt er das überhaupt nicht, wie verwende ich den denn richtig? wo kann ich den adden?

Danke
 
Erstmal muss das, was du dort als ActionListener hinzufügen willst, auch ein ActionListener SEIN. Und die ActionListener müssen i.a. nicht ans Menu gehängt werden (geht das überhaupt? Grad zu faul, nachzugucken...) Das Menu regelt es schon selbst, dass es aufklappt wenn man draufklickt 😀 Den ActionListener hängt man an die MenuItems.
Code:
public class Main extends JFrame implements ActionListener { 

    public Main()
    {
        JMenu help = new JMenu("Hilfe");
        JMenuItem rules = new JMenuItem("Spielregeln");
        rules.addActionListener(this);             
    }

    public void actionPerformed(ActionEvent e)
    {
        if (e.getActionCommand().equals("Spielregeln")) { zeigeSpielregelnAn(); }
    }

}


Und dort würde ich dir empfehlen, nicht einen riesigen ActionListener für alle zu verwenden, sondern anonyme Listener, die nur die passenden Methoden aufrufen. Also etwa so....
Code:
    public Main()
    {
         //...

        JMenu help = new JMenu("Hilfe");

        JMenuItem rules = new JMenuItem("Spielregeln");
        rules.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                zeigeSpielregelnAn();
            }
        }); 

    }
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben