2017-12-09 1 views
1

Spinner의 값을 정수 속성에 바인딩하려고합니다. This answer은 새로운 IntegerProperty를 만들고 싶지 않고 대신 스피너의 값을 기존의 IntegerProperty에 바인딩하기 때문에 만족스럽지 않습니다.바인더 스피너 <Integer> to 기존 IntegerProperty

그 대답에 표시된대로 새로운 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을 throw하는 이유는 무엇입니까? 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(); 
} 
입니다