如何处理Java 11中缺少的Swing plaf.windows类?

如何处理Java 11中缺少的Swing plaf.windows类?,java,swing,api,internals,Java,Swing,Api,Internals,我正在将一个多平台(Windows和Linux)桌面应用程序从java8迁移到OpenJDK 11。 代码扩展了一个Swing类,为此我们定义了一个扩展WindowsTabbedPaneUI内部API类的新类。当应用程序在Windows上运行时使用此类 该代码执行以下操作: ... if (this.getUI() instanceof WindowsTabbedPaneUI) { this.setUI(new CustomWindowsTabbedPaneUI());

我正在将一个多平台(Windows和Linux)桌面应用程序从java8迁移到OpenJDK 11。 代码扩展了一个Swing类,为此我们定义了一个扩展
WindowsTabbedPaneUI
内部API类的新类。当应用程序在Windows上运行时使用此类

该代码执行以下操作:

   ...
   if (this.getUI() instanceof WindowsTabbedPaneUI) {
       this.setUI(new CustomWindowsTabbedPaneUI());
   }
   ...
其中
CustomWindowsTabbedPaneUI
扩展了
WindowsTabbedPaneUI

这在Java8中运行良好。但是,现在当我在java 11 jre上运行时,它会引发以下异常:

java.lang.Exception: java.lang.NoClassDefFoundError: com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI
启动应用程序时,我尝试使用--add opens和--add exports选项,但无法使其正常工作。 我知道原因是LinuxJREforJava11不包括这个类。 我相信是这样的,因为运行下面的命令不会列出
com.sun.java.swing.plaf.windows
包:

java --describe-module java.desktop

非常感谢您的帮助。

谢谢卡洛斯。我读过那篇文章。然而,这表明了如何在编译时解决问题,这只是在运行时推送问题(请参阅)。我现在需要的是运行时的解决方案。如果你的应用程序是多平台的,并且包含Windows特定的代码,那么它必须也包含linux特定的代码,不是吗?因此,对于从JDK中删除的特定于linux的类,您也会遇到同样的问题。它使用了linux的基本外观,从BasicTabbedPaneUI进行扩展。但是你是对的,因为我现在计划使用金属外观。只需检查基本的非内部类
BasicTabbedPaneUI
。如果需要的话,可以检查一下窗户。