2016-06-13 15 views
1

Ich habe ein Spiel mit einer GUI mit ein paar Tasten, die Sie drücken, um das Spiel zu beenden.JavaFX Listener zum Überprüfen auf einen booleschen Wert

Ich habe folgenden Boolesche Test:

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

Ich mag einen Zuhörer erstellen zu überprüfen, ob das Spiel beendet ist, und eine Nachricht an den Benutzer auszudrucken. Ich denke, ich muss eine SimpleBooleanProperty erstellen, damit dies funktioniert. Aber müsste ich es an den obigen booleschen Wert binden?

Was wäre der beste Weg, um dies zu tun?

Antwort

2

können Sie haben eine BooleanPropertycompletedProperty und können auch Sie haben initvalueProperty und finalValueProperty auch die Punkte des Spiels zu speichern, und dann können Sie einfach binden den Wert des completedProperty wie

completedProperty.bind(initValueProperty.isEqualTo(finalValueProperty)); 

Sie daher don‘ Ich brauche sogar eine Methode mehr.

In dem Beispiel habe ich gerade eine Button platziert, die den aktuellen Wert um 1 beim Drücken erhöht und ich 3 Eigenschaften verwendet, um kontinuierlich den "Spiel" -Zustand zu überprüfen. Sobald die completedProperty auf "true" schaltet, erscheint eine Label mit dem Text "Game Over".

Hinweis: Ich habe IntegerProperty verwendet, um den aktuellen und den Endwert zu speichern, aber Sie können jede Property verwenden.

Beispiel:

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); 
    } 
} 

Optional (wie durch fabian angegeben) Sie können sogar eine BooleanBinding verwenden, anstatt eine Eigenschaft des fertigen Zustand zu prüfen (in diesem Fall, dass Sie nicht completedProperty brauchen), wie :

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); 
     } 
    } 
}); 

über Eigenschaften in JavaFX this is a really good article mit beginnen zu lernen.

+1

Beachten Sie, dass dies keine 'BooleanProperty' erfordert. Alles, was hier getan wird, könnte auch mit [BooleanBinding] (https://docs.oracle.com/javase/binding/BooleanBinding.html) erfolgen, das direkt von 'isEqualTo' zurückgegeben wird ... Außerdem ist hier der Link für Version 8: https://docs.oracle.com/javase/binding.htm (enthält wahrscheinlich den gleichen Inhalt). – fabian

+0

Ja, das ist absolut richtig, ich fühlte einfach, dass es sauberer ist, Bindungen wie diese einzuführen und dann, wenn das OP mehr und mehr mit dem Thema vertraut wird, kann er es selbst erforschen :) Btw, ich werde es in die Antwort aufnehmen (auch das Link-Update). – DVarga

+0

Also mit der booleschen Bindung, müsste ich die boolesche Methode ändern, die ich ursprünglich hatte. Muss ich überhaupt binden? Kann ich nicht einfach eine simpleboolean-Eigenschaft auf den ursprünglichen booleschen Code setzen, sondern einfach addlistener verwenden, um zu sehen, wann sich das ändert? – mineshmshah