重用初始化耗时的 Swing 组件
Posted
技术标签:
【中文标题】重用初始化耗时的 Swing 组件【英文标题】:Reusing Swing components which are time-consuming to initialize 【发布时间】:2011-08-20 10:28:09 【问题描述】:如果我的应用程序中有一个庞大的 Swing 组件需要很长时间来初始化,并且想同时在我的 GUI 的不同位置显示该组件,我最好如何做到这一点?
GUI 用户必须能够与组件的不同副本进行交互 (例如,它们可以用作镜子)。
假设您可能希望根据 GUI 用户的输入动态显示该组件的副本(也就是说,我们不希望预加载同一组件的多个副本)。
【问题讨论】:
你的意思是他们都表现出同样的事情还是有点独立?如果它们是镜子,那么如果主要组件依赖于诸如焦点之类的东西,那么您可能会遇到绘画问题。 @Christopher 副本不一定要像镜子一样,但如果他们这样做,那就没问题了 【参考方案1】:以不同的方式显示此组件 同时在我的 GUI 中放置... 无需创建新的副本 相同的组件...用户必须能够与不同的副本进行交互
没办法。
【讨论】:
我现在已经更新了问题 =)。然而,最初的问题实际上是可以解决的,但解决方案可能不是一个好主意。【参考方案2】:我会创建一个组件的实例(比如说 HeavyComponent)和一个扩展的自定义类,例如JPanel 并引用该组件。我们将其命名为 MyContainer。在 MyContainer 的 paintComponent() 上,我会将原始组件绘制到 BufferedImage 中或使用heavyComponentReference.paint(g)。 然后在点击 MyContainer 时,我会将替换面板的组件替换为 HeavyComponent 的真实实例,并将其放置在 HeavyComponent 的旧位置,新的 MyContainer 实例。
【讨论】:
我喜欢这实际上是如何回答问题的 =)。由于必须拦截单击并将其传递给“真实”实例,因此在鼠标悬停时切换可能更容易? 为什么不呢?这也是可能的,但每次删除/添加都需要重新验证和重新绘制,因此可以经常调用它并且可能会出现性能问题。【参考方案3】:您需要更改组件才能以类似模型视图的方式访问数据。每个组件都需要指向同一个模型,该模型将提供数据并执行一次而不是多次密集型任务。
此外,初始化会减慢 GUI,然后听起来您需要启动屏幕或进度条,并且任务已移出 EDT。
【讨论】:
感谢您的建议 =)。这可能是我通常会这样做的方式。但是,对我来说问题是我使用的是相当大的第三方组件,并且需要大量时间来重写【参考方案4】:有没有什么办法可以将繁重的初始化代码拉出来,也许放到一个“...工厂”类中?
【讨论】:
我不太确定如何解决它。你能详细说明一下吗? 啊我明白了,它是一个第三方组件,你不能修改它的源代码。我以为您正在开发自己的组件,并且至少可以提取一些初始化代码。以上是关于重用初始化耗时的 Swing 组件的主要内容,如果未能解决你的问题,请参考以下文章