简体   繁体   English

Javafx Tableview无需输入键即可保存数据

[英]Javafx Tableview save data without enter key

I tried to find a solution to save data for my editable cell direct without pressing enter to save it. 我试图找到一种解决方案,可以直接为可编辑单元格保存数据,而无需按Enter来保存它。 Most solutions were for starting editing without double click(I implemented that) and I saw no solution for saving data without enter key. 大多数解决方案是在没有双击的情况下开始编辑(我实现了这一点),我看到没有输入键就无法保存数据的解决方案。 So based on my knowledge and research I didn't find anything to help me, is this what I'm asking possible and how to do it? 因此,根据我的知识和研究,我没有找到任何帮助的方法,这是我要问的问题吗?如何做?

Edited: 编辑:

@FXML
private TableView tableVeiwResults;
@FXML
private TableColumn colAnalysis;
@FXML
private TableColumn colResult;
private AnalysisPacientDetailsJpaController apdjpa = new 
AnalysisPacientDetailsJpaController(emf);

 colAnalysis.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<AnalysisPacientDetails, String>, ObservableValue<String>>() {
        @Override
        public ObservableValue<String> call(TableColumn.CellDataFeatures<AnalysisPacientDetails, String> param) {
            return new SimpleStringProperty((param.getValue()).getIdAnalysis().getAnalysisName());

        }
    });


 colResult.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<AnalysisPacientDetails, String>, ObservableValue<String>>() {
        @Override
        public ObservableValue<String> call(TableColumn.CellDataFeatures<AnalysisPacientDetails, String> param) {
            return new SimpleStringProperty((param.getValue()).getAnalysisPacientDetailsResults());
        }
    });

 colResult.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<AnalysisPacientDetails, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<AnalysisPacientDetails, String> event) {
            try {

                String newValue = event.getNewValue();
                if (newValue == null || newValue.trim().isEmpty()) {
                    return;
                }

AnalysisPacientDetails apdRes = (AnalysisPacientDetails) tableVeiwResults.getSelectionModel().getSelectedItem();


apdRes.setAnalysisPacientDetailsRezultat(event.getNewValue());

                apdjpa.edit(apdRes);

tableVeiwResults.refresh();
                TablePosition pos = tableVeiwResults.getFocusModel().getFocusedCell();
                if (pos.getRow() < tableVeiwResults.getItems().size() - 1) {

tableVeiwResults.getSelectionModel().clearAndSelect(pos.getRow() + 1, pos.getTableColumn());
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
  }
});

If I understand your question you want to have the data commit to the cell without hitting enter (ie user hits tab). 如果我理解您的问题,您希望不提交回车(即用户点击标签)就将数据提交到单元格。

We created our own custom table cells to handle this. 我们创建了自己的定制表单元格来处理此问题。 Here is an example. 这是一个例子。

import javafx.beans.value.ChangeListener;
import javafx.event.Event;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
public class EditableStringTableCell<T, E> extends TableCell<T, String> {
    protected TextField textField;
    protected ChangeListener<? super Boolean> changeListener = (obs,ov, nv) -> {
        if (!nv) {
            commitEdit(textField.getText());
        }
    };

    public EditableStringTableCell () {

    }

    @Override
    public void startEdit() {
        if(editableProperty().get()){
            if (!isEmpty()) {
                super.startEdit();
                createTextField();
                setText(null);
                setGraphic(textField);
                textField.requestFocus();
            }
        }
    }

    @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());
                    textField.selectAll();
                }
                setText(null);
                setGraphic(textField);
            } else {
                setText(getString());
                setGraphic(null);
            }
        }
    }

    protected void createTextField() {
        textField = new TextField(getString());
        textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
        textField.focusedProperty().addListener(changeListener);
        textField.setOnAction(evt -> commitEdit(textField.getText()));

        textField.setOnKeyPressed((ke) -> {
            if (ke.getCode().equals(KeyCode.ESCAPE)) {
                textField.focusedProperty().removeListener(changeListener);
                cancelEdit();
            }
            if (ke.getCode().equals(KeyCode.TAB)) {
                commitEdit(textField.getText());
            }
        });
    }



    protected String getString() {
        return getItem() == null ? "" : getItem().toString();
    }

    @Override
    @SuppressWarnings({"unchecked", "rawtypes"})
    public void commitEdit(String item) {
        textField.focusedProperty().removeListener(changeListener);
        if (isEditing()) {
            super.commitEdit(item);
        } else {
            final TableView table = getTableView();
            if (table != null) {
                TablePosition position = new TablePosition(getTableView(),
                        getTableRow().getIndex(), getTableColumn());
                CellEditEvent editEvent = new CellEditEvent(table, position,
                        TableColumn.editCommitEvent(), item);
                Event.fireEvent(getTableColumn(), editEvent);
            }
            updateItem(item, false);
            if (table != null) {
                table.edit(-1, null);
            }

        }
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM