1

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

我如何构建一些东西来显示元素(例如在 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));
        }
    }
}

文件格式:

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

1 回答 1

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>

手控器:

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();
 }
}
于 2013-03-01T17:13:31.980 回答