【问题标题】:How do I modify a look and feel system class such as com.sun.java.swing.plaf.windows.WindowsTableHeaderUI如何修改外观系统类,例如 com.sun.java.swing.plaf.windows.WindowsTableHeaderUI
【发布时间】:2022-02-04 16:15:38
【问题描述】:
我需要对这个类进行更改,我无法以正常方式进行子类化。所以我可以修改 java 文件(或制作它的副本),但是如何让我的 Swing 应用程序使用这个版本而不是 Java 运行时提供的版本?
我要做的是复制 com.sun.java.swing.plaf.windows.WindowsTableHeaderUI 并修复它,所以我不能只创建类的副本并将其放入我自己的 pacakage 层次结构中我无法访问该类中提到的许多类(例如 XPStyle),那么如何替换系统类?
【问题讨论】:
标签:
java
swing
look-and-feel
【解决方案1】:
所以我得到它的工作如下:
-
git 克隆https://github.com/AdoptOpenJDK/openjdk-jdk11.git
-
将以下文件从 src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows - WindowsTableHeaderUI.java、TMSchema.java、XPStyle.java 复制到我的代码树中
-
修改了这三个文件的 package 语句以匹配它们已放置的位置
-
添加以下内容以允许找到内部类
--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
-
允许类编译的一些小改动
-
实现了我对 WindowsTableHeaderUI 类的修复
-
在应用程序中使用,但仅在 Windows 上使用
if(Platform.isWindows())
{
UIManager.put("TableHeaderUI","com.jthink.jaikoz.tablerenderer.windows.WindowsTableHeaderUI");
}
-
在 MacOS/Linux 等其他平台上构建时,我会删除 windows java 文件(WindowsTableHeaderUI.java、TMSchema.java、XPStyle.java),因为我们只在 Windows 上使用这些类来允许构建代码。