FlowPane中的可变大小数组

时间:2013-02-27 21:11:58

标签: java javafx-2 fxml

如果我有一个可变大小的数组(例如一组卡片)。

我如何构建显示元素的东西(例如在FlowPane中)并且每个元素都有自己的控制器(每个卡的fxml +控制器),因此元素(卡片)的容器(流程窗格)可以将它的元素交换,移除或添加新元素?

控制器:

public class HandController extends FlowPane implements Initializable{
    @Override public void initialize(URL arg0, ResourceBundle arg1){
    }
    public void setHand(ArrayList<Cards> Hand){
        //this would work if the hand were static
        for(int i = 0; i < Hand.size(); ++i){
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("CardView.fxml"));
            CardController controller = new CardController();
            fxmlLoader.setController(controller);
            fxmlLoader.setRoot(controller);
            Parent card = (Parent)fxmlLoader.load();
            fxmlLoader.setRoot(card);
            this.getChildren().add(card);
            controller.setCard(Hand.get(i));
        }
    }
}

FXML:

<fx:root type="FlowPane" xmlns:fx="http://javafx.com/fxml"
         stylesheets="view/Style.css">
    <children>
        <!--should i put something here?-->
    </children>
</fx:root>

1 个答案:

答案 0 :(得分:0)

FXML是静态语言(至少目前为止)。它描述了静态页面。

如果您想拥有动态内容,则需要对其进行编码。

例如,您可以在控制器中引入将使用卡执行操作的方法,然后调用这些方法。修正了你的代码。

<!-- HandView.fxml -->
<fx:root type="FlowPane" xmlns:fx="http://javafx.com/fxml" stylesheets="view/Style.css">
  <children>
    <!-- just leave it emtpy -->
  </children>
</fx:root>

HandController:

public class HandController extends FlowPane {

 HandController() {
   FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("HandView.fxml"));
   fxmlLoader.setController(this);
   fxmlLoader.setRoot(this);
   fxmlLoader.load();
 }

 public void setHand(ArrayList<Cards> hand){
    for(int i = 0; i < hand.size(); ++i){
        addCard(hang.get(i));
    }    
 }

 public void addCard(Cards card) {
    getChildren().add(new CardController(card));
 }
}

将所有CardController初始化放在构造函数中:

public class CardController extends Pane {
 private final Card card;
 CardController(Card card) {
   this.card = card;
   FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("CardView.fxml"));
   fxmlLoader.setController(this);
   fxmlLoader.setRoot(this);
   fxmlLoader.load();
 }
}