我有一个 Java 程序,可以在其中启用和禁用菜单。它在 Windows 下运行良好,但在 Mac 上运行时我遇到了一些问题。
这是一段演示该问题的代码:
import javax.swing.*;
import java.awt.event.*;
public class PopTest extends JFrame {
JMenu menu1;
JMenu menu2;
public PopTest() {
menu1 = new JMenu("Menu 1");
menu2 = new JMenu("Menu 2");
menu2.setEnabled(false);
menu1.add(new JMenuItem(new AbstractAction("With popup") {
public void actionPerformed(ActionEvent event) {
JOptionPane.showMessageDialog(PopTest.this,"Popup","Popup",JOptionPane.ERROR_MESSAGE);
menu2.setEnabled(true);
menu2.add(new JMenuItem("New item"));
}
}));
menu1.add(new JMenuItem(new AbstractAction("Without popup") {
public void actionPerformed(ActionEvent event) {
menu2.setEnabled(true);
menu2.add(new JMenuItem("New item"));
}
}));
JMenuBar menuBar = new JMenuBar();
menuBar.add(menu1);
menuBar.add(menu2);
setJMenuBar(menuBar);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 200);
setVisible(true);
}
public static void main(String[] args) {
try {
System.setProperty("apple.laf.useScreenMenuBar", "true");
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e) {
System.out.println("Exception: " + e.getMessage());
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new PopTest();
}
});
}
}
这就是程序的作用:
该程序有两个菜单,“菜单 1”和“菜单 2”。从一开始,菜单 1 被启用,而菜单 2 被禁用。
菜单 1 有两个项目几乎做同样的事情:它们启用菜单 2 并向其中添加一个菜单项。不同之处在于其中一项在启用菜单 2 之前显示消息对话框,而另一项则不显示。
现在,编译程序并试试这个:
实验 1:选择Menu 1 > without popup。现在单击菜单 2,您将看到菜单有一个启用的菜单项,称为“新项目”。
实验 2:关闭程序!再次启动程序。选择菜单 1 > 弹出菜单。在消息对话框中单击确定。现在单击菜单 2,您将看到该菜单有一个禁用的菜单项,称为“新项目”。单击桌面上的其他位置,使应用程序失去焦点。在应用程序中单击。单击菜单 2,您将看到该菜单项现已启用。
在实验 2 中,在您被指示单击桌面上的其他位置之前,应用程序不会失去焦点,这一点非常重要。否则你将看不到问题。
为什么在第二个实验中菜单 2 中的菜单项被禁用?这是一个错误吗?我正在使用 OS X 10.8.2 (Mountain Lion) 和 Java 1.7.0_09。