Java Eclipse在添加到JMenuBar并将其设置为可见后是否不显示JMenuBar项?

Java Eclipse在添加到JMenuBar并将其设置为可见后是否不显示JMenuBar项?,java,swing,jmenu,jmenuitem,jmenubar,Java,Swing,Jmenu,Jmenuitem,Jmenubar,没有收到任何错误,但是程序仅在程序顶部显示word菜单。它不显示3个JMenu项:home、about和explore JPanel p5 = new JPanel(new GridBagLayout()); p5.setVisible(true); fw.add(p5, BorderLayout.PAGE_START); JMenu menu = new JMenu("Menu");

没有收到任何错误,但是程序仅在程序顶部显示word菜单。它不显示3个JMenu项:home、about和explore

JPanel p5 = new JPanel(new GridBagLayout());
                p5.setVisible(true);
                fw.add(p5, BorderLayout.PAGE_START);

                JMenu menu = new JMenu("Menu");
                menu.setVisible(true);
                menu.add("home");
                menu.add("about");
                menu.add("explore");

                JMenuBar menubar = new JMenuBar();
                fw.setJMenuBar(menubar); //ADDED THIS LINE. STILL DOESN'T WORK. 

                menubar.setVisible(true);
                menubar.add(menu);
                p5.add(menu);
我已经将JMenu添加到JMenuBar中,所有JMenu、JMenuBar和JPanel都设置为可见。我还将JPanelP5添加到第一个窗口fw,并将菜单添加到p5。我不确定为什么没有显示我的菜单项

更新:根据要求,MCVE最小完整和可验证示例

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;  
public class TestingClass  extends JFrame {

    public static void main(String[] args) {

        FirstWindow fw = new FirstWindow();
        fw.setSize(400, 600);
        fw.setDefaultCloseOperation(EXIT_ON_CLOSE);         
        fw.setVisible(true);

        JPanel p5 = new JPanel(new GridBagLayout());
        p5.setVisible(true);

        fw.add(p5);

        JMenu menu = new JMenu("Menu");
        menu.setVisible(true);
        menu.add("home");
        menu.add("about");
        menu.add("explore");

        JMenuBar menubar = new JMenuBar();
        fw.setJMenuBar(menubar);    // THE UPDATED LINE OF CODE.
        menubar.setVisible(true);
        menubar.add(menu);
        p5.add(menu);
      } 
    }
运行程序时,您将看到显示的文字菜单。“主页”、“关于”和“从JMenu中浏览”项不显示。有人知道我做错了什么吗

添加组件后需要调用setVisible!因此,首先添加所有组件。在您的情况下,将最高级别的组件添加到JFrameJPanel中,并为JFrame添加唯一可见的调用集。不需要调用每个组件

JMenu menu = new JMenu("Menu");
menu.add("home");
menu.add("about");
menu.add("explore");
//rest of the components
//add panelto the frame
frame.getContentPane.add(p5);
//set menubar for the frame
frame.setJMenuBar( menuBar );
//set visibility for frame to true
frame.setVisible(true);
添加组件后需要调用setVisible!因此,首先添加所有组件。在您的情况下,将最高级别的组件添加到JFrameJPanel中,并为JFrame添加唯一可见的调用集。不需要调用每个组件

JMenu menu = new JMenu("Menu");
menu.add("home");
menu.add("about");
menu.add("explore");
//rest of the components
//add panelto the frame
frame.getContentPane.add(p5);
//set menubar for the frame
frame.setJMenuBar( menuBar );
//set visibility for frame to true
frame.setVisible(true);

您需要将菜单栏添加到框架中:

frame.setJMenuBar( menuBar );

此外,您不需要使Swing组件可见,因为它们在默认情况下是可见的,顶层包含除外,例如JFrame,您需要将其设置为可见。

您需要将菜单栏添加到框架中:

frame.setJMenuBar( menuBar );

此外,您不需要使Swing组件可见,因为它们在默认情况下是可见的,但顶层包含除外,例如JFrame,您需要将其设置为可见。

运行时问题的MCVE应该干净地编译。这显示了3个编译错误。一个是容易修复的缺失导入,但另两个与缺失的FirstWindow相关

然而,一旦做了一些调整,问题就变得清楚了。组件只能出现在一个位置。通过将其添加到面板以及下面的注释,它无法显示在菜单中

import java.awt.*;
import javax.swing.*;

public class TestingClass  extends JFrame {

    public static void main(String[] args) {

        JFrame fw = new JFrame();
        fw.setSize(400, 200); // for screenshot
        fw.setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel p5 = new JPanel(new GridBagLayout());
        p5.setVisible(true);

        fw.add(p5);

        JMenu menu = new JMenu("Menu");
        //menu.setVisible(true);
        menu.add("home");
        menu.add("about");
        menu.add("explore");

        JMenuBar menubar = new JMenuBar();
        fw.setJMenuBar(menubar);    // THE UPDATED LINE OF CODE.
        //menubar.setVisible(true);
        menubar.add(menu);
        //p5.add(menu); // WTF?

        fw.setVisible(true); //should be done after all components are added
    }
}

运行时问题的MCVE应该干净地编译。这显示了3个编译错误。一个是容易修复的缺失导入,但另两个与缺失的FirstWindow相关

