当用户到达本俄罗斯方块游戏结束时,我想要打开一个新警报。
在模型类中,我有一个布尔值,如果无法生成新的俄罗斯方块块,它将切换为true。
我正在使用模型视图展示器,因此在模型中是布尔+ getter,如果布尔值返回true,则会在演示者中创建一个新警报。
问题是如何将它添加到演示者的eventHandlers()?
public Presenter(Model model, View view) {
this.model = model;
this.view = view;
addEventHandlers();
}
private void addEventHandlers() {
//view.setOnKeyPressed... this is for rotating the blocks to give you an example
}
答案 0 :(得分:1)
JavaFX实现了可观察的属性,这些属性是Java Bean模式的扩展,支持无效通知和基础值的更改。这些是JavaFX库的基础:JavaFX中的所有控件都使用它们。因此,例如,如果您想要响应文本字段中文本的更改,您可以执行
myTextField.textProperty().addListener((observable, oldText, newText) -> {
// ... do something with newText (and perhaps oldText) here...
});
因此,您可以在模型类中使用BooleanProperty
(或类似)实现此目的:
private final BooleanProperty gameEnded = new SimpleBooleanProperty();
public BooleanProperty gameEndedProperty() {
return gameEnded ;
}
public final boolean isGameEnded() {
return gameEndedProperty().get();
}
public final void setGameEnded(boolean gameEnded) {
gameEndedProperty().set(gameEnded);
}
然后你可以这样做:
model.gameEndedProperty().addListener((obs, gameWasEnded, gameIsNowEnded) -> {
if (gameIsNowEnded) {
// show alert, etc...
}
});
请参阅Oracle教程中的"Properties and Bindings"以获取更多详细信息,包括绑定等。如果您不希望从课堂外更改属性,您可能还会考虑ReadOnlyBooleanWrapper
在。中定义。
答案 1 :(得分:0)
public void setEind() {
boolean oldValue = this.eind;
eind = true;
System.out.println(eind);
firePropertyChange("eind",oldValue,eind);
}
private final List<PropertyChangeListener> listeners = new ArrayList<>();
public void addPropertyChangeListener(PropertyChangeListener listener) {
listeners.add(listener);
}
public void firePropertyChange(String property, Object oldValue, Object newValue) {
for (PropertyChangeListener listener : listeners) {
listener.propertyChange(new PropertyChangeEvent(this,property,oldValue,newValue));
}
}
spel.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
val.stop();
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setHeaderText("Game over!");
alert.setContentText("Enter your name in the next window for the highscores.");
alert.setTitle("End");
alert.show();
}
});