Добавить кнопки в редактируемую строку - PullRequest
0 голосов
/ 16 декабря 2018

Я попытался найти ответы на свой вопрос в Google и StackOverflow, но не смог найти.

У меня есть программа, которая добавляет / считывает данные из базы данных и таблицы.Я хочу иметь возможность редактировать ранее введенные данные из таблицы, добавив две кнопки (Сохранить и прервать) к текущей редактируемой строке.

У меня возникли некоторые проблемы с пониманием таких процедур, как обратный вызов и т. Д. Но яудалось получить столбец с двумя кнопками, чтобы появиться, когда я начинаю редактирование.Но я получаю кнопки в каждом столбце, мне просто нужны кнопки в выбранной в данный момент строке

.Также я не очень понимаю, как получить текущий объект из кнопки сохранения, чтобы иметь возможность сохранить его.А также, как должна работать кнопка отмены для отмены всех изменений.

public void setUpTableView() {
    columnAnkomstdatum.setCellValueFactory(new PropertyValueFactory<>("arrivalDate"));
    columnSupplier.setCellValueFactory(new PropertyValueFactory<>("supplier"));
    columnRadiopharmaceutical.setCellValueFactory(new PropertyValueFactory<>("radiopharmaceutical"));
    columnActivity.setCellValueFactory(new PropertyValueFactory<>("startActivity"));
    columnCalibrationdate.setCellValueFactory(new PropertyValueFactory<>("startDate"));
    columnBatchNumber.setCellValueFactory(new PropertyValueFactory<>("batchNumber"));
    columnContaminationControl.setCellValueFactory(new PropertyValueFactory<>("contaminationControll"));
    columnRoom.setCellValueFactory(new PropertyValueFactory<>("room"));
    columnUser.setCellValueFactory(new PropertyValueFactory<>("user"));

    tableview.setEditable(true);
    columnSupplier.setEditable(true);
    columnSupplier.setCellFactory(ComboBoxTableCell.forTableColumn(supplierList));
    columnSupplier.setOnEditCommit(t -> {

        ArrayList<Radiopharmaceutical> radioListfromSupplier = new RadiopharmaceuticalDao().getRadiopharmaceuticalsBySupplierName(t.getNewValue().getSupplierName());
        radioList = FXCollections.observableArrayList(radioListfromSupplier);
        t.getRowValue().setSupplier(t.getNewValue());
        columnRadiopharmaceutical.setCellFactory(ComboBoxTableCell.forTableColumn(radioList));

        if(tableview.getColumns().size() <= 9) {
            addButtonsToTable();
        }

    });

}

private void addButtonsToTable() {

    TableColumn<RegRadio, Void> editRow = new TableColumn<>("Edit");
    tableview.getColumns().add(editRow);

    Callback<TableColumn<RegRadio, Void>, TableCell<RegRadio, Void>> cellFactory = new Callback<TableColumn<RegRadio,Void>, TableCell<RegRadio,Void>>() {
        @Override
        public TableCell<RegRadio, Void> call(final TableColumn<RegRadio, Void> param) {
            final TableCell<RegRadio, Void> cell = new TableCell<RegRadio, Void>() {

                private final Button btnSave = new Button("Save");
                private final Button btnAbort = new Button("Avbryt");

                {
                    btnSave.setOnAction((ActionEvent event) -> {
                        RegRadio rr = getTableView().getItems().get(getIndex());

                        System.out.println("Saved");
                    });
                }
                {
                    btnAbort.setOnAction((ActionEvent event) -> {
                        System.out.println("Abort");
                    });
                }

                @Override
                public void updateItem(Void item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty) {
                        setGraphic(null);
                    } else {
                        HBox pane = new HBox(btnSave, btnAbort);
                        setGraphic(pane);
                    }
                }
            };
            return cell;
        }
    };
    editRow.setCellFactory(cellFactory);

    tableview.getColumns().add(editRow);
}

Before Edit After Edit

1 Ответ

0 голосов
/ 17 декабря 2018

В вашем обратном вызове updateItem вы можете проверить, находится ли ячейка в выбранной строке, чтобы решить, следует ли показывать кнопки или нет.Кроме того, вам также нужен флаг, чтобы проверить, редактирует ли пользователь.Примерно так:

@Override
public void updateItem(Void item, boolean empty) {
    super.updateItem(item, empty);        
    var selectedCells = tableview.getSelectionModel().getSelectedCells();

    if (empty || !isEditing || selectedCells.isEmpty || getTableRow().getIndex() != selectedCells.get(0).getRow()) {
        setGraphic(null);
    } else {    
        HBox pane = new HBox(btnSave, btnAbort);
        setGraphic(pane);
    }
}

Другой подход - изменить видимость кнопок в зависимости от того, находится ли ячейка в выбранной строке:

@Override
public void updateItem(Void item, boolean empty) {
    super.updateItem(item, empty);

    if (empty) {
        setGraphic(null);
    } else {    
        HBox pane = new HBox(btnSave, btnAbort); 
        var selectedCells = tableview.getSelectionModel().getSelectedCells();
        pane.setVisible(!selectedCells.isEmpty() && getTableRow().getIndex() == selectedCells.get(0).getRow())
        setGraphic(pane);
    }
}

(я не скомпилировали проверил эти примеры кода)

...