动态地向选定的javafx ComboBoxTableCell添加值

时间:2017-06-02 00:37:09

标签: javafx javafx-2 javafx-8

我有TableView,其中有两列名为Product和Brand。产品可以是不同的品牌。例如。电视有不同的品牌,如三星,索尼等。我在ComboBoxes展示产品品牌。

这就是我为我的品牌专栏添加ComboBoxTableCell的方法。

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

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

现在在这些ComboBoxes中我想添加品牌的价值。由于会有不同的产品,所以他们的品牌也会有所不同。例如

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

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

1 个答案:

答案 0 :(得分:1)

首先,您需要一个自定义行类来存储元素,  那么你必须以@OverridestartEdit() ComboBoxTreeTableCell,例如这样:

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

MyCustomRow:

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中,您将只拥有属于产品的那些项目(模型)