动态添加值到选定的 javafx ComboBoxTableCell

问题描述 投票:0回答:1

我有一个

TableView
,其中有两列,分别名为“产品”和“品牌”。一个产品可以有不同的品牌。例如。电视有不同的品牌,如三星、索尼等。我在组合框中显示产品的品牌。

这就是我为我的品牌专栏添加

ComboBoxTableCell
的方式。

    ObservableList<String> catList = FXCollections.observableArrayList();

    categoryCol.setCellFactory(t -> {   
        ComboBoxTableCell comboCell = new ComboBoxTableCell(catList);
        return comboCell;
    });
    contactTable.getColumns().add(categoryCol);

现在在这些组合框中我想添加品牌值。由于产品不同,因此他们的品牌也会不同。例如。

Product  |  Model
----------------------------------------------
TV       |  ComboBox[Samsung, Sony, Panasonic] 
Monitor  |  ComboBox[Dell, Microsoft, Apple ]

现在,由于组合框具有相同的数据模型(ObservableList),我如何通过选择表中的项目来向它们添加不同的值。有可能吗?预先感谢您的帮助。

javafx javafx-2 javafx-8
1个回答
3
投票

首先,您需要一个自定义行类来存储元素, 那么你必须从

@Override
startEdit()
ComboBoxTreeTableCell
例如这样:

@Override public void startEdit() {
    MyCustomRow currentRow = getTableRow().getItem();
    getItems().setAll(currentRow.getModels());
    super.startEdit();
    
}

我的自定义行:

package mypackage;

import javafx.beans.property.SimpleStringProperty;

import java.util.List;
import java.util.Map;

public class MyCustomRow {

    private SimpleStringProperty product;

    private SimpleStringProperty model;

    private List<String> allModels;

    public MyCustomRow(
            String product,
            String model,
            List<String> models) {
        this.product = new SimpleStringProperty(product);
        this.model = new SimpleStringProperty(product);
        this.allModels = models;
   }

    public String getProduct() {
        return product.get();
    }

    public SimpleStringProperty productProperty() {
        return product;
    }

    public String getModel() {
        return model.get();
    }

    public SimpleStringProperty modelProperty() {
        return model;
    }

    public List<String> getModels() {
        return allModels;
    }
}

然后在你的控制器类中你可以说:

ObservableList<String> carList = FXCollections.observableArrayList();

    categoryCol.setCellFactory(t -> new ComboBoxTableCell(carList){
         @Override public void startEdit() {
            MyCustomRow currentRow = getTableRow().getItem();
            getItems().setAll(currentRow.getModels());
            super.startEdit();
        }
    });
    categoryCol.setCellValueFactory(v -> v.getValue().modelProperty());
    contactTable.getColumns().add(categoryCol);

因此,您在每一行添加适当的模型。因此,在

ComboBox
中,您将只有属于该产品的项目(型号)

© www.soinside.com 2019 - 2024. All rights reserved.