我正在尝试使用选项框在tableview中显示特定数据。 可以说我有4列,"名称" "价格" "分类" "在Stock",在我的tableview中。我的tableview是从.txt文档获取数据,并且可以通过GUI中的文本字段添加数据。 我的选择框保持价值"类别1" "类别2" "类别3",并且我的tableview将数据保存为6行,其中3行具有类别1,3行具有类别2.
我想要做的是,如果我在我的选择框中选择类别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){
}
});
答案 0 :(得分:0)
包装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() });