使用ChoiceBox在TableView JavaFX

时间:2017-09-24 11:03:00

标签: javafx tableview

我正在尝试使用选项框在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){


           }

    });

1 个答案:

答案 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() });