2017-04-04 153 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)'这是正确的方法吗? –