2017-05-11 6 views
2

私はJavaFXの新機能が非常に優れています。チェッカーゲームでは、誰が自分のボード上にいるかを表示したいと思います。私は複数の非常によく似た質問を読んだことがありますが、私が行きたいところに私をつかまえていないようです。あなたが私を助けることを願っています!ブール値に応じてラベルを変更するJavaFX

私は次のコードでFXMLファイルを持っている:私のゲームデータを表示するBooleanPropertyを持って

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

:私のメインで

<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> 

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

私のコントローラを誰がそれを回しているのですか?成功するたびに変更されます。

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

私が理解している限り、私はinitializeメソッドで行った値にLabelをバインドする必要があります。しかし、私が遊んで、私のゲームクラスの価値が変わったとき、ラベルは同じままです。ラベルを更新するにはどうすればよいですか?私は変更リスナーを何かに追加する必要があると思うが、私はそれを行う方法、より具体的にはWHEREを知らない。

ありがとうございました!私は自分のコードを少し短くし、まだそれほど長くないことを願っています。

ベスト、initializeで リサ

答えて

1

labelTurn.textProperty().setValue(setLabelText());は、それが財産上の簡単なセットで、結合ではありません。本当に奇妙なものはsetLabelText()としてLabelのテキストを設定し、設定された文字列を返します。この値はLabelのテキストに再び使用されます。

かわりに、実際のバインディングを作成することができます。

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

ありがとうございました!それは完璧に動作します! – Lisa

関連する問題