JAVA - 将一个面板添加到一个框架中

时间:2015-12-15 09:43:30

标签: java swing jframe

我目前在使用Frame时出现问题。 我正在尝试将一个面板添加到一个框架中,但它会打开两个不同的窗口,我该如何解决? 我希望按钮和面板位于框架中。

public class MenuSample extends JFrame{

在不同窗口中打开的面板和按钮

 private JButton button;
 private JPanel panel;

   public MenuSample () {
     Frame testFrame = new Frame("Test Frame");
     testFrame.addWindowListener(new WindowAdapter () {
         public void windowClosing (final WindowEvent e)
         {
            System.exit(0);
         }
     });
     testFrame.setMenuBar(this.getMenubar());
     testFrame.setSize(500,300);
     testFrame.setLocation(400,300);
     testFrame.setVisible(true);

应该在框架中的面板和按钮

     panel = new JPanel(new GridLayout(1,1));
     button = new JButton("erster Button");

     panel.add(button);

     getContentPane().add(panel);

     pack();
     setVisible(true);

  }

  protected MenuBar getMenubar () {
    some irrelevant MenuBar stuff

    menuLeiste.add(...);
    return menuLeiste;
  }
}

2 个答案:

答案 0 :(得分:2)

  

...它会打开两个不同的窗口,我该如何解决?

原因是您要创建两个不同的主窗口,一个JFrame(请注意,您的MenuSample 一个JFrame),另外一个{ {1}}。要么使用Frame本身作为顶级MenuSample,要么委托给另一个 - 来自下面的评论,我的假设是您要使用委托方法,所以只需执行

JFrame

注意:

  • 请注意在import java.awt.Dimension; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class MenuSample { private JFrame testFrame = new JFrame("Test Frame"); private JButton button = new JButton("erster Button"); private JPanel panel = new JPanel(new GridLayout(1, 1)) { private static final long serialVersionUID = 1L; @Override public Dimension getPreferredSize() { return new Dimension(400, 300); } }; public MenuSample() { panel.add(button); testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); testFrame.add(panel); testFrame.pack(); testFrame.setLocation(400, 300); testFrame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new MenuSample(); } }); } } 方法中启动UI的方式。这是为了避免并发问题(请参阅Best practice to start a swing application

  • 不要添加WindowListener,只需将main()的{​​{1}}设置为defaultCloseOperation,以确保应用程序在JFrame关闭时终止。请参阅JFrame Exit on close Java

  • 如果这是一个新应用,您可以考虑EXIT_ON_CLOSE而不是JFrame

答案 1 :(得分:1)

您已在Frame中正确添加新面板。你的问题不在于此。你有2个窗口的原因是因为你创建了2个框架:

MenuSample extends JFrame

创建一个MenuSample会创建一个Swing窗口,因为它是JFrame

Frame testFrame = new Frame("Test Frame");

创建new Frame(...)将创建一个AWT窗口。

要创建一个窗口,您需要:

  • 删除"扩展JFrame"并将所有内容添加到testFrame

  • 删除Frame testFrame = new Frame("Test Frame");并将所有内容添加到this