2009-02-20 373 views
3

我想在java中制作一个GUI,但JMenuBar给了我两天的时间。有人能告诉我为什么它没有显示出来吗?为什么我的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(); 

    } 
} 

回答

5

那里有很多额外的代码。

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

    public SelectionFrame() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setJMenuBar(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 void main(String args[]) 
    { 

     SelectionFrame sel = new SelectionFrame(); 
     sel.setLocationRelativeTo(null); 
     sel.setSize(400 + (sel.getInsets().left + > sel.getInsets().right), 400 
     + (sel.getInsets().top + sel.getInsets().bottom)); 

     sel.setTitle("Tiles/Meta"); 
     sel.setResizable(false); 
     sel.setFocusable(true); 

     sel.getContentPane().add(new JLabel("Content", SwingConstants.CENTER), 
     BorderLayout.CENTER); 
     sel.setLocation(sel.getX() - (sel.getWidth()/2), sel.getY() - >    (sel.getHeight()/2)); 
     sel.setVisible(true); 

    } 
} 

与菜单栏,一切都显示出来。如果您将内容添加到内容窗格的中心(默认为边框布局),则中心会自动填充整个内容区域,您无需调整任何内容。

这显示为一个菜单栏的窗口,一切工作正常。

你在做什么平台?我在Vista上,我得到了我期望看到的。

0

当我编译并运行它,它显示了与文件和编辑菜单项的菜单栏。你是否期待更多?

此外,利用你的讲座SelectionFrame

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

通常你不必去想工作线程多,因为每一个,从你的窗口事件将是工作线程反正,但忘掉它,当你建立你的初始frame--的倾向而且往往不是它只是起作用。

Sun曾经建议您可以使用AWT线程外部的组件,直到窗口实现(使用pack()或setVisible(true)),但是this is no longer considered safe

解决此问题的最简单方法可能是让您的主要人员在创建SelectionFrame之前创建一个摆动工作线程。

这将解决您的问题的机会只有50-50,但您在GUI上工作时仍应考虑此问题。

+0

每次我编译并运行它时,我都没有收到任何东西。你能告诉我你使用的是什么JDK吗? – William 2009-02-20 18:59:04

0

sel.setVisible(true);

应该是您最后一次调用的内容......

1

您使用的是哪个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. 
      } 
     }); 
    } 
0

而且,仅仅是调用sel.setVisible(true);请援引sel.pack();

请注意,除了的setSize最好使用setPreferredSize,这是在帧封装期间的杠杆作用。

与您的问题没有直接关系,但仍然 - 使用Swing时,使用良好的布局管理器是一个巨大的时间和沮丧的救星。 MigLayout简直就是一个出色的一站式布局管理器。

1

变成你HAVE在JFrame的构造函数中设置JMenuBar。我想到了这一点,同时查看了我的代码和标记的答案代码之间的差异。

谢谢你的精彩答案,约翰加德纳。没有你,我最有可能被困在几个月。

1

在我的情况下,我已经追踪到一个缺失的菜单栏,我设置了RootPane布局,tsk tsk。 RootPane(例如http://download.java.net/jdk7/archive/b123/docs/api/javax/swing/JRootPane.html)控制菜单栏的布局,所以当我更改其布局管理器时,它会丢失该栏。

相反,人们应该使用的contentPane布局和添加组件,如:

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

以供将来参考...这无关与组件可见(作为OP说,框架是可见的,但菜单栏没有),我有工作代码,它将JMenuBar设置在构造函数的外部,并且在swing-thread-safe是Good Practice的情况下,它不是问题的原因。