2013-02-27 80 views
1

如果我有一個可變大小的數組(例如一張卡片數組)。如何構建一些東西來顯示元素(例如在FlowPane中),並且每個元素都有自己的控制器(每個卡的fxml +控制器),因此元素(卡片)的容器(流程窗格)可以讓它的元素交換,刪除或添加新元素?FlowPane中的可變大小陣列

控制器:

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

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

我明白了,非常感謝你,所以每次我做什麼用的手,我有調用'setHand()'? (如果可以像TableView那樣通過其ObserbableList自動完成,將會很好) – user1090694 2013-03-01 20:01:52

+0

如果將setHand()參數更改爲ObservableList並添加通訊錄偵聽器,您可以實現自動化。 – 2013-03-01 20:05:00

+0

所以在'setHand()'我應該在ObserbableList上添加一個監聽器,因爲每當列表大小受到影響時,我們現在可以用'setHand()'更新控制器上的卡片(可能稱之爲'updateHand()'現在)? – user1090694 2013-03-01 20:24:12