我有一个带有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属性不稳定。
答案 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);
}
});
}
}