JPanel JFrame分开了类

时间:2012-12-28 23:14:16

标签: java swing jframe jpanel

我是一名Java初学者,他开始为我的程序制作GUI,但我仍被JFramesJPanels困住。我的目标是制作一个JFrame,其中包含JPanelsJPanel,每个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}}

3 个答案:

答案 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();