[Java] ActionListener für JMenuItem

topfklao

Christoph N.
ID: 118468
L
20 April 2006
885
17
Hallo,

ich komm damit gerade überhaupt nicht mehr weiter:

In einer Klasse Window.java hab ich folgendes Menu, in dem ich dem einen Item einen ActionListener verpassen möchte:

PHP:
JMenuBar  menubar  = new JMenuBar();
JMenu     fileMenu = new JMenu("File");
JMenuItem item= new JMenuItem("will action ausführen!!!!");
               
fileMenu.add(item);
menubar.add(fileMenu);
          
            
        // Add actions:
        fileOpen.setActionCommand("actionname");
        fileOpen.addActionListener(new ActionKlasse(););
      
        setJMenuBar(menubar);
und nun die ActionKlasse:
PHP:
public class ActionKlasse implements ActionListener {
// Konstruktor.. lass ich jetzt mal weg ;)

    @Override
    public void actionPerformed(ActionEvent e) {
        
        
        JMenuItem source = (JMenuItem) e.getSource();

Window window = (Window) source.getTopLevelAncestor();

// doch window ist null :(

}

}
Also soweit klappt eigentlich alles. Die Aktion wird ausgeführt. Nur getTopLevelAncestor() gibt null zurück und ich möchte eigentlich schon auf das window-Objekt zurückgreifen können. Weiß da jemand eine Lösung?? Komm überhaupt nicht mehr weiter.
 
Zuletzt bearbeitet:
Entweder du gibst eine Referenz deiner Window-Klasse an die ActionKlasse

PHP:
fileOpen.addActionListener(new ActionKlasse(this));
und verwendest diese dann dort


PHP:
public class ActionKlasse implements ActionListener 
{
  private Window window;
   public ActionKlasse (Window win)
   {
      this.window = win;
   }
@Override
public void actionPerformed(ActionEvent e) 
{
   ... 
 this.window.doX() //whatever.. 
 }

}
Oder aber, wenn du das ganze vermeiden willst, so ähnlich wie du es auch machst.
Das Problem ist nur, dass deine Quelle (JMenuItem) als Parent ein JPopupMenu hat und dieses hat keinen parent (demnach kann sich getTopLevelAncestor auch nicht bis ganz nach oben hangeln)

Etwa wie folgt sollte es dann gehen:

PHP:
JMenuItem source = (JMenuItem) e.getSource();
JPopupMenu popupMenu = (JPopupMenu) source.getParent();
Component invoker = (JComponent)popupMenu.getInvoker(); 
//das sollte jetz dein Window sein
Window win = (Window)invoker.getTopLevelAncestor();
 
(...)

PHP:
JMenuItem source = (JMenuItem) e.getSource();
JPopupMenu popupMenu = (JPopupMenu) source.getParent();
Component invoker = (JComponent)popupMenu.getInvoker(); 
//das sollte jetz dein Window sein
Window win = (Window)invoker.getTopLevelAncestor();

Danke für deine ausführliche Antwort. Option 1 ist leider in der wirklichen Implementierung nicht möglich.

Option 2 hat noch nicht ganz funktioniert: Es musste noch ein
" JMenuBar test = (JMenuBar) invoker.getParent();
Window window = (Window) test.getTopLevelAncestor();"
ran.. Erst dann war ich beim echten window.. Um Gottes Willen bin ich froh, dass das jetzt endlich läuft!
icon6.gif