JavaFX - 如何防止鼠标点击TableCell触发其startEdit方法?

时间:2014-11-01 16:09:06

标签: user-interface javafx tableview

我从Oracle教程中得到了这个类,但是在我的应用程序中,当用户通过单击鼠标按钮在表格单元格上进行聚焦但是通过其他独立控件调用它时,我不想触发单元格编辑功能。如果只有一个类包含一些事件处理程序,但它并没有被我强行,那将很容易。

 class EditingCell extends TableCell<Person, 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(new ChangeListener<Boolean>(){
            @Override
            public void changed(ObservableValue<? extends Boolean> arg0, 
                Boolean arg1, Boolean arg2) {
                    if (!arg2) {
                        commitEdit(textField.getText());
                    }
            }
        });
    }

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

1 个答案:

答案 0 :(得分:0)

好吧有一个名为setEditable(boolean)的TabelCell命令,我认为你应该设置为false(假设我得到你想要的东西),然后将它设置为true并在你的隔离控件是调用。我并没有真正搞砸TableCell。