gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:04:31 25 4
gpt4 key购买 nike

我有一个应用程序,它根据用户输入更改 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com