【问题标题】:Java Swing revalidate() and repaint() problemJava Swing revalidate() 和 repaint() 问题
【发布时间】:2011-06-20 16:17:44
【问题描述】:

我有一个小型 Java 桌面应用程序,它需要能够通过分别单击“+”和“-”按钮来动态添加和删除字段。我已经通过调用 revalidate() 然后 repaint() 在所有父容器上一直到 ActionListener 中的 JFrame 来实现这一点。

这似乎成功了,但有时它不起作用,并且 JPanel 无法正确调整大小。这种情况很少发生,似乎是随机的,让我相信这可能是一个并发问题。我已经尝试从事件调度线程启动父容器,但这并没有解决问题。

这实际上是一个并发问题还是我找错了树?任何人都知道发生了什么以及如何解决?

非常感谢

-SwingNoob

【问题讨论】:

  • 间歇性错误通常表明存在并发问题,但我认为根据所提供的信息,没有人能够为您提供可靠的答案。
  • @mre:请澄清您的评论,因为根据我的经验和阅读情况,删除项目时需要在容器上调用 revalidaterepaint 以及 revalidate 和有时 @987654324 @ 添加组件时。
  • @Hovercraft,我收回我的声明——事实上你是对的。 @john,我为我的困惑道歉……请忽略我上面的评论。
  • @john,如果您提供一小段相关代码的 sn-p 将会很有帮助。
  • @Hovercraft Full Of Eels,@mre hmmm 10:1 那是关于 invokeLater() :-)

标签: java swing


【解决方案1】:

这不是对 OP 的问题 nice example 的回答,OP 的问题可能与 LayoutManager 和 OP 代码中的一些未知内容有关

1/ 如果你添加一个新的 JComponent 到容器然后你必须调用

validate();
repaint(); //lay with LayoutManager required that 

2/ 如果从容器中删除然后添加一个 JComponents,那么你必须调用

revalidate();
repaint(); // lay with LayoutManager required that 

3/ 看起来像 revalidate 也覆盖了 validate,

【讨论】:

  • 我不确定是否需要调用 repaint()。我已经编写了一些示例代码,看来调用validate() 是所有需要的,无论您是删除还是添加组件。但是,当然,这可能完全是情境性的。 :)
  • @mre 同意,如果您只删除或添加一个 JComponent,如果有多个 JComponent,我的观点是,您只能使用严格的 MVC GUI 架构来冒险,否则安全字节码不是个好主意一行... :-),是的,对 GC 重新绘制非常懒惰,这是未描述的炼金术
  • 在第 2 种情况下,我正在查看只需调用 repaint 而不是 revalidate 和 repaint 就足够了
【解决方案2】:

从 AWT/EDT 线程启动容器是不够的。

您需要在 AWT/EDT 线程上对容器执行每次布局更改。

因此,如果您确保您的添加和删除以这种方式完成,则不需要 revalidate() 或 repaint()。

【讨论】:

  • 我也称它为 awt(从 1999 年开始)
猜你喜欢
  • 2010-11-09
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2010-09-27
  • 2014-08-14
相关资源
最近更新 更多