Mac上的Java菜单在更改焦点上变灰

时间:2012-12-07 00:12:42

标签: java macos swing jmenu

我有一个带有JMenuBar的JFrame,我正在Mac系统上开发和测试。在这个JFrame上,我编写了一个要禁用的JMenus。但是,当我将焦点从我的Java应用程序更改为计算机上的其他程序然后再回到此JFrame时,会发生奇怪的事情。我发现所有菜单都被禁用了。我还观察到所有菜单都已启用。谁能告诉我这里发生了什么?

这是一段可以重现错误的代码(至少它在我的机器上):

public class MenuProblemExample {

    public static void main(String[] args) {
        System.setProperty("apple.laf.useScreenMenuBar", "true");
        JFrame frame = new JFrame();
        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        fileMenu.add(new JMenuItem("open"));
        menuBar.add(fileMenu);
        JMenu editMenu = new JMenu("Edit");
        editMenu.add(new JMenuItem("select all"));
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        frame.setJMenuBar(menuBar);
        fileMenu.setEnabled(false);
        frame.setVisible(true);        
    }
}

当我运行它时,在将焦点切换到另一个窗口然后再返回的操作下,enabled属性不稳定。

1 个答案:

答案 0 :(得分:3)

应在event dispatch thread上构建和操作Swing GUI对象

根据设计,使用屏幕菜单栏的Mac应用程序会在后台禁用菜单。使用例如应用程序到达前台时,应由您的应用程序正确启用菜单。一个WindowListener

附录:为了进行测试,此修订示例添加了一个切换按钮,用于跟踪File > Open菜单项的状态。

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JToggleButton;

/**
 * @see http://stackoverflow.com/a/13756527/230513
 */
public class MenuProblemExample {

    public static void main(String[] args) {
        System.setProperty("apple.laf.useScreenMenuBar", "true");
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JMenuBar menuBar = new JMenuBar();
                JMenu fileMenu = new JMenu("File");
                final JMenuItem openItem = new JMenuItem("open");
                openItem.setEnabled(false);
                fileMenu.add(openItem);
                menuBar.add(fileMenu);
                JMenu editMenu = new JMenu("Edit");
                editMenu.add(new JMenuItem("select all"));
                menuBar.add(fileMenu);
                menuBar.add(editMenu);
                frame.setJMenuBar(menuBar);
                frame.add(new JToggleButton(new AbstractAction("Toggle") {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JToggleButton b = (JToggleButton) e.getSource();
                        openItem.setEnabled(b.isSelected());
                    }
                }));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}