java - 覆盖 JComponent.getBaselineResizeBehavior() 但保持 Java5 兼容性

标签 java swing baseline

对于我的 Swing 项目,我需要同时支持 Java 5Java 6。 我已经定义了一个自定义的 JComponent(称之为 Picture),在将它嵌入到 JScrollPane 中之后,我把它放在了一个 JPanel 中 使用 DesignGridLayout 管理器。

得益于 swing-layout 开源库,DesignGridLayout 支持基线对齐(实现对 Java 5 的基线支持并提供与新的 Java 6 基线支持的兼容性)。

我的 Pictureoverrides public int getBaseline(int width, int height) 以便我可以为其定义正确的基线。请注意,“override”并不完全正确:它覆盖了 Java6 上的方法,但在 Java5 中定义了它。

当我在 Java5 上运行我的示例应用程序时,一切正常:正确使用了我定义的 Picture 基线。

但是,当我使用 Java6 时,我的 Picture#getBaseline() 方法没有被调用!当然,我的图片的基线对齐很糟糕(居中)。

检查 Java6 源代码后,我看到,在 BasicScrollPaneUI 中,getBaseline() 首先调用视口(viewport)组件上的 getBaselineResizeBehavior() (我的 Picture 实例)。 只有当 getBaselineResizeBehavior() 返回 Component.BaselineResizeBehavior.CONSTANT_ASCENT 时,它才会调用 getBaseline()

现在我的问题是 getBaselineResizeBehavior()JComponent 的 Java6 方法,我无法在 Java5 中实现它,因为它返回一个枚举 Component.BaselineResizeBehavior 在 Java5 中不存在。

所以我的问题(最后)是:如何实现(或模拟?)getBaselineResizeBehavior() 以便我的类仍然可以在 Java5 环境中编译和运行?

最佳答案

我会创建一个 Picture 的子类,可能称为 PictureJava6,它实现了 getBaselineResizeBehaviour(),并且在创建 Picture 的实例时,执行:

public Component pictureFactory() {
    if(javaVersion > "1.6") {
        return new PictureJava6();
    } else {
        return new Picture();
    }
}

关于java - 覆盖 JComponent.getBaselineResizeBehavior() 但保持 Java5 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/411982/

相关文章:

html - CSS 基线网格 : Headings & wrapping

java - 如何使用正则表达式检测所有冗余类型(菱形运算符)?

java - 半透明 JLabel 未正确显示背景

java - 在Sqoop文件导入中,我想使用定义的映射器在文件拆分中控制导入的数据

java - 我正在用 Java 编写屏幕捕获模块,但在将屏幕截图写入磁盘时遇到严重的性能问题。我还可以做些什么?

java swing 裁剪问题

Azure安全中心: Handle multiple databases with identical baseline

asp.net - 负载测试和分析 ASP.NET Web 应用程序的当前最佳实践是什么?

java - 如何扩展 BufferedImage 以创建由多个 BufferedImage 组成的 "animated image"

java - ServletContext 类型的 getContextPath() 方法未定义