我是一名Java初学者,他开始为我的程序制作GUI,但我仍被JFrames
和JPanels
困住。我的目标是制作一个JFrame
,其中包含JPanels
个JPanel
,每个import javax.swing.*;
import java.awt.*;
public class TestFrame extends JFrame{
private static final long serialVersionUID = 1L;
private JFrame f;
public TestFrame(){
f = new JFrame("Test");
f.setVisible(true);
f.setSize(600, 400);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new TestPanel();
p.setVisible(true);
f.add(p);
}
public static void main(String[] args){
new TestFrame();
}
}
都有自己的类。
我已经开始了,但我似乎无法让它发挥作用。我的代码如下:
这是JFrame类:
import javax.swing.*;
import java.awt.*;
public class TestPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JButton b;
private JTextField t;
public TestPanel(){
b = new JButton("bla");
t = new JTextField("blaadda");
add(b);
add(t);
setVisible(true);
}
}
这是JPanel类:
{{1}}
答案 0 :(得分:3)
您的构造函数不应该创建新的JFrame。您的类(TestFrame
)将用于创建窗口,而不是JFrame类。您可能遇到其他错误,但最明显的错误是
public TestFrame(){
f = new JFrame("Test");
f.setVisible(true);
f.setSize(600, 400);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new TestPanel();
p.setVisible(true);
f.add(p);
}
应该是
public TestFrame(){
//Don't create a new JFrame, you're already creating a TestFrame!
//call all methods on the TestFrame, not the JFrame
setVisible(true);
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new TestPanel();
p.setVisible(true);
add(p);
}
您的TestPanel构造函数看起来不错。我建议在TestFrame字段中创建任何Panel而不是构造函数中的临时变量。
然后像这样创建你的窗口:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new TestFrame();
}
}
最后,如果所有其他方法都失败,请尝试在构造函数中调用setEnabled(true)
。
希望这有任何帮助,我已经离开了Swing for OpenGL,但我记得它有多么令人沮丧。
答案 1 :(得分:0)
您应该setVisible
作为TestFrame
构造函数中的最后一个方法:
f.setVisible(true);
此外,无需将此JPanel
作为调用,因为当框架变为可见时,框架将使其所有子组件可见:
p.setVisible(true);
所以这条线可以删除。
此外,您TestFrame
延长了JFrame
。这会创建2个帧,其中一个永远不会显示。在构造函数中创建框架就足够了。
答案 2 :(得分:0)
f.add(p);
p.repaint();
p.revalidate();