Javafx:避免模型设置器中的线程代码

时间:2012-11-25 07:30:06

标签: java model-view-controller user-interface javafx-2

我是第一次尝试javafx。在我的模型中,我有一个属性,告诉我的应用程序是否已连接。在其他地方有一个connectionListener,当值发生变化时会调用connection.setConnectionState(state)

问题是我得到了例外:

Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4

这是有道理的,因为我试图在不是UI线程的线程中更改UI。所以我将Platform.runLater(..)添加到我的setter中并且它可以正常工作。

问题:如果必须为每个属性执行此操作,我的安装人员将变得非常难看。在javafx中有一些很好/正确的方法吗?

型号:

public class Connection {

    private final StringProperty connectionStateProperty = new SimpleStringProperty();

    public StringProperty getConnectionStateProperty() {
        return connectionStateProperty;
    }   

    public void setConnectionState(final ConnectionState connectionState) {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                connectionStateProperty.setValue(connectionState.toString());
            }
        });
    }

}

控制器:

public class ConnectionController implements Initializable {

    @FXML
    Label connectionLabel;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        Bindings.bindBidirectional(connectionLabel.textProperty(),
            connection.getConnectionStateProperty());
    }
}

1 个答案:

答案 0 :(得分:1)

fx-guice项目中有一个名为@FxApplicationThread的方法注释,它将在FX线程上运行该方法,只要对象是通过guice注入的,我发现它非常易于使用和清理。 / p>