让JFrame具有相同的JMenuBar实例

时间:2014-08-05 07:03:42

标签: java swing awt

就像标题所示,我想在多个JFrame中使用一个JMenuBar。然而,这似乎不起作用。每当将JMenuBar实例添加到第二个JFrame时,菜单就会从第一个JFrame中消失。

查看我的SSCCE

public class MenuTest extends JPanel {
    private static final long serialVersionUID = -9209142740183347797L;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(); 
            }
        });
    }

    private static void createAndShowGUI() {
        System.out.println("Created GUI on EDT? "+ SwingUtilities.isEventDispatchThread());

        JMenuBar bar = new JMenuBar();
        bar.add(new JMenu("Test1"));
        bar.add(new JMenu("Test2"));
        bar.add(new JMenu("Test3"));

        JFrame f = new JFrame("Swing Paint Demo 1");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MenuTest());
        f.setJMenuBar(bar);
        f.pack();
        f.setVisible(true);


        JFrame f2 = new JFrame("Swing Paint Demo 2");
        f2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f2.add(new MenuTest());
        f2.setJMenuBar(bar);
        f2.pack();
        f2.setVisible(true);
    }
}

这可能会被禁止吗?

1 个答案:

答案 0 :(得分:4)

这是不可能的,至少不是你想要的方式。

组件可能只属于单个父容器,这意味着当您尝试将其应用于第二个容器时,它将有效地将其从前一个容器中删除。

而不是尝试维护单个实例,而是考虑使用“构建器”或“工厂”模式,为您生成JMenuBar的新实例。

为了让生活更轻松,我建议您查看How to Use Actions

另请查看The Use of Multiple JFrames, Good/Bad Practice?