我目前在使用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;
}
}
答案 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