将JPanel添加到JFrame

11

我有一个程序,在其中向JFrame添加了一个JPanel:

public class Test{

    Test2 test = new Test2();
    JFrame frame = new JFrame();

    Test(){

    ...
    frame.setLayout(new BorderLayout());
    frame.add(test, BorderLayout.CENTER);
    ...

    }

    //main

    ...

    }

    public class Test2{

    JPanel test2 = new JPanel();

    Test2(){

    ...

    }

}

我得到了一个错误提示,要求将'panel'的类型更改为'component'。我如何修复这个错误? 它希望我这样做:Component panel = new Component();


你需要发布更多的代码,因为你发布的代码应该可以正常工作。 - Robin
JPanel是一个组件。你刚刚粘贴的代码是否给出了那个错误? - Charles
听起来你可能误解了错误信息;请问确切的错误信息是什么? - rob
5个回答

19
public class Test{

Test2 test = new Test2();
JFrame frame = new JFrame();

Test(){
...
frame.setLayout(new BorderLayout());
frame.add(test, BorderLayout.CENTER);
...
}

//main
...
}

//public class Test2{
public class Test2 extends JPanel {

//JPanel test2 = new JPanel();

Test2(){
...
}

2
好奇一下,您为什么没有直接在“Test”中扩展“JFrame”?我总是这样做,也许这是个坏习惯?点赞。 - Jean-François Savard
4
@Jean-FrançoisSavard 我不会对框架的任何功能进行添加或更改,因此我只使用普通实例。通常是GUI构建器鼓励扩展框架或面板(我认为没有什么好的理由)。 - Andrew Thompson
1
“扩展允许您直接传递参数到父构造函数。”一旦您这样做,您就正在改变框架的功能。 ;) - Andrew Thompson
没错。如果我理解你所说的话,需要进行任何修改(比如设置标题)就会让你进入扩展JFrame的流程?而你在这个例子中没有进行扩展只是因为它并没有修改任何简单的属性,对吗? - Jean-François Savard
1
@Jean-FrançoisSavard “需要进行任何修改(如设置标题)都会将您重定向到扩展JFrame?”我通常会在构造函数中传递标题。例如,就像这个例子一样:http://stackoverflow.com/a/29672939/418556。还要注意的是,该示例使用方法来配置和构建UI面板,而不是扩展它。除非进行自定义绘画之类的操作,否则我真的不喜欢扩展。 - Andrew Thompson
显示剩余2条评论

4

简单地做

public class Test{
    public Test(){
        design();
    }//end Test()

public void design(){
    JFame f = new JFrame();
    f.setSize(int w, int h);
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    f.setVisible(true);
    JPanel p = new JPanel(); 
    f.getContentPane().add(p);
}

public static void main(String[] args){
     EventQueue.invokeLater(new Runnable(){
     public void run(){
         try{
             new Test();
         }catch(Exception e){
             e.printStackTrace();
         }

 }
         );
}

}

2

不要将您的Test2类包含在JPanel中,而应该将其子类化JPanel:

public class Test2 extends JPanel {

Test2(){

...

}

更多细节:

JPanel 是 Component 的子类,因此任何以 Component 作为参数的方法也可以将 JPanel 作为参数。

旧版本不允许直接添加到 JFrame 中;必须使用 JFrame.getContentPane().add(Component)。如果您使用的是旧版本,则可能会出现问题。新版本的 Java 可以直接调用 JFrame.add(Component)。


0
Test2 test = new Test2();
...
frame.add(test, BorderLayout.CENTER);

你确定吗?test不是一个组件!如果你想要做你试图做的事情,你应该让Test2继承JPanel

0

你的 Test2 类不是一个 Component,它有一个 Component 是不同的。

要么你可以做一些像这样的事情

frame.add(test.getPanel() );

在您的类中引入一个面板的getter方法,或者确保您的Test2类成为一个Component(例如通过扩展JPanel


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接