【问题标题】:Adding JPanel onto another JPanel after button click单击按钮后将 JPanel 添加到另一个 JPanel
【发布时间】:2012-09-19 09:06:49
【问题描述】:

我正在使用 Netbeans IDE 制作一个 gui 应用程序。我有一个 JFrame,里面有一个 JPanel。单击按钮后,我想在第一个内部显示不同的 JPanel。另一个 JPanel 在不同的文件中。我该怎么做呢?如果这不切实际,我不介意用第二个 JPanel 替换第一个 JPanel。

我尝试了以下方法,但似乎不起作用。我是 Java 和 Gui 编程的新手,所以如果能得到任何帮助,我将不胜感激。

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

【问题讨论】:

    标签: java swing netbeans runtime jpanel


    【解决方案1】:

    查看Container#add方法的javadoc:

    此方法更改与布局相关的信息,因此使组件层次结构无效。如果容器已经显示,则必须在之后验证层次结构才能显示添加的组件。

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

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

    使用@Andrew 在他的回答中建议的CardLayout 可能是比手动替换面板更好的选择

    两个旁注:

    • 学习并尊重 Java 命名约定(例如,类的实例以小写字母开头)。所以你的JPanel1.add 电话会变成jPanel1.add
    • 在大多数情况下不需要扩展Jxxx Swing 类。查看您的班级名称JPanel1JPanel2,您就是这样做的。最好使用可用的 API 来自定义这些类,然后再扩展它们。

    【讨论】:

      【解决方案2】:

      您还必须添加以下代码以使您的更改生效:

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

      【讨论】:

        【解决方案3】:

        使用CardLayout,如图here

        【讨论】:

        • +1 对CardLayout 的好建议。看到代码后,我忘记了最初的要求,或者我会建议自己(将立即更新我的答案)
        • @mKorbel 确实,甚至忘记这样做。已更正
        【解决方案4】:
            newPanel obj = new newPanel ();
            setLayout(new BorderLayout());
            add(obj ,BorderLayout.EAST ,1);//3rd argument is index
            repaint();
            revalidate();
        

        【讨论】:

        • 你能解释一下为什么这段代码回答了这个问题吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 2012-06-14
        • 1970-01-01
        相关资源
        最近更新 更多