【问题标题】:JavaFX - Access to DOM Model of the WebEngineJavaFX - 访问 WebEngine 的 DOM 模型
【发布时间】:2016-04-07 14:53:05
【问题描述】:

我正在使用一个监听器来监听网络引擎的状态,它工作正常。此时文档也已填写,因为已达到状态 SUCCEEDED。

状态监听器:

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();
         }
    }
}

}

我的问题是,我在切换按钮上使用了另一个侦听器,我在较早的时间(在另一个视图的构造函数中)通过方法 selectToggle() 手动触发了该按钮,而 Web 引擎的文档模型不是尚未由状态侦听器设置,因为在 JavaFX 阶段弹出之前未达到状态 SUCCEED。

所以现在我需要一个解决方案,即如何在呈现 UI 时在 JavaFX 舞台上进行监听。因为此时 State 监听器会做出反应,然后我可以调用 setInitialState() 方法并使用 Web 引擎的文档模型。

选择ToggleButton的代码:

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

【问题讨论】:

  • 我真的不明白你想做什么。如果你听状态,文件怎么可能是空的? ToggleButton 呢?或者贴一些代码示例,否则真的很难提供帮助。

标签: java javafx webview javafx-8 webengine


【解决方案1】:

在这种情况下,最原始的解决方案: 引入一个 SimpleBoolean 属性,例如

SimpleBooleanProperty webEngineLoadedProperty = new SimpleBooleanProperty(false);

然后在结尾:

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

并听听变化:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2021-01-09
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多