4

我正在尝试在 Windows 7 下运行一些 javafx 应用程序。它在 archlinux 下运行良好。

我通过以下方式打开文件选择器对话框:

  @Override
  public void start(final Stage primaryStage) {
    FileChooser fileChooser = new FileChooser();
    fileChooser.setInitialDirectory(myInitialDir);
    FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("Wav files (*.wav)", "*.wav");
    fileChooser.getExtensionFilters().add(extFilter);
    File file = fileChooser.showOpenDialog(primaryStage);
  }

我上面提到的 - 在linux下一切都很好,但在windows下我得到奇怪的NPE:

Error:80070057 in SHCreateItemFromParsingName((PCWSTR)folder, NULL, IID_IShellItem, (void **)&pItem)
COM Error:80070057 0@0.
Error:80004005 in pOpenDialog->GetResults(&pFiles)
COM Error:80004005 5>?>7=0==0O >H81:0
java.lang.NullPointerException
    at com.sun.glass.ui.CommonDialogs.showFileChooser(CommonDialogs.java:120)
    at com.sun.javafx.tk.quantum.QuantumToolkit.showFileChooser(QuantumToolkit.java:1486)
    at javafx.stage.FileChooser.showDialog(FileChooser.java:285)
    at javafx.stage.FileChooser.showOpenDialog(FileChooser.java:234)
    at ru.gkalabin.diploma.gui.equalizer.EqualizerDemo$1.handle(EqualizerDemo.java:107)

有什么想法可以解决这个问题吗?

4

1 回答 1

4

这是问题:

RT-21999 Win: FileChooser 不接受有效的初始目录

问题影响版本:2.2;Fix Version/s :Lombard,因此 JFX8(在 JDK8 中)中提供了修复。

要解决此问题,请调用<fileName>.getCanonicalPath()初始文件夹。


开发者评论:

此问题特定于 Windows 7。它不能在旧版本的 Windows 上重现。

一种解决方法是将绝对路径作为文件选择器的初始目录传递(请参阅 File.getAbsolutePath()/getCanonicalPath())。

来自用户的评论:

Jason Winnebeck 添加了一条评论 - 2013 年 3 月 18 日下午 4:30 我也遇到了这种情况,将完全相同的 COM 错误打印到 stderr,导致 NullPointerException。实际上,我最初尝试了 getAbsolutePath,但这不适用于所有路径,对于某些您必须使用 getCanonicalPath 的路径,谢天谢地,我找到了这张票,它给了我解决方法。所以,我没有太多额外的信息可以提供,除了这里有一些重现它的常规代码:

public void openFile() throws IOException {
  FileChooser chooser = new FileChooser()
  chooser.title = "Select FXML"
  chooser.setInitialDirectory( new File( "." ) );
  chooser.extensionFilters.add( new FileChooser.ExtensionFilter( 
    "FXML or SVG Files",
    ["*.fxml", "*.svg"] 
  ))

  Window window = sceneProperty.get().window
  File selected = chooser.showOpenDialog( window )
}

无论其他设置如何(扩展过滤器,使用哪个 Window 或 null),都会发生错误。使用new File( "." ).canonicalFile修复了问题,因此根据其他报告,似乎有...在路径中是可能的原因。

于 2013-05-29T19:37:29.493 回答