如果我有一个可变大小的数组(例如一组卡片)。
我如何构建显示元素的东西(例如在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>
答案 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();
}
}