カテゴリー
プログラミング 未分類

ControlsFX 導入後に NetBeans 8.1 からの SceneBuilder 8.2 の起動に失敗する障害

再現方法

  1. プラットホームは Windows 10 64-bit 版。
  2. ControlsFX (version 8.40.10) というオープン・ソースのライブラリを利用する為、NetBeans で構築したプロジェクトホームの直下に lib/ を作り、controlsfx-8.40.10.jar を配置。
  3. SceneBuilder を単独で起動して、プロジェクトで使う FXML を開き、歯車アイコン中の”Import JAR/FXML file…” というメニューから controlsfx-8.40.10.jar を選択。
  4. Custom から StatusBar コントロールを選択して ”Hierarchy” の所定の位置へ配置。
  5. FXML を保存後、SceneBuilder を閉じる。
  6. NetBeans を起動して、今回のプロジェクトを開き、プロジェクトツリーから当該 FXML をダブルクリック。
  7. 従来なら SceneBulder が自動的に起動して FXML も同時にオープンされるが、そのようにならず次のようなダイアログが表示されて失敗するようになった。
    Could not open '[NAME].fxml' Open operation has failed. Make sure the chosen file is a valid FXML document.
    Could not open ‘[NAME].fxml’ Open operation has failed. Make sure the chosen file is a valid FXML document.
  8. “Show Details…”ボタンを押すと次のようなスタックトレースが表示される。
    java.io.IOException: javafx.fxml.LoadException: 
    /MYPROFILE/Documents/NetBeansProjects/PATH/TO/MYPROJECTHOME/form/[NAME].fxml
    
    	at com.oracle.javafx.scenebuilder.kit.fxom.FXOMLoader.load(FXOMLoader.java:92)
    	at com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument.<init>(FXOMDocument.java:82)
    	at com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument.<init>(FXOMDocument.java:97)
    	at com.oracle.javafx.scenebuilder.kit.editor.EditorController.updateFxomDocument(EditorController.java:2384)
    	at com.oracle.javafx.scenebuilder.kit.editor.EditorController.setFxmlTextAndLocation(EditorController.java:664)
    	at com.oracle.javafx.scenebuilder.app.DocumentWindowController.loadFromFile(DocumentWindowController.java:381)
    	at com.oracle.javafx.scenebuilder.app.SceneBuilderApp.performOpenFiles(SceneBuilderApp.java:554)
    	at com.oracle.javafx.scenebuilder.app.SceneBuilderApp.handleOpenFilesAction(SceneBuilderApp.java:424)
    	at com.oracle.javafx.scenebuilder.app.SceneBuilderApp.handleLaunch(SceneBuilderApp.java:403)
    	at com.oracle.javafx.scenebuilder.app.AppPlatform.requestStartGeneric(AppPlatform.java:139)
    	at com.oracle.javafx.scenebuilder.app.AppPlatform.requestStart(AppPlatform.java:106)
    	at com.oracle.javafx.scenebuilder.app.SceneBuilderApp.start(SceneBuilderApp.java:353)
    	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
    	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
    	at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
    	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    	at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191)
    	at java.lang.Thread.run(Thread.java:745)
    Caused by: javafx.fxml.LoadException: 
    /MYPROFILE/Documents/NetBeansProjects/PATH/TO/MYPROJECTHOME/form/[NAME].fxml
    
    	at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    	at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2848)
    	at javafx.fxml.FXMLLoader.processImport(FXMLLoader.java:2692)
    	at javafx.fxml.FXMLLoader.processProcessingInstruction(FXMLLoader.java:2661)
    	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2517)
    	at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2425)
    	at com.oracle.javafx.scenebuilder.kit.fxom.FXOMLoader.load(FXOMLoader.java:89)
    	... 20 more
    Caused by: java.lang.ClassNotFoundException: org.controlsfx.control.StatusBar
    	at java.lang.ClassLoader.findClass(ClassLoader.java:530)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    	at javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:2916)
    	at javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2905)
    	at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2846)
    	... 25 more
    

回避方法

  1. 次のコマンドで、SceneBuilder.cfg を探す
  2. dir /b /s "%UserProfile%" | findstr "SceneBuilder.cfg"
    
  3. SceneBuilder.cfg をエディタで開き、次のように改修する
    • 改修前
      app.classpath=
      
    • 改修後
      app.classpath=$APPDIR/../../../Documents/NetBeansProjects/PATH/TO/MYPROJECTHOME/lib/controlsfx-8.40.10.jar
      
    • 以上で対策完了。NB の再起動は不要。

所感