使用javafx的表视图中的对话框将值设置为特定单元格

时间:2015-12-27 19:03:35

标签: java javafx tableview

我成功地使表格列可编辑,并在双击单元格时更新值。现在我想要做的是从txt字段获取值并将值设置为所选行的特定单元格(列)。我经历了很多研究,但找不到合适的答案。 Javafx不允许直接编辑表格的值,除非直接编辑单元格并设置其值。

谢谢

这是迄今为止我所做的一个例子。

将cellValueFactory设置为表格列

tblColQuantity.setCellValueFactory(cellData -> cellData.getValue()
        .quantityProperty());
tblColQuantity.setCellFactory(col -> new IntegerEditingCell());

tblColRateWithoutvat.setCellValueFactory(cellData -> cellData
        .getValue().rateWithoutvatProperty());
tblColRateWithoutvat.setCellFactory(col -> new IntegerEditingCell());

tblColTotalWithvat.setCellValueFactory(cellData -> cellData.getValue().totalWithvatProperty());
tblColTotalWithvat.setCellFactory(col -> new IntegerEditingCell());

帮助我更新单元格数据的Inner类

public class IntegerEditingCell extends TableCell<AddBillTable, Number> {

    private final TextField textField = new TextField();
    private final Pattern intPattern = Pattern.compile("\\d*\\.\\d+");

    // -?\\d+
    public IntegerEditingCell() {
        textField.focusedProperty().addListener(
                (obs, wasFocused, isNowFocused) -> {
                    if (!isNowFocused) {
                        processEdit();
                    }
                });
        textField.setOnAction(event -> processEdit());
    }

    private void processEdit() {
        String text = textField.getText();
        if (intPattern.matcher(text).matches()) {
            commitEdit(Float.parseFloat(text));
        } else {
            cancelEdit();
        }
    }

    @Override
    public void updateItem(Number value, boolean empty) {
        super.updateItem(value, empty);
        if (empty || value.equals(null)) {
            setText(null);
            setGraphic(null);
        } else if (isEditing()) {
            setText(null);
            textField.setText(value.toString());
            setGraphic(textField);
        }/*
         * else if (!empty){ textField.setText(value.toString()); }
         */else {
            // if((!value.toString().equals(null)) || (value==null)){
            setText(value.toString());
            setGraphic(null);
            System.out.println("Updated");
            System.out.println(this.textField.getText());


            // }

        }
    }

    @Override
    public void startEdit() {
        super.startEdit();
        Number value = getItem();
        if (value != null) {
            textField.setText(value.toString());
            setGraphic(textField);
            setText(null);
        }
    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();
        setText(getItem().toString());
        setGraphic(null);
    }

    // This seems necessary to persist the edit on loss of focus; not sure
    // why:
    @Override
    public void commitEdit(Number value) {
        super.commitEdit(value);
        // ((PurchaseDetail)this.getTableRow().getItem()).setQuantity(value.floatValue());
        System.out.println("Commit edit " + value);
        detectEditedCell(value);
    }
}

1 个答案:

答案 0 :(得分:0)

您可以从表中获取所选项,并调用与该列所代表的属性对应的相应set方法。

例如,如果您希望文本字段更新当前所选行的quantity,则可以执行以下操作:

TextField textField = new TextField();
textField.setOnAction(e -> {
    AddBillTable selectedItem = table.getSelectionModel().getSelectedItem();
    if (selectedItem != null) {
        selectedItem.setQuantity(Integer.parseInt(textField.getText()));
    }
});

只要您使用JavaFX可观察属性(AddBillTableStringProperty等)实现模型类(示例中为IntegerProperty),然后更改属性值将自动更新桌子。