表视图中的JavaFX可编辑ComboBox

时间:2014-06-02 05:47:21

标签: javafx javafx-8

我在表格视图中使用可编辑的ComboBox单元格。这是我的ComboBox单元类

public class ComboBoxCell extends TableCell<ClassesProperty, String> {

    private ComboBox<String> comboBox;

    public ComboBoxCell() {
    }

    @Override
    public void startEdit() {
        super.startEdit();

        if (comboBox == null) {
            createComboBox();
        }

        setGraphic(comboBox);
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);


        Platform.runLater(new Runnable() {

            @Override
            public void run() {
            comboBox.requestFocus();
            comboBox.getEditor().requestFocus();
            comboBox.getEditor().selectAll();


            }
        });


    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();

        setText(String.valueOf(getItem()));
        setContentDisplay(ContentDisplay.TEXT_ONLY);
    }

    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            if (isEditing()) {
                if (comboBox != null) {
                    comboBox.setValue(getString());
                }
                setGraphic(comboBox);
                setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
            } else {
                setText(getString());
                setContentDisplay(ContentDisplay.TEXT_ONLY);
            }
        }
    }

    private void createComboBox() {
        // ClassesController.getLevelChoice() is the observable list of String
        comboBox = new ComboBox<>(ClassesController.getLevelChoice());
        comboBox.setEditable(true);
        comboBox.setMinWidth(this.getWidth() - this.getGraphicTextGap()*2);
        comboBox.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent t) {
                if (t.getCode() == KeyCode.ENTER) {
                    commitEdit(comboBox.getSelectionModel().getSelectedItem());
                } else if (t.getCode() == KeyCode.ESCAPE) {
                    cancelEdit();
                }
            }
        });
    }

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

问题我需要在表格单元格上单击三次以获取组合框的文本字段以编辑内容。有两种方法可以实现两次点击吗?我甚至使用了Platforn runlater,但是当我第一次尝试编辑单元格时,只需点击三次鼠标,但第二次只需点击两次。

1 个答案:

答案 0 :(得分:0)

在重写的cell.startEdit()方法中,添加带有文本字段的Lis​​tView,然后将此listview添加到setGraphic。这将在选择行并单击单元格后直接显示列表视图,列表视图将在tablecell内部,我还没有找到将其作为弹出窗口的方法