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