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; 修正バージョン: Lombard であるため、修正は JFX8 (JDK8) で利用できます。

<fileName>.getCanonicalPath()この問題を解決するには、初期フォルダーを呼び出します。


開発者からのコメント:

この問題は Windows 7 固有の問題です。古いバージョンの Windows では再現できません。

回避策は、ファイル チューザーの初期ディレクトリとして絶対パスを渡すことです (File.getAbsolutePath()/getCanonicalPath() を参照)。

そしてユーザーからのコメント:

Jason Winnebeck がコメントを追加しました - 2013 年 3 月 18 日 04:30 PM 私もこれに遭遇しました。まったく同じ 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すると問題が解決するため、他のレポートに基づいて、パスに.andがあることが原因である可能性が高いようです。..

于 2013-05-29T19:37:29.493 に答える