【问题标题】:Panel.repaint() doesn't seem to be refreshing panelPanel.repaint() 似乎不是刷新面板
【发布时间】:2016-10-12 22:52:07
【问题描述】:

我在使用默认值在我的 GUI 上重新绘制 JPanel 时遇到了一些问题。

我现在正在使用的代码如下,再次,我不习惯,对java代码也不是很了解,所以请原谅我犯了菜鸟的错误:

private void btnResetActionPerformed(java.awt.event.ActionEvent evt) {                                         
    ...

    pnlWagens1 = new pnlWagens();
    UpdateGUI();
}                                        

private void UpdateGUI(){
    pnlWagens1.repaint();
}

到目前为止,我已经尝试了上面的代码,以及将 JPanel 设置为 null,重新绘制,插入面板的新实例,再次重新绘制。 到目前为止没有任何成果,因为最后,我仍然坚持在我的 GUI 上显示旧面板(及其值)。

基本上,我最初制作了一个具有绿色背景的面板,将背景设为红色,然后将面板重置为再次具有绿色背景。但是最后,点击重置后,它仍然显示带有红色背景的旧面板。

任何关于我可能做错/忽略的见解将不胜感激。

【问题讨论】:

  • 要获得更好的帮助,请考虑创建并发布Minimal, Complete, and Verifiable Example Program。我们不想看到你的整个程序,而是你应该将你的代码压缩成仍然可以编译的最小部分,没有与你的问题无关的额外代码,但仍然可以证明你的问题。您可以通过简单地尝试隔离和暴露错误来自己解决问题。
  • 为了简洁起见翻译上述内容:我在上面的代码中没有看到您的错误,表明它在未显示的代码中。首先你必须隔离错误,因此需要minimal reproducible example
  • 唯一可能的问题是您正在创建一个新的 pnlWagens 对象,因此您可能没有更新正确的对象 - 但很难说。
  • 我正在更新正确的,但正如 NESPowerGlove 所说,我需要将面板重新添加到我的框架中才能更新其参考
  • 也许吧。根本不交换 JPanel 可能会更干净,而是更改已经存在的面板状态,调用 repaint() 并让它根据其状态绘制不同的图像。这将更简单编码并且涉及更少的开销。

标签: java swing jpanel repaint


【解决方案1】:

假设这是所有相关代码(并且 UpdateGUI 不使用 addremove 与您有面板参考),然后更改对象 pnlWagens1 在您的本地类中引用'不要更改仍然引用旧对象的其他引用。从您最初在某个容器上调用 add 时开始,Swing 在另一个位置仍引用旧对象 pnlWagens1

您需要做的是从容器中removepnlWagens1,像现在一样更改pnlWagens1,重新addpnlWagens1 到容器,然后调用revalidate()repaint() 在容器上。

【讨论】:

  • 做得很好!我实际上没有想过将它从容器中删除,我真的相信引用会在更改时简单地更新。谢谢!
  • @Yorrick 没问题。在Java中,引用是按值传递的,如果你调用一个方法并传递一个引用,该方法实际上会得到一个引用的副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2019-10-03
相关资源
最近更新 更多