2017-05-11 1 views
2

Ich bin super neu zu JavaFX und für meine Dame Spiel möchte ich zeigen, wer dran ist es ist über meinem Board. Ich habe mehrere sehr ähnliche Fragen gelesen, aber es scheint mich nicht dahin zu bringen, wohin ich gehen möchte. Ich hoffe ihr könnt mir helfen!Ändern Label abhängig von boolean JavaFX

Ich habe eine FXML Datei mit dem folgenden Code:

<HBox fx:id="topBox" alignment="TOP_CENTER" prefHeight="45.0" prefWidth="200.0" spacing="10.0" BorderPane.alignment="CENTER" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController"> 
    <children> 
     <Label fx:id="labelTurn" text="test" /> 
     <Button fx:id="buttonResign" alignment="CENTER" mnemonicParsing="false" onAction="#doResign" prefHeight="25.0" prefWidth="80.0" text="Resign" /> 
    </children> 
    </HBox> 

In meinem Haupt:

public class Main extends Application { 

    Checkers content = new Checkers(); 
    BorderPane border = new BorderPane(); 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     try { 
      border.setTop(FXMLLoader.load(getClass().getResource("Sample.fxml"))); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     border.setCenter(createContent()); 
     Scene scene = new Scene(border); 
     primaryStage.setTitle("Checkers from main"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Mein Controller:

public class SampleController { 
    @FXML 
    private Label labelTurn; 

    @FXML 
    private HBox topBox; 

    @FXML 
    private Button buttonResign; 

    private Checkers content = new Checkers(); 

    @FXML 
    void doResign(ActionEvent event) { 
     content.resign(); 
     // System.exit(0); //TODO eine tatsächliche Methode eingeben!! 

    } 

    public void setLabelTurn(Label labelTurn) { 
     this.labelTurn = labelTurn; 

     String setLabelText() { 
     String s = " "; 
     if (content.getWhiteTurnPropValue()) { 
      labelTurn.setText("White, it is your turn."); 
      s = "White, it is your turn."; 
      return s; 
     } else { 
      labelTurn.setText("Black, it is your turn."); 
      s = "Black, it is your turn."; 
      return s; 
     } 
    } 
    @FXML 
    void initialize() { 
     assert buttonResign != null : "fx:id=\"buttonResign\" was not injected: check your FXML file 'Sample.fxml'."; 
     assert topBox != null : "fx:id=\"topBox\" was not injected: check your FXML file 'Sample.fxml'."; 
     assert labelTurn != null : "fx:id=\"labelTurn\" was not injected: check your FXML file 'Sample.fxml'."; 
     labelTurn.textProperty().setValue(setLabelText()); 
    } 
} 

Meine Spieldaten haben eine BooleanProperty zu zeigen Wer ist dran? Es wird nach jedem erfolgreichen Zug geändert.

BooleanProperty whiteTurnProp = new SimpleBooleanProperty(true); 

public BooleanProperty getWhiteTurnProp() { 
    return whiteTurnProp; 
} 

public void setWhiteTurnPropValue(Boolean whiteTurn) { 
    this.whiteTurnProp.setValue(whiteTurn); 
} 

public boolean getWhiteTurnPropValue() { 
    return this.whiteTurnProp.getValue(); 
} 

Soweit ich verstanden habe, muss ich das Label an den Wert binden, den ich in der Initialisierungsmethode getan habe. Aber wenn ich spiele und der Wert in meiner Spielklasse sich ändert, bleibt das Label gleich. Wie aktualisiere ich das Etikett? Ich denke, ich muss einen Änderungshörer zu etwas hinzufügen, aber ich weiß nicht, wie man das macht und genauer WO.

Vielen Dank für Ihre Hilfe! Ich habe meinen Code etwas gekürzt und hoffe, dass es noch nicht zu lange ist.

Best, Lisa

Antwort

1

In initialize: labelTurn.textProperty().setValue(setLabelText()); ist keine Bindung, es ist ein einfacher Satz auf dem Grundstück. Ein wirklich seltsames wie setLabelText() setzt den Text der Label und gibt auch die Zeichenfolge, die festgelegt wurde, der Wert wird erneut auf den Text der Label verwendet.

Sie könnten eine echte Bindung stattdessen erstellen:

labelTurn.textProperty().bind(Bindings.createStringBinding(() -> { 
    String s = " "; 
    if (content.getWhiteTurnProp().get()) 
     s = "White, it is your turn."; 
    else 
     s = "Black, it is your turn."; 

    return s; 
}, content.getWhiteTurnProp())); 
+0

Thank you! Das funktioniert perfekt! – Lisa

Verwandte Themen