2013-05-14 182 views
4

我試圖將我的Java桌面應用程序的組件分成不同的類。例如,我有一個從MainClass調用的創建JMenuBar的MenuBar類。Java事件監聽器

通常,我會在MenuBar類中實現ActionListener,並重寫actionPerformed()以保持組織的一切。但是,如果我這樣做,我怎麼讓MainClass知道點擊了什麼?

我試着實現我自己的ActionListener,但我無法想出一個能夠將事件分派給其他類的解決方案。

MainClass.java

public class MainClass extends JFrame { 

    private static void createAndShowGUI() { 

     JFrame.setDefaultLookAndFeelDecorated(false); 
     JFrame frame = new JFrame("Main Window"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     MenuBar menuBar = new MenuBar(); 
     JMenuBar mb = menuBar.createMenu(); 
     frame.setJMenuBar(mb); 

     frame.setSize(400,400); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
     }); 
    } 

} 

MenuBar.java

public class MenuBar implements ActionListener { 

    public JMenuBar createMenu() { 

     JMenu menu; 
     JMenuItem item; 

     JMenuBar menuBar = new JMenuBar(); 

     menu = new JMenu("Main"); 
     menuBar.add(menu); 

     item = new JMenuItem("New"); 
     menu.add(item); 

     return menuBar; 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JMenuItem source = (JMenuItem)(e.getSource()); 
     System.out.println("Action triggered on: "+source.getText()); 
     // *** Let MainClass know what was clicked ?? 
    } 

} 

編輯

我意識到我可以創建在MainClass一個ActionListener並傳遞到MenuBar類,如下所示:

修訂MainClass.java

ActionListener l = new ActionListener() { 
    public void actionPerformed(ActionEvent ae) { 
    System.out.println(ae.getActionCommand()); 
    } 
}; 

MenuBar menuBar = new MenuBar(); 
frame.setJMenuBar(menuBar.createMenu(l)); 

,然後在菜單欄,我只是應用的ActionListener到每個菜單項。

修訂MenuBar.java

public JMenuBar createMenu(ActionListener l) { 

    item = new JMenuItem("Hide When Minimized"); 
    item.addActionListener(l); 
    menu.add(item); 

} 
+0

+1知道使用invokeLater()啓動gui主線程;那曾經咬我。 –

回答

3

一種可能的解決方案是MainClass implements ActionListener和其實例傳遞給MenuBar.createMenu():

public class MenuBar { 

    public JMenuBar createMenu(ActionListener l) { 
     ... 
     menuItem.addActionListener(l); 
    } 
    ... 
} 

MainClass側:

public class MainClass extends JFrame { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Object source = e.getSource(); 
     System.out.println("Action triggered by: " + source); 
    } 

    private static void createAndShowGUI() { 
     ... 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     MenuBar menuBar = new MenuBar(); 
     JMenuBar mb = menuBar.createMenu(frame); 
     frame.setJMenuBar(mb); 
     ... 
    } 
} 

另一種方式是使用java.beans.PropertyChangeListenerjava.beans.PropertyChangeSupport

+0

謝謝奧賓,好主意。我會嘗試的。我也遇到了類似的建議,包括在MainClass中創建一個新的ActionListener,然後將它傳遞給MenuBar類。請參閱上面的我的**編輯**。 – Marc