Редактирование TableView

338
22 августа 2017, 12:08

Хочу сделать так, чтобы можно было редактировать данные прямо в таблице. Но при вызове методы setOnEditCommit для обоих столбцов пишет: неверный параметр в лямбда-вырадении, ожидает Event а видит CellEditEvent.

package controllers;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.util.Callback;
import objects.Word;
public class Controller {
    @FXML
    public TableColumn wordCol;
    @FXML
    public TableColumn translateCol;
    @FXML
    public TableView table;
    @FXML
    private void initialize() {
        table.setEditable(true);
        Callback<TableColumn<Word, String>, TableCell<Word, String>> cellFactory = (TableColumn<Word, String> tc) -> new EditingCell();
        wordCol.setCellValueFactory(new PropertyValueFactory<>(""));
        wordCol.setCellFactory(cellFactory);
        wordCol.setOnEditCommit((CellEditEvent<Word, String> e) -> {
            ((Word) e.getTableView().getItems().get(e.getTablePosition().getRow())).setWord(e.getNewValue());
        });
        translateCol.setCellValueFactory(new PropertyValueFactory<>(""));
        translateCol.setCellFactory(cellFactory);
        translateCol.setOnEditCommit((CellEditEvent<Word, String> e) -> {
            ((Word) e.getTableView().getItems().get(e.getTablePosition().getRow())).setTranslate(e.getNewValue());
        });
    }
    class EditingCell extends TableCell<Word, String> {
        private TextField textField;
        public EditingCell(){}
        @Override
        public void startEdit() {
            if(!isEmpty()) {
                super.startEdit();
                createTextField();
                setText(null);
                setGraphic(textField);
                textField.selectAll();
            }
        }
        @Override
        public void cancelEdit() {
            super.cancelEdit();
            setText((String) getItem());
            setGraphic(null);
        }
        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
                setGraphic(null);
            } else {
                if (isEditing()) {
                    if (textField != null) {
                        textField.setText(getString());
                    }
                    setText(null);
                    setGraphic(textField);
                } else {
                    setText(getString());
                    setGraphic(null);
                }
            }
        }
        private void createTextField() {
            textField = new TextField(getString());
            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
            textField.focusedProperty().addListener(
                    (ObservableValue<? extends Boolean> arg0,
                     Boolean arg1, Boolean arg2) -> {
                        if (!arg2) {
                            commitEdit(textField.getText());
                        }
                    });
        }
        private String getString() {
            return getItem() == null ? "" : getItem().toString();
        }
    }
}

Вот класс Word

public class Word {
    private SimpleStringProperty word;
    private SimpleStringProperty translate;
    public Word(String word, String translate) {
        this.word = new SimpleStringProperty(word);
        this.translate = new SimpleStringProperty(translate);
    }
    public Word() {
        this.word = new SimpleStringProperty(null);
        this.translate = new SimpleStringProperty(null);
    }
    public String getWord() {
        return word.get();
    }
    public SimpleStringProperty wordProperty() {
        return word;
    }
    public void setWord(String word) {
        this.word.set(word);
    }
    public String getTranslate() {
        return translate.get();
    }
    public SimpleStringProperty translateProperty() {
        return translate;
    }
    public void setTranslate(String translate) {
        this.translate.set(translate);
    }
}
Answer 1
  1. Параметризуйте колонки wordCol и translateCol параметрами <Word, String>.

  2. Вместо ((Word) e.getTableView().getItems().get(e.getTablePosition().getRow())).setBlaBlaBla сделайте так:

    if (e.getTablePosition() != null) { e.getRowValue().setBlaBlaBla(e.getNewValue); }

UPDATE

Вам необходимо написать так

    @FXML
    public TableColumn<Word, String> wordCol;
    @FXML
    public TableColumn<Word, String> translateCol;
READ ALSO
Ошибка при запуске Spring Boot приложения

Ошибка при запуске Spring Boot приложения

Пытайюсь задеплоить приложение Spring Boot на PayaraВот что получаеться в итоге:

499
не добавляются записи в базу данных

не добавляются записи в базу данных

Добавляю записи в бд таким образом:

286
Jsoup doc.select - как определить первое слово

Jsoup doc.select - как определить первое слово

Нужно из #mrp получить число 101, что-то типа

273
HibernateException: No Session found for current thread

HibernateException: No Session found for current thread

Всем привет, я попытался создать проект в котором можно создать себе аккаунт и потом усуществлять все возможные операции CRUD над класом Product...

271