2013-03-09 57 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