使用ChoiceBox在TableView中显示特定数据JavaFX

问题描述:

我正尝试使用选择框在tableview中显示特定数据。 可以说,我有4列,“名称”“价格”“类别”“库存”,在我的tableview。我的tableview从.txt文档获取数据,并且可以通过我的GUI中的文本字段添加数据。 我的选择框是价值“类别1”“类别2”“类别3”,并且我的tableview保存数据在6行中,其中3行有类别1,3行有类别2.使用ChoiceBox在TableView中显示特定数据JavaFX

我想要什么要做的是,如果我在我的选择框中选择类别1,我的tableview应该只显示类别1的数据,依此类推。 我完全迷失了。

我的代码。

private TableView<DTOArt> table = new TableView<DTOArt>(); 
private ObservableList<DTOArt> data = FXCollections.observableArrayList(); 
private ObservableList filCat = FXCollections.observableArrayList("Category 1","Category 2","Category 3"); 

public VBox getTableView(){ 
VBox tabelView = new VBox(); 
    tabelView.setSpacing(5); 
    tabelView.setPadding(new Insets(10,10,10,10)); 

    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

    table.setEditable(true); 

    TableColumn nameCol = new TableColumn("Name"); 
    nameCol.setCellValueFactory(new PropertyValueFactory<DTOArt, String>("name")); 

    TableColumn priceCol = new TableColumn("Price"); 
    priceCol.setCellValueFactory(new PropertyValueFactory<DTOArt, String>("price")); 

    TableColumn categoryCol = new TableColumn("Category"); 
    categoryCol.setCellValueFactory(new PropertyValueFactory<DTOArt, String>("category")); 

    TableColumn inStockCol = new TableColumn("in Stock"); 
    inStockCol.setCellValueFactory(new PropertyValueFactory<DTOArt, String>("inStock")); 


    table.setItems(data); 

    table.getColumns().addAll(nameCol,priceCol,categoryCol,inStockCol); 

    tabelView.getChildren().add(table); 

    return tabelView; 
} 

我的选择框。

ChoiceBox categoryCB = new ChoiceBox(); 
categoryCB.setItems(filCat); 
categoryCB.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>(){ 

     @Override 
     public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue){ 


      } 

    }); 

将所有项目列表包含在FilteredList中。这允许您指定Predicate以按项目过滤项目。

private final ObservableList<DTOArt> data = FXCollections.observableArrayList(); 

private final FilteredList<DTOArt> filteredData = new FilteredList<>(data); 
ChoiceBox<String> categoryCB = new ChoiceBox<>(); 
categoryCB.setItems(filCat); 
categoryCB.valueProperty().addListener(new ChangeListener<String>(){ 

    @Override 
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue){ 
     filteredData.setPredicate(newValue == null ? null : (DTOArt e) -> newValue.equals(e.getCategory())); 
    } 

}); 
table.setItems(filteredData); 

此外,如果你想允许动态改变类别,你应该使用提取的ObservableList

private final ObservableList<DTOArt> data = FXCollections.observableArrayList((DTOArt e) -> new Observable[] { e.categoryProperty() });