【发布时间】:2013-01-07 08:52:54
【问题描述】:
我正在开发一个应用程序,其中所有 UI 组件都是通过 XML 文件定义的。我阅读了 xml 并根据它组成了 UI。在用户进行一些更改后,会提供一个新的 XML 并相应地刷新 UI。现在我遇到了一些非常烦人的渲染问题,尤其是在几个滚动区域中,UI 的任一部分被剪切(并且只有在我调整窗口大小时才可见)或者滚动条已经滚动到某个点,但它应该只是显示内容的顶部。
我认为这是一个事件调度线程问题,并在这里找到了一些非常有用的信息:http://www.javapractices.com/topic/TopicAction.do?Id=153
您可以在此处阅读:“该线程(EDT)在组件实现后变为活动状态:pack、show 或 setVisible(true) 已被调用”
解析 XML 不在 EDT 中完成,并且还实例化组件并将它们添加到它们的父面板。只有在创建了所有组件之后,它们才会最终通过 EDT 添加到 MainPane。 然而,在某些情况下,创建组件并将它们添加到面板中似乎已经启动了 EDT。所以事情就搞砸了。
是否有人详细了解哪些方法调用 pack、show 或 setVisible(true) 并因此启动 EDT?
非常感谢
【问题讨论】:
-
是否有人详细了解哪些方法调用了 pack、show 或 setVisible(true) 那么您正在调用这些方法之一,因此会触发 EDT 的初始化。不管怎样,只是为了简化你的生活,在 EDT 上创建你所有的 UI 东西。您可以使用
SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()轻松执行此操作 -
@haferblues :但请记住注意
SwingUtilities.invokeAndWait(),这个比前一个更难使用。如果不小心处理,它可能会导致deadlocks/run conditions和其他东西。 -
基本问题的第一站是阅读关于它的 the 教程的corresponding chapter :-) 简而言之:“已实现”不再是一个有效的概念,每一个对所有 Swing 组件的 any 属性的访问必须始终发生在 EDT 上。
标签: java multithreading swing user-interface