Java 为什么赢了';我的JMenuBar没有出现吗?

Java 为什么赢了';我的JMenuBar没有出现吗?,java,user-interface,swing,Java,User Interface,Swing,我试图用java制作一个GUI,但是JMenuBar已经给了我两天的时间。有人能告诉我为什么它没有出现吗 import java.awt.*; import javax.swing.*; import javax.swing.JPanel; import java.awt.event.*; import java.awt.image.*; import java.io.*; import java.util.Arrays; import javax.imageio.ImageIO;

我试图用java制作一个GUI,但是JMenuBar已经给了我两天的时间。有人能告诉我为什么它没有出现吗

import java.awt.*;
import javax.swing.*;
import javax.swing.JPanel;
import java.awt.event.*;
import java.awt.image.*;     
import java.io.*;
import java.util.Arrays;
import javax.imageio.ImageIO;

public class selectionFrame extends JFrame
 {
  Font name;
  Font title;

  public void setup() //can't use constructer because this isn't given a size until after it is constructed.
  { 
   //getContentPane().add(menuBar);
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   getContentPane().setLayout(new FlowLayout());
   //getContentPane().add(j);

   setJMenuBar(createMenuBar());
   //getContentPane().add(createMenuBar());  
  }

  public JMenuBar createMenuBar()
  {
   JMenuBar menuBar;
   JMenu m_file;
   JMenuItem mi_save;
   JMenuItem mi_load;

   JMenu m_edit;
   JMenuItem mi_tileHeight;
   JMenuItem mi_tileWidth;

   menuBar = new JMenuBar();
   m_file = new JMenu("File");
   m_edit = new JMenu("Edit");

   mi_save = new JMenuItem("Save file", KeyEvent.VK_S);
   mi_load = new JMenuItem("Load file", KeyEvent.VK_L);
   mi_tileHeight = new JMenuItem("Set tile height", KeyEvent.VK_H);
   mi_tileWidth = new JMenuItem("Set tile width", KeyEvent.VK_W);

   menuBar.add(m_file);
   m_file.add(mi_save);
   m_file.add(mi_load);

   menuBar.add(m_edit);
   m_edit.add(mi_tileHeight);
   m_edit.add(mi_tileWidth);

   return menuBar;
  }

  public static void main(String[] args) //run
  { 
   selectionFrame sel = new selectionFrame();
   sel.setLocationRelativeTo(null);
   sel.setSize((int) 400 + (sel.getInsets().left + sel.getInsets().right),(int) 400  + (sel.getInsets().top + sel.getInsets().bottom));

   sel.setVisible(true);
   sel.setTitle("Tiles/Meta");
   sel.setResizable(false);
   sel.setFocusable(true);
   sel.getContentPane().setSize(sel.getSize());
   sel.setLocation((int) sel.getX() - (sel.getWidth()/2),(int) sel.getY() -  (sel.getHeight()/2));
   sel.setup();
   sel.repaint();

   } 
 }

当我编译并运行它时,它会显示一个带有文件和编辑菜单项的菜单栏。你期待更多吗

另外,将你的class-SelectionFrame大写

编辑: 有一件事我忘了看,你的代码和这里的每个答案在技术上都是错误的。通常情况下,它会正常工作,但不允许您对Swing组件执行任何操作,除非您处于工作状态

通常情况下,您不必过多地考虑工作线程,因为来自窗口的每个事件无论如何都会出现在工作线程上,但在构建初始帧时,往往会忘记它——而且通常情况下,它只是工作而已

Sun曾经建议您可以使用AWT线程之外的组件,直到实现该窗口为止(使用pack()或setVisible(true)),但是

修复此问题的最简单方法可能是在新建SelectionFrame之前,让main创建一个swing worker线程

这将解决您的问题的可能性只有一半,但在使用GUI时仍应将其考虑在内。

sel.setVisible(true)


应该是您最后调用的东西……

您使用的Java版本是什么?在我的系统上,您的菜单栏在1.6.0_10中显示良好。尝试将主方法的主体包装在
invokeLater()
调用中,以便它在正确的线程上运行,如下所示:

public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                selectionFrame sel = new selectionFrame();
                sel.setLocationRelativeTo(null);
                sel.setSize((int) 400 + (sel.getInsets().left + sel.getInsets().right), 
                            (int) 400 + (sel.getInsets().top + sel.getInsets().bottom));
                sel.setTitle("Tiles/Meta");
                sel.setResizable(false);
                sel.setFocusable(true);
                sel.getContentPane().setSize(sel.getSize());
                sel.setLocation((int) sel.getX() - (sel.getWidth() / 2),
                                (int) sel.getY() - (sel.getHeight() / 2));
                sel.setup();
                sel.setVisible(true); // Follow Kendrick's advice too.
            }
        });
    }

另外,就在调用
sel.setVisible(true)之前请调用
sel.pack()

请注意,与其使用
setSize
,不如使用
setPreferredSize
,这在框架包装过程中会得到利用


与您的问题没有直接关系,但使用Swing时,使用一个好的布局管理器可以节省大量的时间和挫败感。是一个优秀的一站式布局管理器。

您有很多额外的代码

它会显示一个菜单栏和所有东西。如果将内容添加到内容窗格的中心(默认为边框布局),中心将自动填充整个内容区域,您无需调整任何大小

这显示为一个带有菜单栏的窗口,一切正常


你在哪个站台上做这个?我在Vista上,我得到了我期望看到的东西。

结果表明,您有在JFrame的构造函数中设置JMenuBar。我在查看代码和标记答案代码之间的差异时发现了这一点


谢谢你的精彩回答,约翰·加德纳。如果没有你,我很可能会被困数月。

在我的情况下,我找到了一个缺失的菜单栏,找到了一个bug,在那里我设置了根窗格布局,tsk-tsk。RootPane(参见示例)控制菜单栏的布局,因此当我更改其布局管理器时,它丢失了菜单栏

相反,应该使用内容窗格来布局和添加组件,例如:

frame.getContentPane().setLayout(...);
frame.getContentPane().add(...);

供将来参考。。。这与组件可见无关(正如OP所说,框架可见,但菜单栏不可见),我的工作代码将JMenuBar设置在构造函数之外,虽然swing线程安全是一种很好的做法,但这不是问题的原因。

每次编译并运行它时,我都没有得到任何结果。你能告诉我你用的是什么JDK吗?1.6.0_05但我必须键入10个字符
frame.getContentPane().setLayout(...);
frame.getContentPane().add(...);