如何在运行时将JPanel添加到现有布局

时间:2014-01-30 07:26:52

标签: java swing netbeans

我在swing桌面应用程序中有一个JPanel,其中包含使用NetBeans中的GUI构建器布局的组件。在生成的源代码中,NetBeans使用GroupLayout作为布局管理器。此JPanel位于JScrollPane

我创建了另一个面板,并手动编码了第二个面板内部组件的布局。在运行时,我想将第二个面板添加到NetBeans通过单击按钮创建的现有GroupLayout

见下图:

enter image description here

在上图中,有JButton标记为“Enter”,按钮下方的红线是我希望在点击按钮时显示新面板的位置。

enter image description here

上面的图片说明了当我使用GroupLayout.replace(Component existingComponent, Component newComponent)方法时会发生什么,但我不想使用replace方法,我不想替换现有的面板,我只是想添加新的面板到现有布局。我似乎无法在GroupLayout中找到任何方法来执行此操作。请帮忙。

很抱歉这个问题的代码太长了无法粘贴,我不想劝阻答案,但我希望你能理解我的要求。感谢。

2 个答案:

答案 0 :(得分:0)

一种解决方案是将空面板添加到红线下方的空白处。将其展开为您想要的尺寸。然后,当您点击该按钮时,只需将该面板添加到现有的空面板,然后将revalidate()repaint()添加到空主面板。

另一个解决方案是给我们一个CardLayout这个空面板,并手动编码一个空面板,将其添加到第一个空面板,然后将要显示的面板添加到主空面板。按下按钮后,它会将CardLayout切换到您想要显示的面板。

解决方案1。

private void jButtonXActionPerformed(java.awt.event.ActionEvent e){
    jPanelX.add(new MyOherPanel());
    jPanelX.revalidate();
    jPanelX.repaint();
}

解决方案2.

MyPanel myPanel = null;
public GUI(){
    intitComponents();
    jPanelX.setLayout(new CardLayout());
    jPanelX.add(new JPanel(), "emptyPanel");
    myPanel = new MyPanel();
    jPanelX.add(myPanel, "myPanel");
}

...
private void jButtonXActionPerformed(java.awt.event.ActionEvent e) {
    CardLayout layout = (CardLayout)jPanelX.getLayout();
    layout.show(jPanelX, "myPanel");
}

答案 1 :(得分:0)

使用此代码将新的JPanel替换为现有的JPanel。 NewPanelClass是放置新Five文本字段的类,jpanel1是当前空白面板。在buttonclick事件上所谓的CurrentPanel(),您可以将面板置于空白面板位置,就像那样简单..在组布局中。

private void CurrentPanel()
    {
        NewPanelClass mpanel = new NewPanelClass();
        this.getContentPane().remove(0);
        jPanel1.removeAll();
        javax.swing.GroupLayout firstPanelLayout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(firstPanelLayout);
        firstPanelLayout.setHorizontalGroup(
                firstPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(firstPanelLayout.createSequentialGroup().addGap(1, 1, 1).addComponent(mExploredDBView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(714, Short.MAX_VALUE)));
        firstPanelLayout.setVerticalGroup(
                firstPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(firstPanelLayout.createSequentialGroup().addGap(1, 1, 1).addComponent(mExploredDBView, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addGap(1, 1, 1)));
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));
        SwingUtilities.updateComponentTreeUI(this.getContentPane());
    }

谢谢..