将整数映射到组合框中的自定义类的字符串

时间:2019-01-05 18:32:31

标签: javafx

我有一个tabelview,其中显示了被任命者的列表。每个任命者都有一个分配的组,该组的ID保存在任命类中。

我想在一个表格单元格中显示一个组合框,以显示选定的组和所有其他存在的组。我可以在单元格工厂中设置组合框的项目,但不能设置各个被任命者的选定值。

我有一种方法,当我向其提供ID时,它会从可观察的列表中返回Group。那意味着我需要cellfactory中的id,但是我没有找到一种方法来做到这一点。我还需要显示组的名称,而不是对分类的引用。有没有办法做到这一点,还是我应该改变我的方法?

被任命者类

public class Appointee {

private SimpleIntegerProperty id;
private SimpleStringProperty firstname;
private SimpleStringProperty lastname;
private SimpleIntegerProperty group;
private SimpleIntegerProperty assigned;

public Appointee(int id, String firstname, String lastname, int group, int assigned){
    this.id = new SimpleIntegerProperty(id);
    this.firstname = new SimpleStringProperty(firstname);
    this.lastname = new SimpleStringProperty(lastname);
    this.group = new SimpleIntegerProperty(group);
    this.assigned = new SimpleIntegerProperty(assigned);
}

Group类

public class Group {
private IntegerProperty id;
private StringProperty name;
private IntegerProperty members;
private IntegerProperty assigned;

public Group(int id, String name, int members, int assigned) {
    this.id = new SimpleIntegerProperty(id);
    this.name = new SimpleStringProperty(name);
    this.members = new SimpleIntegerProperty(members);
    this.assigned = new SimpleIntegerProperty(assigned);
}

约会表视图

public AppointeeTableView() {
    // define table view
    this.setPrefHeight(800);
    this.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    this.setItems(MainController.appointeeObervableList);
    this.setEditable(true);

    // define columns
    ...
    TableColumn groupCol = new TableColumn("Group"); // group
    groupCol.setCellFactory(col -> {
        TableCell<Group, StringProperty> c = new TableCell<>();
        final ComboBox<String> comboBox = new ComboBox(MainController.groupObservableList);
        c.graphicProperty().bind(Bindings.when(c.emptyProperty()).then((Node) null).otherwise(comboBox));
        return c;
    });
    groupCol.setEditable(false);  
    ...
}

2 个答案:

答案 0 :(得分:0)

重写updateItem的{​​{1}}方法以更新单元格,确保在更改TableCell值后保存新值,并使用TableCell

cellValueFactory

答案 1 :(得分:0)

仅从一些小的代码片段很难分辨,但是在使用前端时,我的一般建议是区分模型和每个级别的呈现。这适用于JavaFX,Swing和Angular应用程序。

被任命的TableView应该应该是TableView<Appointee>

对于appointee.group属性,您有两个选择:使用Group或(例如,当从JSON解串/向JSON序列化时,这会产生太多重复数据),然后使用业务密钥。第一个选项通常更易于实现和使用。使用第二个选项,您将需要一些服务/代码才能转换回Group,并且必须考虑要在哪个级别/确切地执行转换。

让我们继续第二个选项,因为您当前已将appointee.group指定为整数。

在这种情况下,组列应为TableColum<Appointee, Integer>。 然后,组单元格应为TableCell<Appointee, Integer>

到目前为止,我们只讨论了模型,除了要在表中显示被任命者之外,还没有讨论渲染。

我建议在下一级也这样做。

不要ComboBox<String>用于组comboBox,而将 ComboBox<Group> 。字符串是您要如何在comboBox中呈现组的方式,而组是模型。另外,ComboBox<Integer>(业务密钥的类型)有点误导(因为您需要Groups comboBox,而不是整数comboBox),并且限制了代码的灵活性。

在comboBox中预先选择一个值时,请使用我提到的转换服务/代码。

group单元格的类型应为ListCell<Group>,在updateItem方法中(该方法涉及如何呈现Group),您可以例如使用name属性获取String表示形式。

当然,这种方法也有所不同,但请确保在每个级别上您都知道控件的模型是什么以及控件的呈现器是什么。始终使用模型设计代码,并且仅在最低渲染级别使用渲染类型。