然而,一旦做了一些调整,问题就变得清楚了。组件只能出现在一个位置。通过将其添加到面板以及下面的注释,它无法显示在菜单中

import java.awt.*;
import javax.swing.*;

public class TestingClass  extends JFrame {

    public static void main(String[] args) {

        JFrame fw = new JFrame();
        fw.setSize(400, 200); // for screenshot
        fw.setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel p5 = new JPanel(new GridBagLayout());
        p5.setVisible(true);

        fw.add(p5);

        JMenu menu = new JMenu("Menu");
        //menu.setVisible(true);
        menu.add("home");
        menu.add("about");
        menu.add("explore");

        JMenuBar menubar = new JMenuBar();
        fw.setJMenuBar(menubar);    // THE UPDATED LINE OF CODE.
        //menubar.setVisible(true);
        menubar.add(menu);
        //p5.add(menu); // WTF?

        fw.setVisible(true); //should be done after all components are added
    }
}

-1 Swing组件在默认情况下是可见的,但顶级容器jMenu在默认情况下是可见的,默认情况下,除了windows include JInternalFrameYeah之外,所有Swing组件都可见。我只想在添加所有组件后调用setVisible。我们所要做的就是将框架的可见性设置为true或false,这取决于我们是否希望显示或隐藏框架。是的,我只想。。你的回答没有很好地表达出来。我没有取消我的反对票,因为答案仍然具有误导性。在框架上设置菜单栏之前,无需将菜单添加到菜单栏。关键是在使fame可见之前,以您喜欢的任何顺序将所有组件添加到GUI。即使您删除该行,我也不会删除否决票,因为我不需要验证您所做的每一条语句。-1 Swing组件默认可见,但顶级容器jMenu默认可见,事实上,默认情况下,除了windows include JInternalFrameYeah之外,所有Swing组件都可见。我只想在添加所有组件后调用setVisible。我们所要做的就是将框架的可见性设置为true或false,这取决于我们是否希望显示或隐藏框架。是的,我只想。。你的回答没有很好地表达出来。我没有取消我的反对票,因为答案仍然具有误导性。在框架上设置菜单栏之前,无需将菜单添加到菜单栏。关键是在使fame可见之前,以您喜欢的任何顺序将所有组件添加到GUI。即使你删除了那一行,我也不会删除否决票,因为我不需要验证你的每一句话;就像你说的,看上面的代码;它仍然不显示JMenu中的菜单项。实际上,它在程序中没有做任何更改。@user3289740,请阅读上的Swing教程中的部分,以获得一个工作示例。将工作示例与代码进行比较,看看有什么不同。或者更好的是,使用工作示例作为起点,然后根据您的需求定制代码,因为工作示例的结构可能比您的代码更好。我们不能给你更多的建议,因为你的代码不完整;就像你说的,看上面的代码;它仍然不显示JMenu中的菜单项。实际上,它在程序中没有做任何更改。@user3289740,请阅读上的Swing教程中的部分,以获得一个工作示例。将工作示例与代码进行比较,看看有什么不同。或者更好,
使用工作示例作为起点,然后根据您的需求定制代码,因为工作示例的结构可能比您的代码更好。我们不能给你更多的建议,因为你的代码不完整。为了更快地获得更好的帮助,请发布一个最小的完整和可验证的示例。谢谢你的建议。我已经添加了MCVE。你能看出我做错了什么吗?为了更快地获得更好的帮助,请发布一个最小的完整且可验证的示例。谢谢你的建议。我已经添加了MCVE。你能看到我做错了什么吗?注意:GUI应该在EDT上启动,我没有更改-BNI。有关更多详细信息,请参阅。谢谢你的帮助,非常感谢。所以,我做错的是将JMenu添加到JPanel。而您只需要将JMenu添加到JMenuBar,而不是JPanel。这是因为通过向JPanel和JMenuBar添加组件,它根本不会出现。如果我可以问你一个问题:你没有将JMenuBar添加到JPanel,而是直接将它添加到JFrame fw.setJMenuBarmenubar,那么如果我们不直接将组件(即JMenuBar)添加到JPanel,那么JPanel有什么用呢?如果我们不直接将组件(即JMenuBar)添加到JPanel,那么JPanel有什么用呢?如果GUI不需要任何组件,则无。但是,我们多久可以做一次,我们需要做一个只有菜单栏的GUI?注意:GUI应该在EDT上启动,我没有改变-BNI。有关更多详细信息,请参阅。谢谢你的帮助,非常感谢。所以,我做错的是将JMenu添加到JPanel。而您只需要将JMenu添加到JMenuBar,而不是JPanel。这是因为通过向JPanel和JMenuBar添加组件,它根本不会出现。如果我可以问你一个问题:你没有将JMenuBar添加到JPanel,而是直接将它添加到JFrame fw.setJMenuBarmenubar,那么如果我们不直接将组件(即JMenuBar)添加到JPanel,那么JPanel有什么用呢?如果我们不直接将组件(即JMenuBar)添加到JPanel,那么JPanel有什么用呢?如果GUI不需要任何组件,则无。但是,我们需要多长时间制作一个只有菜单栏的GUI?