再現方法
- プラットホームは Windows 10 64-bit 版。
- ControlsFX (version 8.40.10) というオープン・ソースのライブラリを利用する為、NetBeans で構築したプロジェクトホームの直下に lib/ を作り、controlsfx-8.40.10.jar を配置。
- SceneBuilder を単独で起動して、プロジェクトで使う FXML を開き、歯車アイコン中の”Import JAR/FXML file…” というメニューから controlsfx-8.40.10.jar を選択。
- Custom から StatusBar コントロールを選択して ”Hierarchy” の所定の位置へ配置。
- FXML を保存後、SceneBuilder を閉じる。
- NetBeans を起動して、今回のプロジェクトを開き、プロジェクトツリーから当該 FXML をダブルクリック。
- 従来なら SceneBulder が自動的に起動して FXML も同時にオープンされるが、そのようにならず次のようなダイアログが表示されて失敗するようになった。
- “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
回避方法
- 次のコマンドで、SceneBuilder.cfg を探す
- SceneBuilder.cfg をエディタで開き、次のように改修する
- 改修前
app.classpath=
- 改修後
app.classpath=$APPDIR/../../../Documents/NetBeansProjects/PATH/TO/MYPROJECTHOME/lib/controlsfx-8.40.10.jar
- 以上で対策完了。NB の再起動は不要。
dir /b /s "%UserProfile%" | findstr "SceneBuilder.cfg"
所感
- SceneBuilder fails to open with custom controls – from eclipse でのやり取りを参考に本稿を作成した。
- Jose Pereda 氏の発言によれば SceneBuilder 8.2.0 にて上記の回避策が不要になるとこことであるが、Fix はまだのようだ。