Java JPanel JFrame独立类

Java JPanel JFrame独立类,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我是一名Java初学者,刚开始为我的程序制作GUI,我被困在JFrames和JPanels上。我的目标是制作一个包含多个JPanel的JFrame,每个JPanel都有自己的类 我已经有了一个开始,但我似乎无法让它发挥作用。我的代码如下: 这是JFrame类: import javax.swing.*; import java.awt.*; public class TestFrame extends JFrame{ private static final long serialV

我是一名Java初学者,刚开始为我的程序制作GUI,我被困在
JFrames
JPanels
上。我的目标是制作一个包含多个
JPanel
JFrame
,每个
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);
    }

}

您应该将
setVisible
作为
TestFrame
构造函数中的最后一个方法:

f.setVisible(true);
此外,无需对您的
JPanel
进行调用,因为当框架自身可见时,它将使其所有子组件可见:

p.setVisible(true);
所以这条线可以被移除



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

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

f.setVisible(true);
此外,无需对您的
JPanel
进行调用,因为当框架自身可见时,它将使其所有子组件可见:

p.setVisible(true);
所以这条线可以被移除



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

您的构造函数不应该创建新的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);
}
您的测试面板构造函数看起来不错。但是,我建议在TestFrame字段中创建任何面板,而不是在构造函数中创建临时变量

然后按如下方式创建窗口:

  SwingUtilities.invokeLater(new Runnable()
  {
      public void run()
      {
          new TestFrame();
      }
  }
最后,如果所有其他操作都失败,请尝试在构造函数中调用
setEnabled(true)


希望这些都能有所帮助,我已经离开了Swing,开始使用OpenGL,但我记得这是多么令人沮丧。

您的构造函数不应该创建新的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);
}
f.add(p);
p.repaint();
p.revalidate();
应该是

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);
}
您的测试面板构造函数看起来不错。但是,我建议在TestFrame字段中创建任何面板,而不是在构造函数中创建临时变量

然后按如下方式创建窗口:

  SwingUtilities.invokeLater(new Runnable()
  {
      public void run()
      {
          new TestFrame();
      }
  }
最后,如果所有其他操作都失败,请尝试在构造函数中调用
setEnabled(true)


希望这些都能有所帮助,我已经离开Swing,开始使用OpenGL,但我记得这是多么令人沮丧。

您应该为这个答案添加上下文;为什么它能解决所提出的问题?你应该给这个答案添加上下文;为什么它能解决上述问题?
f.add(p);
p.repaint();
p.revalidate();