我正在开发一个大型遗留Java应用程序,其中一个重要功能是基于监视器分辨率自动扩展GUI组件。我们正在将运行它的JVM从1.4.2升级到1.6,现在由于java.awt.Container.getPreferredSize()的实现发生了变化而导致缩放。
getPrefferedSize用于返回与setPreferredSize()相同的对象(所有内容也适用于最小/最大大小),因此我们要做的是使用java.awt.Dimension的特定子类在每个缩放组件上调用setPRefferedSize ,然后我们将走分组层次结构,并在分辨率改变时更新每个缩放组件。
但是在Java 1.6中,getPreferredSize返回您传递的Dimension对象的副本,因此它不再是正确的类型,也没有任何内容可以缩放。
我通过将类放在类路径上的JRE前面,使用我自己的实现(感谢开源JRE)来覆盖Component类,从而很快地破解了一个解决方案。然而,这种解决方案显然无法维持。
有没有其他人知道这个问题的任何其他解决方案,你将如何在java 1.5 / 1.6中实现GUI扩展?
答案 0 :(得分:2)
听起来他们在1.6中比以前更好地保护组件的内部状态。也许他们在其上运行了FindBugs并修复了bug。
当我第一次阅读这个问题时,我想到了Java 1.6u10。它包含一个名为Nimbus的新外观,它通过使用矢量图形绘制所有界面组件来支持高DPI显示。
然而,在稍微阅读问题并尝试理解您所说的内容后,我建议您使用布局管理器重写用户界面,布局管理器将为您管理内部组件的大小。我的感觉是,按照你的建议来管理组件尺寸并不是一个好主意。如jjnguy所示,您可以使用GridBagLayout。布局管理器还有许多其他选择。有一个question posted提供了对每个人最喜欢的布局管理器的调查,如果你正在寻找与GridBagLayout不同的东西。
答案 1 :(得分:0)
更改布局管理器似乎是一个很好的解决方案,但在这种情况下,需要对UI进行全面的重新设计(包括数千个组件),因此这对于此应用程序来说并不是真正的实用解决方案。