0

JFrames我是一名 Java 初学者,刚开始为我的程序制作 GUI ,我被困在JPanels. 我的目标是做一个JFrame有几个JPanels的,每个JPanel都有自己的类。

我已经开始了,但我似乎无法让它发挥作用。我的代码如下:

这是 JFrame 类:

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();
    }
}

这是 JPanel 类:

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);
    }

}
4

3 回答 3

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 字段中创建任何面板,而不是在构造函数中创建临时变量。

然后像这样创建你的窗口:

  SwingUtilities.invokeLater(new Runnable()
  {
      public void run()
      {
          new TestFrame();
      }
  }

最后,如果所有其他方法都失败,请尝试调用setEnabled(true)您的构造函数。

希望这对我有所帮助,我已经离开 Swing 转而使用 OpenGL,但我记得它是多么令人沮丧。

于 2012-12-28T23:24:59.847 回答
0
f.add(p);
p.repaint();
p.revalidate();
于 2013-12-11T22:24:04.180 回答
0

您应该setVisible在构造函数中使用最后一个方法TestFrame

f.setVisible(true);

也没有必要对你的调用进行调用,JPanel因为当框架本身变得可见时,它的所有子组件都会变得可见:

p.setVisible(true);

所以这条线可以被删除。


你也有TestFrame扩展JFrame。这会创建 2 个帧,其中一个永远不会显示。在构造函数中创建框架就足够了。

于 2012-12-28T23:18:18.520 回答