【问题标题】:JPanel.removeAll() not functioning properlyJPanel.removeAll() 无法正常运行
【发布时间】:2019-02-08 22:30:57
【问题描述】:

所以我目前正在自学使用 GUI,我决定回到我创建的 Go Fish 游戏的代码并添加一个 GUI。对于存放 CPU Player 牌的面板,它会显示一些扑克牌的背面,以指示 CPU 手牌的大小。

每当 CPU 的手牌大小发生变化时,我的方法 updateComputerCards 就会被调用以调整出现在屏幕上的牌张数量。它通过为我的面板调用removeAll() 方法来完成此操作,然后继续重新添加适量的卡片图像。

不过,我的问题是,当游戏刚开始时,在 CPU 手中找到匹配项时,该方法按预期工作,出现的卡牌数量减少了。然而,随后每次调用该方法时,尽管 CPU 拥有不同大小的牌,但 GUI 中没有任何变化。

通过调试器,我可以看到 removeAll() 方法由于某种原因并没有删除面板上的所有组件,即使它在第一次调用时成功地这样做而没有问题。有谁能帮帮我吗?

    public void updateComputerCards(ArrayList<Integer> hand) {
        labelPanel.removeAll();
        for (int i = 0; i < hand.size(); i++) {
            labelPanel.add(computerCardLabels.get(i));
            labelPanel.add(b.createHorizontalStrut(10));
        }

    }

【问题讨论】:

  • updateComputerCards 方法的末尾调用labelPanel.revalidate()labelPane.repaint() 来触发布局和绘制过程——Swing 布局是惰性的

标签: java swing label jpanel removeall


【解决方案1】:

您需要在进行更改后调用repaint() 方法。 见Painting in AWT and Swing

【讨论】:

  • 完美运行!非常感谢!肯定会读一读。
  • 您可能会发现您需要先使用revalidate,因为这会触发布局传递 - Swing 布局是惰性的
  • 我继续添加了 revalidate()。很抱歉,在 GUI 方面我有点菜鸟。究竟什么是布局通行证?
猜你喜欢
  • 2021-04-22
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多