java - 当屏幕上显示 JPanel 时,如何获得通知

标签 java swing notifications render

我有一个应用程序,它根据用户输入更改 JFrame 的全部内容。为此,我删除了包含当前组件的 JPanel 并将其替换为具有新组件的新 JPanel。 之后,其中一个组件需要获得焦点,并且 JScrollpane 应该滚动到该组件。在大多数情况下,这可以正常工作。 现在有一个场景导致添加了一个 JPanel,它本身包含 500 多个组件。渲染这需要一些时间,似乎 scrollRectToVisible() 在 UI 未完全渲染的某个点被调用。如果我调试,我实际上可以看到它首先滚动到正确的位置,但随后完成了进一步的渲染,并且组件再次移出视口(viewport)。

所以我试图找到一个监听器,当渲染完全完成时调用它。我尝试使用 ComponentListener 和 AnchestorListener。两者都没有收到我所期待的大部分事件。但即使他们这样做了,回调方法也会在屏幕上显示任何 UI 更改之前被调用。

我在 EDT 中交换 JPanel,然后在 JFrame 上调用 validate()。之后我不再处理任何进一步的代码。但是,如果我在最后执行的行中设置断点并更进一步,屏幕上的 UI 并没有改变。 EDT 正在积极地做一些事情(我假设渲染 UI)。我希望在 EDT 完成渲染时收到通知。

我尝试的另一件事: 如果我创建另一个只 hibernate 几秒钟的线程(直到 UI 明确呈现)然后调用 scrollRectToVisible(),一切正常。

很抱歉不能提供 SSCCE。我试过了,但它似乎相当复杂。我真的很感激任何关于如何在 UI 上得到通知的想法,该 UI 已完全呈现并对用户可见。

谢谢

最佳答案

If I create another Thread that just sleeps for a few seconds (until the UI is definitely rendered) and call the scrollRectToVisible() then, everything works fine.

不是 hibernate ,而是将 scrollRectToVisibl() 代码包装在 SwingUtilities.invokeLater() 中。这会将代码添加到 EDT 的末尾,因此应在所有其他渲染之后对其进行处理。

关于java - 当屏幕上显示 JPanel 时,如何获得通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15769489/

相关文章:

ios - 向多个 iOS 设备发送推送通知时有限制吗?

forms - Ajax POST 成功时的 Jquery 通知

android - 旧 Android 版本上的 bundle 通知

java - java中的标记接口(interface)到底是什么?

java - 在实例上调用 new,例如 pc.new InnerClass() ——发生了什么?

docker容器中的Java服务未连接到主机mysql

java - 在 IF 语句中比较 JPasswordfield 和 JTextField 继续执行 else 语句

java - 无法将 JFileChooser 与 BorderLayout.NORTH 的左侧对齐

java - 为什么阿拉伯字母没有插入数据库?

java - 如何创建火烈鸟丝带菜单?