0

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

问题是我有异常:

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

这是有道理的,因为我试图在不是 UI 线程的线程中更改 UI。所以我添加Platform.runLater(..)到我的二传手并且它有效。

问题:如果我必须为每个属性都这样做,我的二传手会变得非常难看。在 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());
    }
}
4

1 回答 1

1

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

于 2012-11-25T14:11:01.860 回答