将JMenuItem添加到JMenuBar以在菜单中创建切换按钮

时间:2015-02-28 17:07:42

标签: java swing jmenuitem jmenubar

我想要实现的目标是:

image description

图像意味着我想将一些按钮(如JMenuItem)放入应用程序菜单栏(JMenuBar)以允许切换某些操作。所以我写了这样的代码:

        // Start button
        JMenuItem startbut = new JMenuItem();
        startbut.setText("Start");
        startbut.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ToggleAction();
            }
        });
        menuBar1.add(startbut);

但它没有按预期行事:

image description

特别是白色背景令人不安,看起来很破碎。

Java GUI库有数千个选项,所以我认为必须有更有效的方法来实现这一点。我该怎么办?

1 个答案:

答案 0 :(得分:2)

只需在评论中总结讨论内容,您就可以在菜单栏中添加JToggleButton,而不是添加JMenuItem,如下所示:

Action toggleAction = new AbstractAction("Start") {
    @Override
    public void actionPerformed(ActionEvent e) {
        AbstractButton button = (AbstractButton)e.getSource();
        if (button.isSelected()) {
            button.setText("Stop");
            // Start the action here
        } else {
            button.setText("Start");
            // Stop the action here
        }
    }
};

JMenuBar menuBar = new JMenuBar();
menuBar.add(new JMenu("Settings"));
menuBar.add(new JToggleButton(toggleAction));

正如@mKorbel指出的那样,菜单栏是一个容器,因此我们可以向其中添加组件,而不仅仅是JMenu

JToggleButton in a JMenuBar

另一方面,使用JToolBar代替菜单栏是另一种选择。从最终用户的角度来看,放置在工具栏中的按钮比放置在菜单栏中的按钮更自然,因此值得考虑这种方法。像这样的东西会成功:

JToolBar toolBar = new JToolBar();
toolBar.add(new JButton("Settings"));
toolBar.add(new JToggleButton(toggleAction)); // Here 'toggleAction' is the same than the previous one

此代码段将产生类似于菜单栏的结果:

JToggleButton in a JToolBar

注意

请注意,必须使用相应的JFrame方法将菜单栏添加到顶级容器(JDialogsetJMenuBar(...))。这与JToolBar不同,{{1}}必须像任何其他组件一样添加到内容窗格中。请参阅this related topic