【问题标题】:java swing about dynamic paneljava swing关于动态面板
【发布时间】:2012-06-03 07:54:04
【问题描述】:

结构如下:

我有一个框架和两个按钮 - 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();
    }
}

【问题讨论】:

标签: java swing jpanel


【解决方案1】:

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

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

this.getContentPane().removeAll();

【讨论】:

  • 除了componentMap之外,我还使用this.getContentPane().add()来存储A或B。我不能使用removeAll(),因为它会删除内容上的一些其他控制器窗格。
  • @user1371541 如果您想要完整的答案,请发布 SSCCE。无论您尝试做什么,您没有存储添加到内容窗格的正确组件这一事实绝对是一个问题(但无法判断这是否是您唯一的问题)
猜你喜欢
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多