0

我正在使用一个监听器来监听网络引擎的状态,它工作正常。此时也填写了文档,因为达到了 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 Stage 上进行监听。因为此时状态监听器会做出反应,然后我可以调用 setInitialState() 方法并使用 Web 引擎的文档模型。

选择ToggleButton的代码:

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

1 回答 1

0

在这种情况下,最原始的解决方案:引入一个 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();  
    }
});
于 2016-04-07T18:34:24.770 回答