java - 让 JFrame 具有相同的 JMenuBar 实例

标签 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);
    }
}

这可能吗?还是被禁止?

最佳答案

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

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

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

这也让生活更轻松,我建议看看How to Use Actions

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

关于java - 让 JFrame 具有相同的 JMenuBar 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25132966/

相关文章:

加载 Maya 场景的 Java 3D 应用程序会产生空黑屏

java - java swing如何从不同的操作系统绘制到屏幕上?

java - A类主菜单扩展Applet

java - 基于 Swing 的应用程序的最佳测试工具是什么?

java - 如何解决 Java awt/swing 图像打印中的滞后问题?

java - 如何区分mouseDragged和mousePressed?

java - cache()/persist() 的 apache-spark 内存消耗

java - 小服务程序 : How to build absolute path

java - Jtable 上的 ToolTipText

java - jpanels之间不需要的空间