java swing关于动态面板

标签 java swing jpanel

结构如下:

我有一个框架和两个按钮 - btnA、btnB

当我按下btnA时,createPanel()函数将返回一个要在框架中显示的panelA,

btnB 也是如此。

btnA和btnB可以切换。

在将面板添加到框架中之前,我使用clearPanel() 函数清除框架中的现有面板。

但问题是,当我调整大小或单击面板时,我可以看到之前应该删除的面板。

我丢失了什么吗?

public void actionPerformed(ActionEvent e) {
    String buttonString = e.getActionCommand();
    if (buttonString.equals("A")) {
        clearPanel();

        A = new APanel();
        this.getContentPane().add(A.createPanel(), BorderLayout.CENTER);
        this.pack();

        componentMap.put("A", A);
        btnB.setEnabled(true);
        btnA.setEnabled(false);
    }
    else if (buttonString.equals("B")) {
        clearPanel();

        chart = new BPanel();
        this.getContentPane().add(B.createPanel(), BorderLayout.CENTER);
        this.pack();

        componentMap.put("B", B);
        btnA.setEnabled(true);
        btnB.setEnabled(false);
    }
}

private void clearPanel() {
    if (!componentMap.isEmpty()) {  // I store panels in a HashMap
        for (Object o: componentMap.values()) {
            this.getContentPane().remove((JPanel)o);
        }
        this.getContentPane().invalidate();
        componentMap.clear();
    }
}

最佳答案

您正在将 A.createPanel()B.createPanel() 添加到 contentPane,但存储 AB 在你的 componentMap 中。因此,当您调用 this.getContentPane().remove((JPanel)o); 时,您是在 A 和/或 B 上执行此操作> 不在内容 Pane 中,因此您无需删除任何内容。

如果您想清除内容 Pane ,可以使用更简单/更安全的方法:

this.getContentPane().removeAll();

关于java swing关于动态面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10793262/

相关文章:

java - 从另一个 Jframe 打开后 JPanel 内容变黑

java - java中面板中的面板显示

java - JSoup总是超时

java - v.performClick() 无响应

Java 在同一个 JFrame 中绘制多个正方形

java - java中如何获取当前显示器的宽度和高度

java - 在 JComponent 顶部绘制

Java 服务器和客户端套接字需要修复

java - 无法删除openjdk debian9.6

java - JTextArea 强制父级 JScrollPane 向下滚动