JavaFX TableView ComboBox String Converter



我正在尝试将ComboBox添加到TableView中,但由于某种原因我无法进行转换。在幕后,如果值是 0,那么如果值为 1,它应该显示"free",那么它将在组合框中显示"采取",一旦用户更改了组合框中的值 它将保存其整数值。

我不确定如何添加转换器,它在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;
}
}
};
}

您需要使用重载方法:

forTableColumn(StringConverter converter, 可观察列表项(

请注意,组合框支持列表应包含 0, 1 而不是 Free, Taken。转换器负责将 0 显示为免费,将 1 显示为已采取。

此外,表列的类型应为<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());
});

最新更新