3

以前の質問で述べたように、Apple の JVM でいくつかのバグに遭遇しました。そして、最初のバグに対処することができます。しかし、2番目は本当に面倒です。サブメニューを含む JMenu を作成し、実行時にサブメニューの内容を変更する必要がある場合、それを行うことはできません。デバッグすると、項目が Jmenu (サブメニュー) に追加されたことが示されます。しかし、画面のメニューバーでは何も起こっていません。これは、実際の JMenu オブジェクトと Mac OS X メニューバーでの表現の同期の問題のようです。

サンプルコードは次のとおりです。

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;


public class TestMenu extends JFrame{

    public TestMenu() {
        System.setProperty("apple.laf.useScreenMenuBar", "true");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        JMenuBar mb = new JMenuBar();
        mb.setName("menubar");
        JMenu menu = new JMenu("menu"); 
        JMenu submenu = new JMenu("submenu");
        JMenuItem item = new JMenuItem("test item");
        JMenuItem item2 = new JMenuItem("test item2");
        JMenuItem subitem1 = new JMenuItem("sub item1");
        JMenuItem subitem2 = new JMenuItem("sub item2");
        menu.add(item);
        mb.add(menu);
        menu.add(submenu);
        setJMenuBar(mb);
        menu.add(item2);
        setBounds(100, 100, 100, 100);
        setVisible(true);
        submenu.add(subitem1);
        submenu.add(subitem2);
    }

    public static void main(String[] args) {

        new TestMenu();

    }

}

注: Apple の JVM のバージョン 1.6.0_15 について話しています。MAC を購入してから更新されていないユーザーのコンピューター上の JVM のバグが原因で、ソフトウェアがデータを公開しないように、古いバージョンを念頭に置いておく必要があります。Windows および Mac OS X 用の Java の現在のバージョンは正常に動作します。質問自体: JMenu とその表現を手動で同期する方法を誰かが知っているのではないでしょうか? または、別の回避策を提案できますか?

4

2 に答える 2

2

私は解決策を見つけました、そしてそれはそれほど難しくありませんでした...

.................................
        menu.add(item2);
        setBounds(100, 100, 100, 100);
        setVisible(true);
        submenu.add(subitem1);
        submenu.add(subitem2);
        SwingUtilities.updateComponentTreeUI(mb); //This line updates menu representation
    }
................................
于 2012-05-31T12:12:28.587 に答える
1

誤解されているかもしれませんが、変更を表示するだけの問題ですか?repaint()その場合は、 と の後submenu.add(subitem1)に試してくださいsubmenu.add(subitem2)

于 2012-05-29T13:53:40.313 に答える