2016-04-27 7 views
1

WebViewを表示用に、HTMLエディタを編集用に使用するリッチテキストコントロールを作成しています。私はScenebuilderのカスタムにコントロールを追加しようとしたときに例外がスローされた制御:ScenebuilderがカスタムコントロールのWebviewを拒否する

Exception for: com/spindotta/jfx/control/text/RichTextArea.class 

はjavafx.fxml.LoadException:

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 

...

Caused by: java.lang.IllegalStateException: Not on FX application thread; currentThread = LibraryFolderWatcher([library folder location]) 

...

at javafx.scene.web.WebEngine.checkThread(WebEngine.java:1216) 

...

ScenebuilderはWebViewをインスタンス化しようとしますが、カスタムコントロールが生成しないFXアプリケーションスレッドを必要とするWebEngineをインスタンス化しようとします。

任意のアイデアや回避策に感謝します。

ありがとうございます!

答えて

1

SceneBuilderには、カスタムコントロールを探しているユーザーライブラリ内のすべてのjarをチェックする組み込みのメカニズムがあります。

任意のjarでは、すべてのクラスをチェックし、可能なコントロールを探します:具体的なクラスはNodeから割り当てられます。次に、これらのインスタンスを作成し、クラスパスにロードしようとします。機能する場合は、ライブラリパネルに追加されます。

WebViewというカスタムコントロールの場合は、コントロールがSceneBuilderでチェックされているときに、新しいインスタンスWebViewが実行されることを意味します。この時点で、あなたが言及した例外を取得します:

Caused by: java.lang.IllegalStateException: Not on FX application thread; currentThread = LibraryFolderWatcher() 
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:236) 
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423) 
at javafx.scene.web.WebEngine.checkThread(WebEngine.java:1216) 
at javafx.scene.web.WebEngine.<init>(WebEngine.java:856) 
at javafx.scene.web.WebEngine.<init>(WebEngine.java:845) 
at javafx.scene.web.WebView.<init>(WebView.java:271) 

SceneBuilderによってデザインモードでロードされているときに、このための簡単な解決策は、カスタムコントロールは、JavaFXアプリケーションのスレッドでロードすることができるようになります。私にとって

この小さなカスタムコントロールの動作:

public class WebControl extends StackPane { 

    private WebView webView; 

    public WebControl() { 
     if (Platform.isFxApplicationThread()) { 
      init(); 
     } else { 
      // Intended for SceneBuilder 
      Platform.runLater(this::init); 
     } 
    } 

    private void init() { 
     webView = new WebView(); 
     WebEngine webEngine = webView.getEngine(); 
     webEngine.load("http://www.google.com"); 
     getChildren().add(webView); 
    } 

} 

WebControl

+0

@JPereda - お返事のため、特に例外にそのリードをプロセスステップバイステップを説明し、どのようにしてくれてありがとう。それはまさに私が起こっていたと思っていることですが、あなたの説明は、あなたがやっていることを知っているからかもしれないし、私はそうしないかもしれないので、もっと明確に説明しています。ここでは比較的新しいので、あなたにクレジットを与える方法がわからないので、どうやってコメントすることができれば幸いです。ありがとう! – jfr

+0

回答を受け入れてください(回答の横にあるチェックマークをクリックしてください)。それは、同じ問題を抱えている場合でも、他の人がそれを有効な情報源として見出すのに役立ちます。 –

+0

多くの義務付けられている、それが完了したと考えてください。 – jfr

関連する問題