1

我正在开发一个大型遗留 Java 应用程序,该应用程序的一个重要功能是基于监视器分辨率自动缩放 GUI 组件。我们正在将运行它的 JVM 从 1.4.2 升级到 1.6,但由于 java.awt.Container.getPreferredSize() 的实现发生了变化,现在缩放被破坏了。

getPreferredSize 用于返回您使用 setPreferredSize() 提供的相同对象(一切也适用于最小/最大尺寸),所以我们要做的是在每个具有特定子类 java.awt.Dimension 的缩放组件上调用 setPRefferedSize,然后我们将遍历组件层次结构并在分辨率更改时更新每个缩放组件。

但是在 Java 1.6 中 getPreferredSize 返回您传递给它的 Dimension 对象的副本,因此它不再是正确的类型,并且没有任何内容可以缩放。

我通过将组件类放在类路径上的 JRE 前面,用我自己的实现(感谢开源 JRE)覆盖组件类,很快就破解了一个解决方案。然而,这个解决方案显然是不可维护的。

有没有人知道这个问题的任何其他解决方案,你将如何在 java 1.5/1.6 中实现 GUI 缩放?

4

2 回答 2

2

听起来他们在 1.6 中比以前更好地保护了组件的内部状态。也许他们在上面运行了FindBugs并修复了这个错误

当我第一次看到这个问题时,我想到了 Java 1.6u10。它包括一个名为Nimbus的新外观,它通过使用矢量图形绘制所有界面组件来支持高 DPI 显示。

但是,在稍微慢一点地阅读问题并尝试理解您在说什么之后,我建议您使用将为您管理内部组件大小的布局管理器重写用户界面。我的感觉是,按照您的建议手动管理组件大小确实不是一个好主意。正如jjnguy所建议的,您可以使用 GridBagLayout。布局管理器还有许多其他选择。如果您正在寻找与 GridBagLayout 不同的东西,则发布了一个问题,该问题提供了对每个人最喜欢的布局管理器的调查。

于 2008-10-09T18:19:06.857 回答
0

更改布局管理器似乎是不错的解决方案,但在这种情况下,需要对 UI 进行完全重新设计(其中包括数千个组件),因此对于此应用程序来说,这并不是一个实际的解决方案。

于 2008-10-09T18:49:51.523 回答