使用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() });