2017-03-14 17 views
-1

ユーザーがこのテトリスゲームの最後に到達すると、新しいアラートを開きます。JavaFX EventHandler - ブール値がtrueの場合は新しいアラート

モデルクラスには、新しいテトリスブロックを生成できない場合にtrueに切り替わるブール値があります。

私はモデルビューのプレゼンターと一緒に作業していますので、モデルではブール値+ゲッターであり、ブール値がtrueを返すと新しい発表者が作成されます。

質問は、これを発表者のeventHandlers()にどのように追加しますか?

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

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 
} 
+3

さらに質問がありますか? – UnholySheep

+1

あなたは観察者のデザインパターンを使用したいと思うかもしれません:https://en.wikipedia.org/wiki/Observer_pattern –

+0

申し訳ありません。 – m4t5k4

答えて

1

のJavaFXが無効ため、基礎となる値への変更の通知をサポートするJava Beanのパターンの拡張で観察可能な特性を実現します。これらはJavaFXライブラリにとって基本的なものです.JavaFXのすべてのコントロールでこれらを使用します。テキストフィールド内のテキストへの変化に対応したいのであれば、たとえば、あなたはあなたがちょうどBooleanProperty(または類似)でこれを達成することができます

myTextField.textProperty().addListener((observable, oldText, newText) -> { 
    // ... do something with newText (and perhaps oldText) here... 
}); 

をするでしょう、あなたのモデルクラスで:

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

参照"Properties and Bindings"バインディングを含む詳細、は、Oracleのチュートリアルなどにまた検討するかもしれませんプロパティが定義されているクラスの外からプロパティを変更しないようにするには

+0

ありがとう、魅力のように動作し、それはより少ない書き込みです。ラムダの仕事がどういうわけか分かりませんので、匿名の内部クラスを書いただけです。 – m4t5k4

0

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(); 
     } 
    }); 
+0

['BooleanProperty'](http:// docs.oracle.com/javase/8/javafx/api/javafx/beans/property/BooleanProperty.html)このような車輪を再発明する代わりに? –

+0

おっと、私はそれを再発明していました。いくつかの読書の後、私はこの時代遅れの質問の3番目の答えに行きましたhttp://stackoverflow.com/questions/9969375/ – m4t5k4

関連する問題