我试图将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;
}
}
};
}
答案 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());
});