当前位置: 首页 > 知识库问答 >
问题:

单击按钮时更改treeitem的文本

习华灿
2023-03-14

当我单击一个按钮时,有没有一种方法可以更改TreeView的TreeItem的文本?我尝试执行oracle示例http://docs.oracle.com/javafx/2/uicontrols/tree-view.htm中所示的操作,但我不想通过单击TreeItem更改它,而是单击按钮。第二步,我想使用上下文菜单打开一个带有Textfield的窗口,在这里我可以手动插入文本以更改treeitems的命名。

package treeviewexample;    

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;

public class TreeViewExample extends Application {

    @Override
    public void start(Stage primaryStage) { 

        TreeItem root = new TreeItem ("root");
        TreeItem item1 = new TreeItem ("Level1");
        TreeItem item2 = new TreeItem ("Level1");
        TreeItem item11 = new TreeItem ("Level2");
        TreeView tree = new TreeView ();
        item1.getChildren().add(item11);
        tree.setRoot(root);
        tree.getRoot().getChildren().addAll(item1, item2);
        tree.getRoot().setExpanded(true);
        StackPane rootPane = new StackPane();
        tree.setEditable(true);
        tree.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>(){

            @Override
            public TreeCell<String> call(TreeView<String>  param) {
                return new TextFieldTreeCellImpl();                       
            }
        });            

        rootPane.getChildren().add(tree);

        Button btn = new Button();
        btn.setText("Change Name to 'TEST'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                //CHANGE TEXT OF SELECTED TreeItem to "TEST"?
            }
        });
        rootPane.getChildren().add(btn);

        Scene scene = new Scene(rootPane);            

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    public class TextFieldTreeCellImpl extends TreeCell<String> {            

        private TextField textField;

        public TextFieldTreeCellImpl (){
        }    

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

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

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

共有1个答案

鱼征
2023-03-14

您可以简单地使用setValue()方法更改TreeItem的文本。

    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
              desired_tree_item.setValue("TEST");
        }
    });
 类似资料:
  • 问题内容: 说我有一个选项菜单,其中包含要连接的网络列表。 现在,当用户按下刷新按钮时,我想更新用户可以连接的网络列表。 我无法使用,因为我浏览了所有内容,但没有看到看起来像我所做选择的条目。 我不认为这可以使用tk变量来更改,因为没有这样的事情。 问题答案: 我修改了脚本以演示如何执行此操作: 单击“刷新”按钮后,将清除network_select中的选项,并插入new_choices中的选项。

  • 我能找到的每个更改按钮图像的示例都显示了当单击该按钮时如何更改它。但是我如何点击一个切换按钮,并让它改变一个常规按钮的图像呢? 关于更多细节,我有两个按钮和一个onCheckedChanged事件: 当按下切换按钮并发生onCheckedChanged事件时,我需要将btn1的背景设置为新图像。

  • 问题内容: 以下是HTML。 以下是Javscript 还有一些CSS 我要的是单击适当的按钮后,将Board组件的大小调整为适当的大小。 我已经尝试过这样 但这是行不通的。 问题答案: 您不能像这样设置React组件的状态。并且组件应负责设置自己的状态。 在您的Board组件内部,在componentDidMount中设置事件侦听器。最好的解决方案是让按钮成为React应用程序的一部分,但这超出

  • 问题内容: 我有以下代码: 如您所见,我要在单击按钮时更改大小。可能吗?上面的代码不起作用,我的意思是大小没有改变。如何动态更改尺寸? 感谢致敬。编辑: 交换选择一个JList行的面板。 ViewPanel#changeView(),这将交换面板: 问题答案: 使用布局管理器时,永远不要使用setSize()。布局管理器的工作是确定大小。您可以通过设置指定的大小或最小或最大大小来向布局管理器提供提

  • 如果你点击按钮,你会看到一个蓝色的边框,这对我来说真的很烦。对于如何让它消失/根本不出现,你有什么解决方案吗?

  • 使用React钩子,我想改变我的按钮的文本,当用户点击它说“添加”,然后我想设置回原来的文本“添加到购物车”后1秒。我假设我会为此使用setTimeout,但在这种情况下,我很难弄清楚如何使用它。 我有这个 到目前为止。