添加的JPanel到按钮后,另一个JPanel中单击

问题描述:

我使用NetBeans IDE使一个GUI应用程序。我有一个JPanel里面的JFrame。点击按钮后,我想在第一个内部显示不同的JPanel。另一个JPanel在另一个文件中。我会如何去做这件事?如果这是不实际的,我不介意与第二个更换第一的JPanel。添加的JPanel到按钮后,另一个JPanel中单击

我试过以下,但它似乎并没有工作。我是新来的Java和GUI编程,所以我希望得到任何帮助我能。

private void jButtonActionPerformed(java.awt.event.ActionEvent evt) {   
    JPanel2 jPanel2 = new JPanel2(); 
    JPanel1.add(jPanel2); 
} 

参见Container#add方法的Javadoc:

此方法更改布局相关的信息,因此,无效组件层次结构。如果容器已经被显示,层级必须此后,以显示所添加的分量验证。

因此,仅添加面板是不够的,但您还必须再次验证层次结构,例如,通过调用

JPanel1.validate(); 
JPanel1.repaint(); 

使用CardLayout作为@Andrew在他的回答表明可能是一个更好的选择,然后手动更换面板

两个并排的注意事项:

  • 了解和尊重的Java命名约定(例如一个类的实例以小写字母开头)。因此您的JPanel1.add呼叫将变为jPanel1.add
  • 在大多数情况下,不需要扩展Swing类Jxxx。看着你的类名JPanel1JPanel2你正是这样做。最好使用可用的API来自定义这些类,然后再扩展它们。

您还必须添加以下代码,如您更改生效:

jPanel1.validate(); 
jPanel1.repaint(); 

使用CardLayout,如图所示here

Game viewHigh Scores view

+0

+1的'CardLayout'很好的建议。看到代码后,我忘记了最初的要求,或者我会建议我自己(将立即更新我的答案) – Robin

+0

@mKorbel确实,忘记即使这样做。更正 – Robin

newPanel obj = new newPanel(); 
    setLayout(new BorderLayout()); 
    add(obj ,BorderLayout.EAST ,1);//3rd argument is index 
    repaint(); 
    revalidate(); 
+1

你能解释为什么这段代码回答这个问题吗? –