如何修改外观系统 class 例如 com.sun.java.swing.plaf.windows.WindowsTableHeaderUI

How do I modify a look and feel system class such as com.sun.java.swing.plaf.windows.WindowsTableHeaderUI

我需要对这个 class 进行更改,我没有办法以正常方式仅 subclass。所以我可以修改 java 文件(或制作它的副本)但是如何让我的 Swing 应用程序使用这个版本而不是 Java 运行时提供的版本?

我想做的是复制 com.sun.java.swing.plaf.windows.WindowsTableHeaderUI 并修复它,所以我不能只创建 class 的副本并将其放入我自己的 pacakage 层次结构中,因为我不这样做可以访问 class 中提到的许多 classes(例如 XPStyle),那么我该如何替换系统 class?

所以我按如下方式工作:

  1. git 克隆 https://github.com/AdoptOpenJDK/openjdk-jdk11.git

  2. 将以下文件从 src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows - WindowsTableHeaderUI.javaTMSchema.javaXPStyle.java 复制到我的代码树中

  3. 修改了这三个文件的包声明以匹配它们的放置

  4. 添加以下内容以允许找到内部 classes

    --add-exports java.desktop/sun.awt.windows=ALL-UNNAMED

    --add-exports java.desktop/sun.awt.image=ALL-UNNAMED

    --add-exports java.desktop/sun.swing.table=ALL-UNNAMED

    --add-exports java.desktop/sun.swing=ALL-UNNAMED

    --add-exports java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED --add-exports java.base/sun.security.action=ALL-UNNAMED

  5. 一些小改动以允许 classes 编译

  6. 实现了我对 WindowsTableHeaderUI 的修复 class

  7. 在应用程序中使用,但仅在 Windows 和

    上使用
     if(Platform.isWindows())
     {
          UIManager.put("TableHeaderUI","com.jthink.jaikoz.tablerenderer.windows.WindowsTableHeaderUI");
     }
    
  8. 在 MacOS/Linux 等其他平台上构建时,我删除了 windows java 文件(WindowsTableHeaderUI.javaTMSchema.javaXPStyle.java) 因为我们只在 Windows 上使用这些 classes 来构建代码。