JavaFX EventHandler - 如果布尔值等于 true,则新警报
JavaFX EventHandler - new Alert if boolean equals true
当用户玩完这个俄罗斯方块游戏时,我想打开一个新的提醒。
在模型中 class 我有一个布尔值,如果无法生成新的俄罗斯方块块,它将切换为 true。
我正在使用模型视图演示器,因此在模型中是布尔值 + getter,如果布尔值 returns 为真,则在演示器中将创建一个新警报。
问题是如何将它添加到演示者中的 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
}
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();
}
});
JavaFX 实现可观察属性,这些属性是 Java Bean 模式的扩展,支持通知失效和基础值的更改。这些是 JavaFX 库的基础:JavaFX 中的所有控件都使用这些。因此,例如,如果您想响应文本字段中文本的更改,您可以这样做
myTextField.textProperty().addListener((observable, oldText, newText) -> {
// ... do something with newText (and perhaps oldText) here...
});
因此,您只需在模型 class:
中使用 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...
}
});
如果您不希望 属性 从其定义的 class 外部更改,请参阅 "Properties and Bindings" in the Oracle tutorial for more details, including bindings, etc. You might also consider a ReadOnlyBooleanWrapper
。
当用户玩完这个俄罗斯方块游戏时,我想打开一个新的提醒。
在模型中 class 我有一个布尔值,如果无法生成新的俄罗斯方块块,它将切换为 true。
我正在使用模型视图演示器,因此在模型中是布尔值 + getter,如果布尔值 returns 为真,则在演示器中将创建一个新警报。
问题是如何将它添加到演示者中的 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
}
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();
}
});
JavaFX 实现可观察属性,这些属性是 Java Bean 模式的扩展,支持通知失效和基础值的更改。这些是 JavaFX 库的基础:JavaFX 中的所有控件都使用这些。因此,例如,如果您想响应文本字段中文本的更改,您可以这样做
myTextField.textProperty().addListener((observable, oldText, newText) -> {
// ... do something with newText (and perhaps oldText) here...
});
因此,您只需在模型 class:
中使用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...
}
});
如果您不希望 属性 从其定义的 class 外部更改,请参阅 "Properties and Bindings" in the Oracle tutorial for more details, including bindings, etc. You might also consider a ReadOnlyBooleanWrapper
。