在JMenu上覆盖actionPerformed

时间:2013-03-09 15:37:10

标签: java swing menu

我正在尝试在用户点击“关于”菜单时显示弹出窗口。 这有可能用Java做吗?我看到单击菜单不会调用actionPerformed。经过一番搜索,我发现我应该尝试使用它:

new AbstractAction("Do XY")

但NetBeans告诉我预期会有一个标识符。有没有其他方法可以做到这一点,或者Java不允许直接在菜单栏上显示按钮?

2 个答案:

答案 0 :(得分: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();
            }
        });
    }
}

答案 1 :(得分:0)

要做到这一点,你可能需要编写自己的菜单栏类。但你可以做这样的伎俩:用mouseClicked()方法编写鼠标监听器。如果您将菜单栏放在顶部,那么您知道它的边界是:0,windowWidth(),~20(菜单栏高度),windowWidth()。然后检查鼠标的位置是否在此矩形中。如果是 - 您将显示弹出窗口。这只是当场的想法,所以让我知道它是否适合你。