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.
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
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
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