Java 文件选择器中的NPE

Java 文件选择器中的NPE,java,windows,javafx-2,Java,Windows,Javafx 2,我正在尝试在Windows7下运行一些javafx应用程序。它在archlinux下运行良好 我将按以下方式打开“文件选择器”对话框: @Override public void start(final Stage primaryStage) { FileChooser fileChooser = new FileChooser(); fileChooser.setInitialDirectory(myInitialDir); FileChooser.Extens

我正在尝试在Windows7下运行一些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)
有什么办法可以解决这个问题吗?

这是一个问题:

问题影响版本:2.2;修复版本/s:Lombard,因此修复程序在JFX8(JDK8)中可用

要解决此问题,请为初始文件夹调用
.getCanonicalPath()


开发商的意见:

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

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

和用户的评论:

Jason Winnebeck添加了一条评论-2013年3月18日下午4:30 我也遇到过这种情况,在stderr上打印了完全相同的COM错误,导致了NullPointerException。事实上,我一开始尝试了getAbsolutePath,但这并不适用于所有路径,对于一些必须使用getCanonicalPath的路径,谢天谢地,我找到了这个解决方案。因此,我没有太多额外的信息可以提供,除了这里有一些复制它的groovy代码:


无论其他设置如何(扩展筛选器、使用哪个窗口或null),都会发生此错误。使用
新文件(“.”)。canonicalFile
修复了问题,因此根据另一份报告,路径中的
可能是原因。

我对JavaFX一无所知,但是,您不应该使用
JFileChooser
而不是
FileChooser
?@tieTYT它是一个swing组件,在javafx应用程序中使用swing组件并不是那么简单。使用了哪个JFX构建?myInitialDir-正确地设置为特定于windows?谢谢。正是我需要的!
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 )
}