2017-05-23 5 views
1

Ich möchte das zweite Argument zu When() Bedingung für ObservableBooleanValue hinzufügen. Für den Fall, dass nur ein Argument vorhanden ist, funktioniert es korrekt: . Problem in dieser Zeile:Wie mache ich ObservableBooleanValue mit zwei Argumenten in Java?

game.winnerProperty().isEqualTo(Square.State.EMPTY) || (GameTimer::isTimeOver==true) 

Diese Ordnung ist:

game.winnerProperty().isEqualTo(Square.State.EMPTY) //This is BooleanBinding 

Code:

playerLabel.textProperty().bind(
    Bindings.when(
     game.gameOverProperty().not() 
    ) 
     .then("Actual Player: ") 
     .otherwise(
      Bindings.when(
       game.winnerProperty().isEqualTo(Square.State.EMPTY) || (GameTimer::isTimeOver==true) 
      ) 
       .then("Draw") 
       .otherwise("Winner: ") 
     ) 
); 

Wie zweites Argument hinzuzufügen, welche Art ist boolean?

+1

'(gametimer :: isTimeOver == true)' ??? Warum sollte eine Methodenreferenz gleich einem 'boolean' sein und was wäre die funktionale Schnittstelle, für die diese verwendet würde? – fabian

+0

Ist das 'isTimeOver' auch eine Eigenschaft? Oder nur ein Feld? –

+0

@JornVernee Es müsste eine Methode sein, denn das ist die Syntax für eine Methodenreferenz: obwohl es absolut keinen Sinn macht, dort eine Methodenreferenz zu haben. –

Antwort

1

können Sie

tun
game.winnerProperty().isEqualTo(Square.State.EMPTY).or(/* whatever you actually mean here */); 

Das Argument or muss hier eine andere ObservableBooleanValue (zum Beispiel ein BooleanProperty) sein: Ich weiß wirklich nicht, was nach der Methode Referenz soll Sie im Moment haben.

+0

game.winnerProperty(). IsEqualTo (Square.State.EMPTY) .oder (GameTimer :: isTimeOver == true) isTimeOver wird auf TRUE gesetzt, wenn die Zeit abgelaufen ist. Wie ändere ich isTimeOver zu einem booleschen Typ? – user3455638

+1

@ user3455638 Niemand außer dir weiß, was du mit 'GameTimer :: isTimeOver' meinst. –

2

Manchmal ist es praktisch, mehrere Bindungen zu kombinieren.

Dies kann jedoch zu komplexem Code führen, der schwer zu verstehen/zu pflegen ist. Es wäre einfacher, Bindings.createStringBinding zu nutzen und die richtigen Abhängigkeiten hinzu:

playerLabel.textProperty().bind(
    Bindings.createStringBinding(() -> { 
      if (game.isGameOver()) { 
       return Square.State.EMPTY.equals(game.getWinner()) || gameTimer.isTimeOver() 
           ? "Draw" 
           : "Winner: "; 
      } else { 
       return "Actual Player: "; 
      } 
     }, 
     game.gameOverProperty(), 
     game.winnerProperty(), 
     gameTimer.timeOverProperty())); 
Verwandte Themen