JavaFX TableView ComboBox String Converter - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь добавить ComboBox в TableView, но по какой-то причине не могу выполнить преобразование.За кулисами я хочу начать разговор, если значение равно 0, тогда должно отображаться «свободно», если значение равно 1, тогда в ComboBox будет указано «принято», и как только пользователь изменит значение в 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 голосов
/ 25 августа 2018

Вам необходимо использовать перегруженный метод:

forTableColumn (преобразователь StringConverter, элементы ObservableList)

Обратите внимание, что список поддержки ComboBoxдолжен содержать 0, 1 вместо Free, Taken.Преобразователь отвечает за отображение 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());
});
...