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

ars1skjm  于 2023-11-21  发布在  Windows
关注(0)|答案(1)|浏览(153)

我们在Windows环境下开发了一个Java应用程序(OpenJDK 17 for Windows),但最近要求确保在MacOS下一切正常。即使它是一个Java应用程序,也可能发生一些事情,它确实发生了。
当我尝试导出一个文件时,正在使用的文件转换器(BasicFileConverter)在Windows和Ubuntu Linux下工作没有问题,但在MacOS下相同的操作会导致类转换异常。
java.lang.ClassCastException:类com.apple.laf. AquaFileServerUI无法强制转换为类javax.swing.plaf.basic. BasicFileServerUI(com.apple.laf. AquaFileServerUI和javax.swing.plaf.basic. BasicFileServerUI位于加载程序“bootstrap”的模块java.desktop中)
您可能会想,为什么我不直接使用JFileExcurser呢?但不幸的是,我需要能够获得GUI并动态更新文本字段中的文件名。
为此,我有以下代码://fileName是全局变量... Utilities.invokeLater(() -> ((BasicFileChooserUI) getUI()).setFileName(fileName));
因此,您可以看到,我需要FileDataServer中的“getUI()”,这样我就可以访问“setFileName”方法。
任何简单的变通方法都足够了。我想要这样:

  1. if (fileName != null && !fileName.isEmpty()) {
  2. val osType = doPrivileged(getOSTypeAction());
  3. if (osType == WINDOWS || osType == LINUX) {
  4. invokeLater(() -> ((BasicFileChooserUI) getUI()).setFileName(fileName));
  5. }
  6. if (osType == MACOSX) {
  7. invokeLater(() -> ((AquaFileChooserUI) getUI()).setFileName(fileName));
  8. }
  9. }

字符串
但是我不能从Windows JDK调用“AquaFileServerUI”。
有什么建议吗?

rmbxnbpk

rmbxnbpk1#

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

  1. Object ui = getUI();
  2. Method method = ui.getClass().getMethod("setFileName", String.class);
  3. method.invoke(ui, fileName);

字符串

相关问题