将微调器<Integer>绑定到现有整数属性



我试图将旋转器的值绑定到整数属性。这个答案并不令人满意,因为我不想创建一个新的integerproperty,而是将旋转器的值绑定到现有的价值。

我试图创建一个新的IntegerProperty,如该答案所示,然后将其绑定到现有的。但是,此示例代码不起作用:

import javafx.application.Application;
import javafx.beans.property.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    @Override
    public void start(Stage primaryStage) throws Exception {
        StackPane pane = new StackPane();
        IntegerProperty controlled = new SimpleIntegerProperty(); // I don't want to change this.
        final Spinner<Integer> spinner = new Spinner<>(0, 10, 5, 1);
        ObjectProperty<Integer> bridgeObject = new SimpleObjectProperty<>();
        IntegerProperty bridgeInteger = IntegerProperty.integerProperty(bridgeObject); // "Returns a IntegerProperty that wraps a Property and is bidirectionally bound to it."
        SpinnerValueFactory<Integer> valueFactory = spinner.getValueFactory(); // not null
        ObjectProperty<Integer> integerObjectProperty = valueFactory.valueProperty(); // not null
        integerObjectProperty.bindBidirectional(bridgeObject); // Throws NullPointerException, but not while debugging?!
        bridgeInteger.bindBidirectional(controlled);
        pane.getChildren().add(spinner);
        primaryStage.setScene(new Scene(pane, 300, 275));
        primaryStage.show();
    }
}

问题:

  1. 是否有一种比创建两个中间"桥"属性更好的绑定到现有IntegerProperty的方法?
  2. 如果没有,为什么我的示例代码会抛出NullPoInterException?我询问了integerObjectProperty不是零的断言。奇怪的是,如果代码是按行调试(为什么?),则不会抛出例外。另一个问题的作者声称他已经成功地做了这样的事情,但没有回应其他用户发布代码的请求。

您的空指针异常可能是由于您进行绑定时的 bridgeObject.get()是无效的。

您需要的只是

@Override
public void start(Stage primaryStage) throws Exception {
    StackPane pane = new StackPane();
    IntegerProperty controlled = new SimpleIntegerProperty(); // I don't want to change this.
    final Spinner<Integer> spinner = new Spinner<>(0, 10, 5, 1);
    spinner.getValueFactory().valueProperty().bindBidirectional(controlled.asObject());
    pane.getChildren().add(spinner);
    primaryStage.setScene(new Scene(pane, 300, 275));
    primaryStage.show();
}

最新更新