如何避免 Windows 和 MacOS 之间的类转换异常?

问题描述 投票:0回答:1

我们在Windows环境下开发Java应用程序(OpenJDK17 for Windows),但最近需要确保一切都可以在MacOS下运行。 尽管它是一个 Java 应用程序,但有些事情可能会发生,而且它确实发生了。

当我尝试导出文件时,正在使用的文件选择器 (BasicFileChooser) 在 Windows 和 Ubuntu Linux 下工作没有问题,但在 MacOS 下的相同操作会导致类转换异常。

java.lang.ClassCastException: com.apple.laf.AquaFileChooserUI 类无法转换为 javax.swing.plaf.basic.BasicFileChooserUI 类 (com.apple.laf.AquaFileChooserUI 和 javax.swing.plaf.basic.BasicFileChooserUI 位于加载程序“bootstrap”的 java.desktop 模块中)

您可能会想为什么我不直接使用 JFileChooser,但不幸的是我需要能够获取 GUI 并动态更新文本字段中的文件名。

为此,我有以下代码: //fileName 在这里是全局变量...

Utilities.invokeLater(() -> ((BasicFileChooserUI) getUI()).setFileName(fileName));

所以你看,我需要 FileChooser 中的“getUI()”,这样我就可以访问“setFileName”方法。

任何简单的解决方法就足够了。 我想要这个:

if (fileName != null && !fileName.isEmpty()) {
    val osType = doPrivileged(getOSTypeAction());
    if (osType == WINDOWS || osType == LINUX) {
      invokeLater(() -> ((BasicFileChooserUI) getUI()).setFileName(fileName));
    }
    if (osType == MACOSX) {
      invokeLater(() -> ((AquaFileChooserUI) getUI()).setFileName(fileName));
    }
 }

但是我无法从 Windows JDK 调用“AquaFileChooserUI”。

有什么建议吗?

java windows macos filechooser
1个回答
1
投票

您可以使用反射,假设该方法在所有平台上命名相同:

Object ui = getUI();
Method method = ui.getClass().getMethod("setFileName", String.class);
method.invoke(ui, fileName);
© www.soinside.com 2019 - 2024. All rights reserved.