2016-04-27 8 views
1

Ich erstelle ein Rich-Text-Steuerelement, das ein WebView für die Anzeige und HTMLEditor für die Bearbeitung verwendet. Als ich versuchte, die Kontrolle zu Scenebuilder die Custom Controls eine Ausnahme ausgelöst wurde hinzugefügt:Scenebuilder verwirft Webview im benutzerdefinierten Steuerelement

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) 

...

Es scheint, dass Scenebuilder versucht, ein WebView zu instanziieren, das seinerseits versucht, eine WebEngine zu instanziieren, die einen FX-Anwendungs-Thread zu benötigen scheint, den das benutzerdefinierte Steuerelement nicht generiert.

wäre dankbar für irgendwelche Ideen/Workaround.

Danke!

Antwort

1

SceneBuilder verfügt über einen integrierten Mechanismus, der alle Objekte in der Benutzerbibliothek überprüft, die nach benutzerdefinierten Steuerelementen suchen.

Für jedes gegebene jar bedeutet das, alle Klassen zu überprüfen und nach möglichen Kontrollen zu suchen: konkrete Klassen, die von Node zuweisbar sind. Dann erstellt er eine Instanz für diese und versucht, sie auf den Klassenpfad zu laden. Wenn es funktioniert, wird es dem Bibliotheksfenster hinzugefügt.

Im Falle Ihres benutzerdefinierten Steuerelements, das einen WebView Knoten enthält, bedeutet dies, dass eine neue Instanz von WebView ausgeführt wird, wenn Ihr Steuerelement von SceneBuilder überprüft wird. An dieser Stelle finden Sie die Ausnahme erhalten Sie erwähnt:

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) 

So ist die einfache Lösung hierfür wird die individuelle Steuerung werden, so dass in dem JavaFX Anwendungsthread geladen werden, wenn im Entwurfsmodus von SceneBuilder geladen.

Dieses kleine individuelle Steuerung arbeitet für mich:

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 - Vielen Dank für Ihre Antwort, und vor allem zur Erläuterung des Prozesses Schritt-für-Schritt und wie diese führen zur Ausnahme. Es ist genau das, was ich dachte, passiert ist, aber deine Erklärung ist deutlicher, was wahrscheinlich ist, weil du weißt, was du tust und ich ... nicht. Relativ neu hier, also weiß ich nicht, wie ich Ihnen Kredit geben soll, wäre dankbar, wenn Sie sich dazu äußern könnten. Vielen Dank! – jfr

+0

Akzeptieren Sie einfach die Antwort (klicken Sie auf das Häkchen neben der Antwort) als gültig und stimmen Sie sie ab, wenn Sie möchten. Das wird anderen helfen, es als eine gültige Quelle zu finden, falls sie das gleiche Problem haben. –

+0

Viel verpflichtet, halte es für erledigt. – jfr