2013-12-10 79 views
1

我在填充JavaFX表視圖時遇到問題。我有正確數量的行和列,但我的字符串沒有顯示在表中。這是擴展TableView類中的方法。JavaFX Table not populating

public void buildTable() { 
    ArrayList<Phy> phy = manager.getPhy(); 
    ObservableList<ObservableList> list = FXCollections.observableArrayList(); 

    TableColumn v = new TableColumn("Virt"); 
    v.setMinWidth(100); 

    TableColumn p = new TableColumn("Phy"); 
    p.setMinWidth(100); 

    this.getColumns().addAll(v, p); 

    int size = 0; 
    for (Phy pp : phy) { 
     ObservableList<String> row = FXCollections.observableArrayList(); 
     size = pp.getVirt().getFunc().size() > size ? pp.getVirt().getFunc().size() : size; 

     row.add(pp.getVirt().getName()); 
     row.add(pp.getName()); 
     for (Func func : pp.getVirt().getFunc()) { 
      row.add(func.getName()); 
     } 
     list.add(row); 
    } 

    for (int i = 0; i < size; i++) { 
     TableColumn obj = new TableColumn("Func " + i); 
     obj.setMinWidth(100); 
     this.getColumns().add(obj); 
    } 

    this.setItems(list); 
} 

我的行長度不定。這可能是一個問題嗎?

該表似乎也顯示得很慢。當我點擊嵌入的Tab時,需要幾秒鐘的時間才能顯示。

謝謝

回答

1

總是!從GUI線程更新您的GUI組件!

Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
     // code to update GUI elements 
    } 
}); 

Platform.runLater()實質上增加了你的語句添加到隊列中,它得到的非阻塞的方式執行,以更新從GUI線程中的GUI元素。如果你嘗試從非GUI線程更新GUI元素,有時它可能工作,其他人不會,有時它會給出奇怪的線程異常等。

此外,沒有必要有2 ObservableList的。只需使用一個,然後插入一行數據。

你會發現這個例子幫助:https://github.com/SnakeDoc/superD/blob/master/src/com/vanomaly/superd/controller/MainWindowController.java

線186開始,增加了數據表的方法。如您所見,它使用Platform.runLater()以及控制器類(MVC模式的一部分)中的靜態方法。

表和列設置是在64-68,和列設置(特殊數據類型,格式等)是在133-163。