メニューを有効または無効にする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」の2つのメニューがあります。最初から、メニュー1は有効で、メニュー2は無効です。
メニュー1には、ほぼ同じことを行う2つの項目があります。メニュー2を有効にし、メニュー項目を追加します。違いは、メニュー2を有効にする前に、一方の項目がメッセージダイアログを表示するのに対し、もう一方の項目は表示しないことです。
次に、プログラムをコンパイルして、これを試してください。
実験1:メニュー1>ポップアップなしを選択します。次にメニュー2をクリックすると、メニューに「新規アイテム」と呼ばれる有効なメニューアイテムがあることがわかります。
実験2:プログラムを閉じます!プログラムを再起動してください。メニュー1>ポップアップ付きを選択します。メッセージダイアログで[OK]をクリックします。メニュー2をクリックすると、メニューに「新規アイテム」と呼ばれる無効なメニューアイテムがあることがわかります。デスクトップ上の他の場所をクリックして、アプリケーションがフォーカスを失うようにします。アプリケーションをクリックします。メニュー2をクリックすると、メニュー項目が有効になっていることがわかります。
実験2では、デスクトップ上の他の場所をクリックするように指示される前に、アプリケーションがフォーカスを失わないことが非常に重要です。そうしないと、問題は発生しません。
2番目の実験でメニュー2のメニュー項目が無効になっているのはなぜですか?これはバグですか?OS X 10.8.2(Mountain Lion)とJava1.7.0_09を使用しています。