将按钮添加到当前正在编辑的行

时间:2018-12-16 20:55:37

标签: button javafx tableview javafx-2

我尝试搜索google和stackoverflow来寻找问题的答案,但找不到任何内容。

我有一个程序,可以从数据库和表视图中添加/读取数据。我希望能够通过在正在编辑的当前行中添加两个按钮(“保存”和“中止”)来从表视图中编辑先前输入的数据。

我在理解诸如Callback之类的例程时遇到了一些麻烦。但是我设法在开始编辑时获得了带有两个按钮的列。但是我在每一列上都有按钮,我只想要当前

上的按钮

选定的行。另外我也不是很了解如何从保存按钮获取当前对象以进行保存。 以及取消按钮如何取消所有更改。

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 :(得分:0)

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);
    }
}

(我尚未编译和测试这些代码示例)