3

Macシステムで開発およびテストしているJMenuBarを備えたJFrameがあります。このJFrameで、JMenuの1つを無効にするようにプログラムしました。ただし、フォーカスを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);        
    }
}

これを実行すると、フォーカスを別のウィンドウに切り替えてから元に戻すというアクションでは、有効なプロパティが安定しません。

4

1 に答える 1

3

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);
            }
        });
    }
}
于 2012-12-07T03:36:38.043 に答える