2013-03-09 51 views
0

我試圖讓用戶在關於菜單上單擊時彈出一個窗口。 在Java中可以做到嗎?我看到單擊菜單不會調用actionPerformed。有點搜索後我發現我應該嘗試使用此:override action在JMenu上執行

new AbstractAction("Do XY")

但NetBeans的告訴我,一個標識符的預期。有沒有其他的方式來做到這一點,或者Java不允許直接在菜單欄上使用按鈕?

回答

3

當然,你可以用Java來做到這一點。您可以簡單地將MenuListener添加到您的菜單中。

這裏有這樣的事情爲例(它也實現了傳統的「關於」菜單項):

import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 
import javax.swing.event.MenuEvent; 
import javax.swing.event.MenuListener; 

public class TestAboutMenu { 

    protected void initUI() { 
     final JFrame frame = new JFrame("test"); 
     JMenuBar bar = new JMenuBar(); 
     JMenu help = new JMenu("Help"); 
     help.addMenuListener(new MenuListener() { 

      @Override 
      public void menuSelected(MenuEvent e) { 
       showAboutDialog(frame); 
      } 

      @Override 
      public void menuDeselected(MenuEvent e) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void menuCanceled(MenuEvent e) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     JMenuItem about = new JMenuItem(new AbstractAction("About") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       showAboutDialog(frame); 
      } 
     }); 
     help.add(about); 
     bar.add(help); 
     frame.setJMenuBar(bar); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 

    protected void showAboutDialog(final JFrame frame) { 
     JDialog dialog = new JDialog(frame); 
     dialog.add(new JLabel("About this program")); 
     dialog.setModal(true); 
     dialog.pack(); 
     dialog.setLocationRelativeTo(frame); 
     dialog.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new TestAboutMenu().initUI(); 
      } 
     }); 
    } 
} 
+0

+1,忘記了MenuListener。 – camickr 2013-03-09 20:12:14

0

要做到這一點,你會需要編寫自己的菜單欄類。但是你可以做這樣的訣竅:用mouseClicked()方法編寫鼠標監聽器。如果你把菜單欄放在最上面,那麼你知道它的界限是:0,windowWidth(),〜20(菜單欄高度),windowWidth()。然後你檢查鼠標的位置是否在這個矩形中。如果是 - 你會彈出窗口。這只是當場的想法,所以讓我知道它是否適合你。

+0

是有沒有辦法來覆蓋僅此對象的菜單功能? – 2013-03-09 15:56:53

+0

不幸的是我不知道。你可以自己做實驗,但我認爲這種檢測鼠標點擊位置的解決方案是實現目標的最簡單方法。 – 2013-03-09 15:58:51