당신은 BooleanPropertycompletedProperty
을 가질 수 있고 또한 당신이 게임의 포인트를 저장하는 initvalueProperty
도 finalValueProperty
을 가질 수 있습니다, 그리고 당신은 단순히 '그러므로 당신이 돈
completedProperty.bind(initValueProperty.isEqualTo(finalValueProperty));
처럼 completedProperty
의 값을 바인딩 할 수 있습니다 더 이상 방법이 필요하지 않습니다.
예에서 저는 프레스에서 현재 값을 1 씩 증가시키는 Button
을 배치했으며 3 가지 속성을 사용하여 "게임"상태를 계속 확인했습니다. completedProperty
이 "true"로 바뀌 자마자 "Game Over"라는 텍스트가있는 Label
이 나타납니다.
참고 : 나는 현재 최종 값을 저장 IntegerProperty을 사용했다,하지만 당신은 어떤 Property를 사용할 수 있습니다.
예 :
public class Main extends Application {
private IntegerProperty initValueProperty = new SimpleIntegerProperty(0);
private IntegerProperty finalValueProperty = new SimpleIntegerProperty(10);
private BooleanProperty completedProperty = new SimpleBooleanProperty();
@Override
public void start(Stage primaryStage) {
try {
BorderPane root = new BorderPane();
Scene scene = new Scene(root,400,400);
Button buttonPlusOne = new Button("+1");
root.setCenter(buttonPlusOne);
Text currValueText = new Text();
currValueText.textProperty().bind(initValueProperty.asString());
root.setBottom(currValueText);
// Increment current value
buttonPlusOne.setOnAction(e -> initValueProperty.set(initValueProperty.get()+1));
// Bind completed property: initValue equals finalValue
completedProperty.bind(initValueProperty.isEqualTo(finalValueProperty));
completedProperty.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
// Only if completed
if (newValue) {
Label l = new Label("Game Over");
root.setTop(l);
}
}
});
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
선택적으로 (fabian에서 언급 한 바와 같이) 당신도 (당신이 completedProperty
필요하지 않습니다이 경우) 완료 상태를 확인하지 않고 속성보다 BooleanBinding을 사용할 수 있습니다, 같은 :
BooleanBinding completed = initValueProperty.isEqualTo(finalValueProperty);
completed.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
// Only if completed
if (newValue) {
Label l = new Label("Game Over");
root.setTop(l);
}
}
});
JavaFX this is a really good article의 속성을 배우려면 시작을 클릭하십시오.
실제로이 중 어느 것도 'BooleanProperty'가 필요하지 않습니다. 여기서 수행되는 모든 작업은'isEqualTo'가 직접 반환 한 [BooleanBinding] (https://docs.oracle.com/javase/8/javafx/api/javafx/beans/binding/BooleanBinding.html)을 사용하여 수행 할 수도 있습니다. 또한 다음은 버전 8에 대한 링크입니다. https://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm (아마도 동일한 내용을 포함하고 있습니다). – fabian
네, 그게 사실입니다, 나는 방금 이런 식으로 바인딩을 소개하는 것이 더 낫다고 생각합니다. 그리고 OP는 점점 더 익숙해 져서 주제를 스스로 탐구 할 수 있습니다 :) Btw, 나는 그것을 답안에 포함시킬 것입니다. 링크 업데이트). – DVarga
그래서 부 울린 바인딩을 사용하면 원래 있던 부울 메서드를 변경해야합니다. 심지어 바인딩해야합니까? simpleboolean 속성을 원래 부울 코드로 설정 한 다음 addlistener를 사용하여 변경시기를 확인할 수도 있습니까? – mineshmshah