【问题标题】:When exactly are components realized in SwingSwing 中的组件究竟是什么时候实现的
【发布时间】: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


【解决方案1】:

我在滚动窗格中遇到了同样的问题,请尝试在它们上设置以下属性:

scrollpane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);

就像在 cmets 中一样,所有 Swing 组件都必须在 EDT 上创建,否则就会发生奇怪的事情。

【讨论】:

  • @haferblues 闻起来很像对症下药……一定要跟踪并解决真正的问题,它迟早会再次咬你的 ;-)跨度>
  • 很有可能,但有时你只是想继续前进,做你应该做的事情。特别是如果它是为了好玩,就像我遇到问题时那样。
猜你喜欢
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2014-09-09
相关资源
最近更新 更多