【问题标题】:How to add a JPanel to an existing layout during runtime如何在运行时将 JPanel 添加到现有布局
【发布时间】:2014-01-30 18:33:43
【问题描述】:

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

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

见下图:

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

上图说明了当我使用GroupLayout.replace(Component existingComponent, Component newComponent) 方法时会发生什么,但我不想使用替换方法,我不想替换现有面板,我只想将新面板添加到现有的布局。我似乎在GroupLayout 中找不到任何可以做到这一点的方法。请帮忙。

对不起,这个问题的代码太长,无法粘贴,我不想阻止答案,但我希望你明白我在问什么。谢谢。

【问题讨论】:

  • 可以先放空白和面板,然后用新面板替换..

标签: java swing netbeans


【解决方案1】:

一种解决方案是在红线下方的空间中添加一个空面板。将其扩展为您想要的大小。然后,当您单击按钮时,只需将该面板添加到已经存在的空面板,以及 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");
}

【讨论】:

  • 没有。我不希望有一个空的现有面板。
  • 我根本不知道 GroupLayout,所以我无法提供将您的面板添加到现有主面板的任何解决方案。
  • 问题是布局已经设置好了。因此,您需要知道如何使用组布局将新面板添加到主面板。但是,如果您已经在布局中放置了一个空面板,那么在设计时,您可以在运行时将新面板添加到其中。
  • 我不希望现有面板存在。
  • @Jevison7x 我只是好奇,有一个空白面板有什么问题?
【解决方案2】:

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

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());
    }

谢谢..

【讨论】:

  • 这是您的面板代码,其中包含一些 jtextfield、Jbutton 等。只需从 netbeans 创建一个面板并将该类名替换为 newpanelclass..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多