我看到了JPopupMenu和JComboBox的一个非常奇怪的问题。当应用程序负载很重时,有时我们的弹出菜单会显示正确的大小和位置,但就像空白的灰色框一样。
我们认为另一个问题是,有时候,我们看到标准JComboBox看起来好像没有任何项目(即它们没有下拉)。当应用程序没有负载时,我们已经看到了这个问题。他们没有进行数据库调用,或类似的东西来填充组合框项目 - 他们使用硬编码的项目。
我已将弹出菜单创建放在SwingUtils.invokelater调用中,这有帮助,但没有让问题彻底消失。我不知道如何改变组合框的行为。如果我们再次右键单击,将重新出现上下文菜单 - 完全填充。为了让组合框再次正常工作,我们只需关闭包含它们的对话框,然后再将其打开。
我们在标准桌面应用中使用Java 1.6.17。是否有一个我不知道的错误,或者其他可以解决它的错误,或者至少帮助我们知道还有什么可能会发生?
答案 0 :(得分:4)
所有 GUI组件都应构造为“on the event dispatch thread”,并且必须正确同步对另一个线程拥有的任何数据的访问。在Memory Consistency Properties下有一个很好的摘要。
附录:@Boro提出了与此问题相关的两个引人注目的要点。
我从来没有遇到过这种问题,我想看一个。
问题的间歇性仅暗示不正确的同步,但相反的证据是difficult。受影响的系统可能太大而无法通过检查来纠正;遗憾的是,sscce会被设计,显然是不正确的。
代码中可能还有其他内容,因为
invokeLater()
没有完全帮助。
一个常见的情况是ListModel
懒惰地构建,可能在另一个线程上构建。一种方法是记录EventQueue
并按建议here查找异常。