【问题标题】:JDialog dispose and repainting problemJDialog处理和重绘问题
【发布时间】:2011-03-30 08:57:06
【问题描述】:

在 jnlp 应用程序中,我们创建了一个从 javax.swing.JDialog 扩展的模式弹出窗口,并在必要时调用 dispose() 来隐藏对话框。但是,有时最终客户会遇到重绘问题。对话框并没有真正消失,它的父窗口看起来很乱。我无法重现,但它在最终客户端 PC 上发生了很多次。我想有两个可能的原因:

  • 我们的应用程序中有一个线程直接更新光标。但是,我无法证明这个线程是问题的根本原因。
  • 定期,我们有另一个进程在几秒钟内高度使用 CPU。我尝试加载 CPU,但也无法重现该问题。

在这种情况下对我有什么建议吗?

谢谢!

【问题讨论】:

  • "在这种情况下对我有什么建议吗?"我建议您尝试准备一个显示相同行为的SSCCE(尽管在这些“随机错误”和“仅出现在另一台机器上”的情况下很棘手)。这里很少有信息可以表明问题。

标签: performance swing concurrency repaint jdialog


【解决方案1】:

看起来答案就在问题中;-)

有一个线程(不是 EDT)更新 UI(在您的情况下为光标)可能会导致此类问题。

因此,请确保您的线程调用SwingUtilities.invokeLater()(或invokeAndWait(),具体取决于您的需要)。

另一种可能性(但这在很大程度上取决于您的线程的作用,如果没有您的进一步描述,很难说)是使用SwingWorker 而不是线程。

【讨论】:

  • 在无法重现的情况下,如何确保线程是根本原因?有没有办法让这个问题更频繁地发生?
  • 不,您每次都重现这种错误的可能性很小,因为它取决于太多无法掌握的因素(通常是 CPU 负载和线程调度程序)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2023-03-18
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
相关资源
最近更新 更多