2017-04-04 56 views
0

在我的FXMLTableViewController.java中,我添加了一個搜索功能,它使用Sorted Filtered List在相同的TableView中顯示搜索結果(過濾結果)。此代碼取自here這是我在項目中實施的內容。但它會拋出異常,當我做平常data2.add(new Entity(""));如何基於排序過濾列表在JavaFX中向TableView添加新行?

public class FXMLTableViewController { 

@FXML 
private TableView<Entity> tableView; 

@FXML 
private JFXTextField searchBox; 

@FXML 
public void initialize() throws IOException, ParseException { 
tableView.setItems(data2); //data2 is a observable list returned my another function, it is not related here. 
    FilteredList<Entity> filteredData = new FilteredList<> (data2, p -> true); 
     searchBox.textProperty().addListener((observable, oldValue, newValue) -> { 
      filteredData.setPredicate(person -> { 
       if (newValue == null || newValue.isEmpty()) { 
       return true; 
      } 

      String lowerCaseFilter = newValue.toLowerCase(); 
      return Person.getPsfName_add().toLowerCase().contains(lowerCaseFilter) 
     }); 
    }); 
    SortedList<Entity> sortedData = new SortedList<>(filteredData); 
    sortedData.comparatorProperty().bind(tableView.comparatorProperty()); 
    tableView.setItems(sortedData); 
    sortedData.add(new Entity("")); //error line 
    tableView.refresh(); 

} 

}

現在,每當我嘗試添加一個新的實體對象,我得到了錯誤

java.lang.UnsupportedOperationException 

這是我的猜測是,由於SortedLists是不可修改的事實?我該如何解決這個問題?我想在我的項目的各個點添加新的行,但我也想要搜索/過濾設施。

回答

1

排序(和過濾)列表是不可修改的。您應該修改下面的列表(data2),並且排序/過濾列表將自動更新(它正在觀察底層ObservableList)。

你需要的代碼如下所示:

public class FXMLTableViewController { 

    @FXML 
    private TableView<Entity> tableView; 

    @FXML 
    private JFXTextField searchBox; 

    @FXML 
    public void initialize() throws IOException, ParseException { 

     FilteredList<Entity> filteredData = new FilteredList<> (data2, p -> true); 
     searchBox.textProperty().addListener((observable, oldValue, newValue) -> { 
      filteredData.setPredicate(person -> { 
       if (newValue == null || newValue.isEmpty()) { 
        return true; 
       } 

       String lowerCaseFilter = newValue.toLowerCase(); 
       return Person.getPsfName_add().toLowerCase().contains(lowerCaseFilter) 
      }); 
     }); 
     SortedList<Entity> sortedData = new SortedList<>(filteredData); 
     sortedData.comparatorProperty().bind(tableView.comparatorProperty()); 
     tableView.setItems(sortedData); 

     data2.add(new Entity("")); //error line 

    } 

} 

注意爲清楚起見,我刪除了第一次調用tableView.setItems(...)因爲你只設置items別的東西隨即。另請注意,tableView.refresh()是多餘的(表格也在觀察構成其項目的ObservableList)。

+0

好了,另外一個問題,在我的代碼中的某些點我做了'AddRowsPopup.setTableList((tableView.getItems());'調用這個列表中設置到另一個列表,這樣我可以在其他控制器類使用。並且在這種情況下,'公共靜態ObservableLIst 數據; setTableList(ObservableList DATA3){數據DATA3 =;}'被稱爲然後這個'data'變量用於添加來自不同控制器類EG-'data.add行(新的實體(「」))',就像一個會用以前的數據2變量。這又使再次拋出之前的'不支持Exception'回到原點:( –

+0

它基本上是同樣的問題,不是嗎?使用在模型和共享列表與任何一個控制器需要訪問它的底層數據等包裹基礎列表中過濾和/或排序的列表在表中顯示出來,如果你想牛逼他的表格以篩選和/或排序的方式顯示它。如果要共享控制器之間的過濾/排序,請使模型的謂詞/比較器部分共享。 –

+0

好吧!我只是解決這個問題!我所需要做的就是'setTableList(data2)'這是正確的方法嗎? –

相關問題