JavaFX TableView ComboBox字符串转换器

时间:2018-08-24 21:03:04

标签: java javafx tableview

我试图将ComboBox添加到TableView中,但是由于某些原因,我无法进行转换。在幕后,如果值是 0,则如果值是1,则应显示“ free”,然后在ComboBox中说“ taken”,并且一旦用户在ComboBox中更改了值 它将保存其整数值。

我不确定如何添加转换器,它在event.getNewValue()处出现以下错误:

  

不能将int转换为字符串。

我在哪里做错了吗?

private final IntegerProperty mode;   
public int getMode() {
    return mode.get();
}
public void setMode(int mode) {
    this.mode.set(mode);
}
public IntegerProperty modeProperty() {
    return mode;
}

Set<String> modeList = new HashSet<>();
modeList.add("Free");
modeList.add("Taken");

var converter=modeConverter();
TableColumn<Review, String> modeCombo = new TableColumn("Mode");
modeCombo.setCellValueFactory(new PropertyValueFactory("mode"));
modeCombo.setCellFactory(ComboBoxTableCell.forTableColumn(converter); //How to apply the converter.
modeCombo.setCellFactory(ComboBoxTableCell.forTableColumn(FXCollections.observableList(modeList))));

modeCombo.setOnEditCommit(event -> {
    mode.setOperationMode(event.getNewValue()); //Method cannot be applied java.lang.String. But I already make the conversatin via modeConverter
});

...

private StringConverter modeConverter() {
    return new StringConverter<Integer>() {
        @Override
        public String toString(Integer object) {
            if (object == 0) {
                return "FREE";
            } else {
                return "Taken";
            }
        }

        @Override
        public Integer fromString(String string) {
            if (string.equalsIgnoreCase("free")) {
                return 0;
            } else {
                return 1;
            }
        }
    };
}

1 个答案:

答案 0 :(得分:1)

您需要使用重载方法:

  

forTableColumn​(StringConverter converter, ObservableList items)

请注意,ComboBox支持列表应包含0、1,而不是Free,Take。转换器负责将“ 0”显示为“免费”,将“ 1”显示为“接受”。

此外,TableColumn的类型应为<Review, Integer>,而不是<Review, String>

在您的代码中,您可以执行以下操作:

ObservableList<Integer> modeList = FXCollections.observableList(0, 1);
TableColumn<Review, Integer> modeCombo = new TableColumn("Mode");
modeCombo.setCellValueFactory(new PropertyValueFactory("mode"));
modeCombo.setCellFactory(ComboBoxTableCell.forTableColumn(converter, modeList)));

固定基本类型后,以下各项将起作用:

modeCombo.setOnEditCommit(event -> {
   mode.setOperationMode(event.getNewValue());
});