2016-06-13 3 views
1

게임을 마치는 데 사용하는 두 개의 버튼이있는 GUI가있는 게임이 있습니다.JavaFX Listener가 부울 값을 확인합니다.

나는 시험에 다음 부울이 있습니다

public boolean complete(){ 
    if (initvalue==finalvaue)){ 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

내가 게임을 완료하고 사용자에게 메시지를 인쇄 할 수 있는지 확인하는 리스너를 만들려고합니다. 이 작업을 수행하려면 SimpleBooleanProperty을 만들어야한다고 생각합니다. 하지만 위의 부울 값에 바인딩해야합니까?

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

2

당신은 BooleanPropertycompletedProperty을 가질 수 있고 또한 당신이 게임의 포인트를 저장하는 initvaluePropertyfinalValueProperty을 가질 수 있습니다, 그리고 당신은 단순히 '그러므로 당신이 돈

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의 속성을 배우려면 시작을 클릭하십시오.

+1

실제로이 중 어느 것도 '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

+0

네, 그게 사실입니다, 나는 방금 이런 식으로 바인딩을 소개하는 것이 더 낫다고 생각합니다. 그리고 OP는 점점 더 익숙해 져서 주제를 스스로 탐구 할 수 있습니다 :) Btw, 나는 그것을 답안에 포함시킬 것입니다. 링크 업데이트). – DVarga

+0

그래서 부 울린 바인딩을 사용하면 원래 있던 부울 메서드를 변경해야합니다. 심지어 바인딩해야합니까? simpleboolean 속성을 원래 부울 코드로 설정 한 다음 addlistener를 사용하여 변경시기를 확인할 수도 있습니까? – mineshmshah

관련 문제