繁体   English   中英

JavaFX-如何将TreeItem视为TreeCell

[英]JavaFX - How to treat TreeItem as TreeCell

在我的JavaFX App中,我想通过单击Menu上的按钮来运行TreeView CellFactory中实现的startEdit()方法。 问题是,我无法直接使用Callback赋予TreeItem的方法,也看不到任何其他方法可以使每个TreeItem可编辑。

这是我的Tree实现中的代码,cellfactory来自oracle教程

private class WTree extends TreeView<String> {
    private TreeItem<String> rootItem;
    private TreeItem<String> sItem;
    private TreeItem<String> aItem;
    private TreeItem<String> iItem;
    private TreeItem<String> uItem;

    public WTree() {
        super();
        rootItem = new TreeItem<String>("Employees");
        sItem = new TreeItem<String>("Sales Departament");
        aItem = new TreeItem<String>("Accounts Departament");
        iItem = new TreeItem<String>("IT Support");
        uItem = new TreeItem<String>("Undercover");

        this.setRoot(rootItem);
        rootItem.getChildren().addAll(sItem, aItem, iItem, uItem);

        rootItem.setExpanded(true);

        this.setEditable(true);

        this.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
            @Override
            public TreeCell<String> call(TreeView<String> p) {
                return new TextFieldTreeCellImpl();
            }
        });
    }
}

 private final class TextFieldTreeCellImpl extends TreeCell<String> {

        private TextField textField;
        private boolean focused;




        public TextFieldTreeCellImpl() {
        }

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

            if (textField == null) {
                createTextField();
            }
            setText(null);
            setGraphic(textField);
            textField.selectAll();
        }

        @Override
        public void cancelEdit() {
            super.cancelEdit();
            setText((String) getItem());
            setGraphic(getTreeItem().getGraphic());
        }

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

        private void createTextField() {
            textField = new TextField(getString());
            textField.setOnKeyReleased(new EventHandler<KeyEvent>() {

                @Override
                public void handle(KeyEvent t) {
                    if (t.getCode() == KeyCode.ENTER) {
                        commitEdit(textField.getText());
                    } else if (t.getCode() == KeyCode.ESCAPE) {
                        cancelEdit();
                    }
                }
            });


        }

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

private class WTextField extends TextField {
    public WTextField(String desc) {
        super();
        this.setPromptText(desc);
        this.setPrefWidth(100);

    }
}

还有我的菜单处理者

            editLabel.setOnMouseClicked(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {


                  if(tree.isFocused()) {
                  tree.requestFocus();
                  FocusModel<TreeItem<String>> treeSelect = tree.getFocusModel();
                  TreeItem<String> foc = treeSelect.getFocusedItem();





                  }   

我不确定我是否真的完全理解您的问题,但是我认为您正在寻找TreeView.edit(...)方法。 你可以做类似的事情

        editLabel.setOnMouseClicked(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {
                tree.edit(tree.getSelectionModel().getSelectedItem());
            }
        });

暂无
暂无

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

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