1
Spinnerの値を整数プロパティにバインドしようとしています。 This answerは、新しいIntegerPropertyを作成するのではなく、代わりにスピナーの値を既存のIntegerPropertyにバインドするので、満足できるものではありません。バインドスピナー<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();
}
}
質問:
- 2の中間「ブリッジ」のプロパティを作成するよりも、既存の
IntegerProperty
に結合するより良い方法はありますか? - そうでない場合、私のサンプルコードはなぜNullPointerExceptionをスローしますか?私はアサーションで
integerObjectProperty
がnullではないことを確認しました。奇妙なことに、コードが行単位でデバッグされていると例外はスローされません(なぜ?)。他の質問の著者は、彼がこのようなことをうまくやったと主張しましたが、コードを投稿する別のユーザーの要求には反応しませんでした。