【问题标题】:add JMenuBar to a JPanel?将 JMenuBar 添加到 JPanel?
【发布时间】:2011-05-17 00:53:42
【问题描述】:

我有一个 JMenuBar 和一个 JPanel。我想将 JMenuBar 添加到 JPanel。我该怎么做?

【问题讨论】:

    标签: java swing jpanel jmenubar


    【解决方案1】:

    您可以为您的 JPanel 使用 BorderLayout 并将 JMenuBar 放入面板的 NORTH 区域

    JPanel p = new JPanel();
    p.setLayout(new BorderLayout());
    p.add(menubar, BorderLayout.NORTH);
    

    JMenuBar 是一个 JComponent,可以像任何其他 JComponent 一样添加到容器中。

    【讨论】:

    • 我以为你只能将 JMenuBar 添加到 JFrame 中
    • 有效,不允许我将其添加到最顶部但足够接近!
    • BorderLayout.PAGE_START 似乎把它放在了我的顶部。
    • 这段代码过时了吗?这不再起作用了。
    • 效果很好。
    【解决方案2】:

    JMenuBars 使用 setJMenuBar 方法设置为 JFrame。

    请参阅以下教程了解如何使用它们。

    http://download.oracle.com/javase/tutorial/uiswing/components/menu.html

    【讨论】:

    • 不可能将它们直接添加到 JPanel 中?我那里还有其他项目......如果我添加一个 JFrame,它不会覆盖我的面板项目吗?
    • 嗯,JMenuBar 只是另一个 JComponent,因此您可以像添加其他任何内容一样将它添加到您的 JPanel。但是,由于它被设计为附加到 JFrame,它可能无法正常工作(甚至根本无法正常工作!)
    【解决方案3】:

    我也尝试过,但 JMenuItemJmenuJmenuBar 未添加到 JPanel。 但是,如果您将JFrame 的布局声明为空,然后在JMenuBar 实例上使用setBounds(x, y, width, height),然后将菜单栏添加到JFrame,您就会得到这种感觉。

    【讨论】:

      【解决方案4】:

      尝试在您的面板上放置一个 jDesktopPane,然后在其中添加一个菜单栏。我在下面的示例中使用了一个选项卡式窗格,但它应该同样适用于一个面板。

          JDesktopPane desktopPane = new JDesktopPane();
          tabbedPane.addTab("New tab", null, desktopPane, null);
      
          JMenuBar menuBar_1 = new JMenuBar();
          menuBar_1.setBounds(0, 0, 441, 21);
          desktopPane.add(menuBar_1);
      

      【讨论】:

      • 嗯...为什么是 JDesktopPane?
      • 我正在构建一个应用程序,我希望在每个可拆卸选项卡中都有一个菜单栏以显示多个 World Wind 视图。这似乎是一个很好的方法。找不到任何其他方式为每个窗口设置单独的菜单栏。
      【解决方案5】:

      我有另一个解决方案,尽管您必须在 NetBeans 的“其他组件”中添加 JMenuBar(足够好)。创建一个 JPanel,然后在内部添加另一个 JPanel(称为子),填充整个外部 JPanel。将您的控件放在子面板中。然后添加 JMenuBar,但 NetBeans 会将其放在“其他组件”中。编辑您的源代码并在调用“initComponents”后在 ctor 中调用此函数:

      public static void setJPanelMenuBar(JPanel parent, JPanel child, JMenuBar menuBar) {
          parent.removeAll();
          parent.setLayout(new BorderLayout());
          JRootPane root = new JRootPane();
          parent.add(root, BorderLayout.CENTER);
          root.setJMenuBar(menuBar);
          root.getContentPane().add(child);
          parent.putClientProperty("root", root);  //if you need later
        }
      

      例如,您的 ctor 可能如下所示:

        public MyPanel() {
          initComponents();
          setJPanelMenuBar(this, child, myMenuBar);
        }
      

      为我工作。通过查看 JInternalFrame 源代码得到了这个想法。它所做的只是用 JRootPane() 替换子 JPanel,然后将子 JPanel 放入根窗格的内容窗格中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        相关资源
        最近更新 更多