2016-04-07 15 views
0

Ich benutze einen Listener für den Status der Web-Engine und es funktioniert gut. Auch das Dokument ist zu diesem Zeitpunkt gefüllt, weil der State ERFOLGREICH erreicht ist.JavaFX - Zugriff auf DOM-Modell der WebEngine

Der Staat Zuhörer:

public class WebViewListener implements ChangeListener<Worker.State> { 
    public void changed(ObservableValue observable, State oldState, State newState) { 
     if (newState == State.SUCCEEDED) { 
     String style = ""; 

     try { 
      style = cssModel.getRuntimeCSSFileAsString(); 
      htmlModel.setDocument(view.getWebEngine().getDocument()); 
      htmlModel.setStyleAttribute(style); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (HTMLDocumentNullException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

Mein Problem ist, dass ich eine anderen Hörer auf einem Toggle-Button verwenden, die ich manuell durch das Verfahren selectToggle() zu einem frühen Zeitpunkt Feuer (in der Konstruktor einer anderen Ansicht), in dem das Dokumentmodell der Web-Engine noch nicht vom Status-Listener gesetzt wurde, weil der State SUCCEED nicht erreicht wird, bevor die JavaFX-Stufe erscheint.

Also jetzt brauche ich eine Lösung, wie ich auf der JavaFX-Stage abhören kann, wenn die UI gerendert wird. Da zu dieser Zeit reagiert der Staat Zuhörer und danach konnte ich die setInitialState() Methode und die Arbeit mit dem Dokumentenmodell des Web-Engine nennen.

der Code das Umschaltfeld des Auswählens:

public void setInitialState() { 
    screenGroup.selectToggle(rbMasterScreen); 
    elementGroup.selectToggle(btnButton); 
} 
+1

Ich verstehe wirklich nicht, was Sie tun mögen. Wenn Sie State hören, wie ist es möglich, dass das Dokument null ist? Und was mit dem ToggleButton? Oder poste ein Codebeispiel, sonst ist es wirklich schwer zu helfen. – DVarga

Antwort

0

In diesem Fall ist die primitivsten Lösung: eine SimpleBoolean Eigenschaft einführen z.B.

SimpleBooleanProperty webEngineLoadedProperty = new SimpleBooleanProperty(false); 

Dann am Ende:

public void changed(ObservableValue observable, State oldState, State newState) { 
    if (newState == State.SUCCEEDED) { 
     ... 
     webEngineLoadedProperty.set(true); 
    } 
} 

Und die Änderung hören:

webEngineLoadedProperty.addListener(new ChangeListener<Boolean>() { 

    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
     setInitialState(); 
    } 
}); 
Verwandte Themen