可编辑单元格上的JavaFX工具提示

时间:2014-02-25 23:48:48

标签: java javafx tableview

我有TableView可编辑的单元格。我使用推荐的JavaFx回调来实现可编辑的单元格。

myCol.setCellFactory(TextFieldTableCell.<Student>forTableColumn());

我想为每个可编辑单元格添加工具提示,因此我必须自己制作回调。 是否可以扩展上面的Callback以添加添加ToolTip的功能,还是我必须从头开始编写自己的功能?

1 个答案:

答案 0 :(得分:1)

我担心你必须制作自己的TableCell,然后将它分配给你的TableColumn - myCol。

一个简单的例子如图所示you need to override all the functions of the TableCell as well :)

class EditingCell extends TableCell<Student, String> {

    private TextField textField;

    public EditingCell() {
       setToolTip("YOUR MESSAGE");
    }

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

然后将其添加到TableColumn

Callback<TableColumn, TableCell> cellFactory =
         new Callback<TableColumn, TableCell>() {
             public TableCell call(TableColumn p) {
                return new EditingCell();
             }
         };

firstNameCol.setCellFactory(cellFactory);

不要忘记让您的桌子可编辑!

table.setEditable(true);