【发布时间】:2010-09-29 13:05:16
【问题描述】:
对于我的 Swing 项目,我需要同时支持 Java 5 和 Java 6。
我定义了一个自定义JComponent(称为Picture),在将其嵌入JScrollPane 后,我将其放入使用DesignGridLayout 管理器的JPanel。
DesignGridLayout 支持基线对齐,这要归功于 swing-layout 开源库(实现对 Java 5 的基线支持并提供与新的 Java 6 基线支持的兼容性)。
我的Picture 类覆盖 public int getBaseline(int width, int height) 以便我可以为它定义一个正确的基线。请注意,“override”并不完全正确:它覆盖了 Java6 上的方法,但在 Java5 中定义了它。
当我在 Java5 上运行示例应用程序时,一切都很好:我定义的 Picture 基线使用正确。
但是,当我使用 Java6 时,我的 Picture#getBaseline() 方法不会被调用!当然我的图片的基线对齐很糟糕(居中)。
在检查 Java6 源代码后,我看到,在 BasicScrollPaneUI 中,getBaseline() 首先在视口组件(我的 Picture 实例)上调用 getBaselineResizeBehavior()。
只有当getBaselineResizeBehavior()返回Component.BaselineResizeBehavior.CONSTANT_ASCENT时,它才会调用getBaseline()。
现在我的问题是getBaselineResizeBehavior() 是JComponent 的Java6 方法,我无法在Java5 中实现它,因为它返回一个枚举Component.BaselineResizeBehavior,它在Java5 中不存在。
所以我的问题(最终)是:我如何实现(或模拟?)getBaselineResizeBehavior() 以便我的类仍然可以在 Java5 环境中编译和运行?
【问题讨论】:
-
实际上,javac 中最好有“条件编译”(就像在 C/C++ 中一样)。
-
条件编译不是很好——然后你需要两个发行版。反射对此效果更好(我已经做过很多次了) - 请参阅我的答案。
-
如果条件编译是语言的一部分,那就太好了,但这是另一场争论......也许 AOP 可以帮助解决这个问题(但我想避免一个重度依赖的重度解决方案,只是为了这个“小”问题。