2012-02-20 37 views
3

我需要啓發。菜單上的java動作監聽器,而不是菜單項

如何行動的ActionListener事件綁定添加到菜單,而不是綁定到菜單項 這裏是演示代碼,該作品(在菜單項)..

menuFileItem.addActionListener(
      new ActionListener(){ 
       public void actionPerformed(ActionEvent e) 
       { 
        System.out.println("It works"); 
       } 
      } 
     ); 

但是當我嘗試相同,但只是在菜單本身,它不工作!

menuFile.addActionListener(
      new ActionListener(){ 
       public void actionPerformed(ActionEvent e) 
       { 
        System.out.println("Plz work... :("); 
       } 
      } 
     ); 

是否可以添加監聽器到菜單?我教聽衆可以添加到一切。

回答

15

您可以將ActionListener添加到JMenu,因爲此方法從AbstractButton繼承。 (JMenu Documentation)

JMenu menu = new JMenu("MyMenu"); 
menu.addActionListener(new ActionListener(){...}); 

但是,它不打算這樣使用:JMenu ignores ActionEvent。您應該使用MenuEventMenuListener

JMenu menu = new JMenu("MyMenu"); 
menu.addMenuListener(new MenuListener() { 

     @Override 
     public void menuSelected(MenuEvent e) { 
      System.out.println("menuSelected"); 

     } 

     @Override 
     public void menuDeselected(MenuEvent e) { 
      System.out.println("menuDeselected"); 

     } 

     @Override 
     public void menuCanceled(MenuEvent e) { 
      System.out.println("menuCanceled"); 

     } 
    }); 
+0

我這樣做,我declaired菜單,構造函數之前,我創造了它在類的構造函數,當我嘗試實施menu.addActionListener ....它不起作用。 你能提供一個解決方案的例子嗎? – 2012-02-20 09:41:45

+0

你說得對,我只是自己試了一下。編輯我的答案。 – TPete 2012-02-20 09:46:09

+0

作品!謝謝!!我只是更聰明的1方法...:D笑話...真的,真的,我的應用程序將看起來更順利..我開始在幾天前從頭開始工作,從頭開始..所以我在學習階段是正確的現在。再次感謝夥伴!上帝祝福你! :) – 2012-02-20 09:53:59

1

如果實例JMenu類到bulid菜單對象,嘗試該方法利用addMenuListener()。

+0

這聽起來很有趣,你能提供工作的例子嗎?我從來沒有用過這種方法。 – 2012-02-20 09:44:08

+0

當然,以下是您可以完成的代碼。 JMenu menuFileItem = new JMenu(); menuFileItem.addMenuListener( 新MenuListener(){ 公共無效menuSelected(MenuEvent e)取消{ 拋出新UnsupportedOperationException異常( 「但不支持。」);} 公共 無效menuDeselected(MenuEvent e)取消{ 拋出新UnsupportedOperationException異常(」不支持「); } public void menuCanceled(MenuEvent e){ throw new UnsupportedOperationException(」Not supported yet。「); }}); – zari 2012-02-20 09:58:04

1

我使用這個addMouseListener(),因爲當你點擊一個JMenu時,它會將其標記爲藍色,並在之後執行該事件。

我認爲這就是你想要的效果。

這工程,並使用此代碼: 我宣佈:

JMenu jmCadastrar = new JMenu("Cadastrar"); 

jmCadastrar.addMouseListener(new MouseListener() { 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      // TODO Auto-generated method stub 
      System.exit(0); 
     } 
    }); 

} 
1

基於以前的答案,我增加了一個額外的鍵收聽的解決方案。

這裏是一個方便的功能:

public static void bind(JMenu menu, ActionListener listener) { 

     menu.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       listener.actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, "Delegate")); 
      } 
     }); 

     menu.addMenuKeyListener(new MenuKeyListener() { 

      @Override 
      public void menuKeyPressed(MenuKeyEvent e) { 

       if(e.getKeyCode() != KeyEvent.VK_ENTER){ 
        return; 
       } 

       // Find out if the menu is the currently selected menu element 
       MenuElement[] selectionPath = e.getMenuSelectionManager().getSelectedPath(); 

       // Because the JMenu will open a popup menu, the menu is the penultimate element in the path 
       if (selectionPath.length < 2) { 
        return; 
       } 

       MenuElement selectedMenu = selectionPath[selectionPath.length - 2]; 

       if (selectedMenu == menu) { 
        listener.actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, "Delegate")); 
       } 
      } 

      @Override 
      public void menuKeyTyped(MenuKeyEvent e) {} 

      @Override 
      public void menuKeyReleased(MenuKeyEvent e) {} 
     }); 
    }