2017-12-09 14 views
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(); 
    } 
} 

質問:

  1. 2の中間「ブリッジ」のプロパティを作成するよりも、既存のIntegerPropertyに結合するより良い方法はありますか?
  2. そうでない場合、私のサンプルコードはなぜNullPointerExceptionをスローしますか?私はアサーションでintegerObjectPropertyがnullではないことを確認しました。奇妙なことに、コードが行単位でデバッグされていると例外はスローされません(なぜ?)。他の質問の著者は、彼がこのようなことをうまくやったと主張しましたが、コードを投稿する別のユーザーの要求には反応しませんでした。

答えて

1

バインディングを実行すると、ヌルポインター例外がおそらく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(); 
} 
です
関連する問題