2011-09-20 57 views
4

更新 - 21/09/2011Java的面板没有完全更新偶尔

我已经做了代码的初始粗略审查,任何地点,它看起来像它的更新用户界面它通过这样做:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     // code goes here 
    } 
}); 

用户界面的主要更新发生在一个地方,首先做了上述包装,然后要求当前可见面板在该线程内更新自己,因此如果我理解正确,它应该在之内。 ?

这就是说,我可能会错过一些奇怪的地方。我目前正在与一些AspectJ的代码中,我发现这里的工作:

http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html

,看看这是否会突出显示任何奇怪的地方,它没有做正确的事。

除此之外,还有其他想法吗?

回复:透明度假设 - 这将如何表现出来?我在找什么?虽然我已经完成了一些改进代码的工作,但它大部分都是从以前的人手中继承下来的,所以我并不像以前那样熟悉它:)

回复:粘贴代码段 - 我很乐意但是,如果不缩小问题的范围,我想不出一个合理的限制片段来发布,但我实际上不知道代码中的问题可能存在于哪里。

感谢迄今为止所有的回应。

原来的问题

我们有一个第三方系统内部承载的应用程序。我们的部分是返回的JPanel,宿主应用程序(Lagan CRM)然后将该Panel嵌入到他们的应用程序中。

在大多数情况下,这很有效,但是偶尔会发生,并且在我们所知道的一个实现中,面板没有正确更新 - 就像某些东西阻止了面板的一部分被更新。

在下面的屏幕截图中,我们的JPanel正好位于底部,左上角基本上是“INFO”按钮。

这里有几张截图演示该问题:

在这个例子中,这个问题是围绕“去不可用”和“拨号”按钮区域可见。 Example 1

在这个例子中,这个问题是在同一个一般区,但它是不一样的尺寸,我们确实还没有发现关于该anomoly的面积/尺寸的任何共同点。 Example 2

在这个例子中,我与用户进行了更多的沟通,看起来发生了什么事是用户在当前调用之前发现了“GO UNAVAILABLE”按钮。然后,他们开始与来电者进行对话,这意味着系统应该在左上角显示“CONNECT”,下面是电话号码,右侧有HANGUP按钮。正如你所看到的,它只是在它的外面进行更新,中间区域有一个很大的区块,它根本没有更新过,并且仍然表现得好像它们不在通话中一样。除了看起来丑陋外,还会引起问题,因为有两个或三个按钮应该替代“GO UNAVAILABLE”,这意味着功能无法访问。 Example 3

我只是想展示几个例子,以便每次看到它们都是不同的块,但基本问题总是相同的。

一些基本统计:

  1. 只是发生在XP的机器。

  2. 只发生在大约10-15个使用它的站点中的一个客户站点上,但发生在该站点的所有机器上。

  3. 我问过关于窗口弹出的顶部,但他们知道他们已经给我一个截图的唯一一个,它并没有重叠很多,当然没有什么远程类似于这些模式。

  4. Java 1.5正在这个网站上使用,将100多个工作站更新到1.6并不是不可能的,但我需要有一些合理的迹象表明它会提供帮助。

  5. 我们有许多其他网站1.5没有这个问题。

  6. 我们已经问过在机器上可能运行的其他软件,说实话,它们很少,因为它们是联络中心代理工作站,并且紧紧地停下来。

  7. 一旦主叫方挂机,该面板会自动关闭,但这意味着座席有效地丢失了该呼叫,因为他们无法对其执行任何操作。这对我意味着它基本上被阻止了更新,而不是被持续阻止。

  8. 面板在SWING中实现,没有什么特别的花哨。

任何提示,提示,指导,其他问题的建议我可以得到答案 - 甚至更好的解决方案:)将非常感激地收到。

+5

看起来像违反了美国东部时间法则(所有访问所有组件_必须在美国东部时间发生) – kleopatra

+2

某些代码会很有用,特别是您的面板如何连接到主机应用程序(监听器,事件... ?)第二个kleopatra对EDT规则违规发表了评论。也许你从EDT之外的主机应用程序收到通知,并且你的代码直接修改了UI? – jfpoilpret

+2

可能是关于面板的默认[不透明度](http:// java。 sun.com/products/jfc/tsc/articles/painting/index.html#props);它因L&F而异 – trashgod

回答

1

既然我无法看到代码这个答案是什么,你可以尝试用信息做更多的我:)

  1. 更新一个JPanel是棘手的,如果不是从美国东部时间完成。即使从EDT完成,我在尝试更改JPanel的整个结构并重新绘制时也遇到了问题。相反,在这些地方,我改用了JTabbedpane。放下一个标签并重新创建它。更容易做到。我不确定这是否有助于这种情况。
  2. 接下来的布局。你在使用任何布局管理器吗?如果你有绝对定位的东西,那么根据显示器的尺寸和分辨率,所有的东西都会失灵。我会推荐使用JGoodies - Forms布局。链接在这里 - http://www.jgoodies.com/freeware/forms/

抱歉不能更多的帮助..:(

+0

我已经更新了处理更新的方式,并在日志中添加了一些额外的代码,以便我们可以在EDT线程之外执行任何UI内容,并将它们绑定并加以支撑。从粗略的一瞥它*看起来很好,但希望用新的皮带和支架它不应该更新EDT之外的屏幕。 –

+0

布局经理正在使用,没有什么绝对的。 :) –