Java 单击按钮时更改树项的文本

Java 单击按钮时更改树项的文本,java,javafx,treeview,Java,Javafx,Treeview,当我点击一个按钮时,有没有办法更改TreeView中TreeItem的文本? 我试着做一些类似于oracle示例中所示的事情 但是我不想通过点击它来改变TreeItem,而是点击按钮。第二步,我想使用上下文菜单打开一个带有文本字段的窗口,在这里我可以手动插入文本来更改树的命名 package treeviewexample; import javafx.application.Application; import javafx.event.ActionEvent; import ja

当我点击一个按钮时,有没有办法更改TreeView中TreeItem的文本? 我试着做一些类似于oracle示例中所示的事情 但是我不想通过点击它来改变TreeItem,而是点击按钮。第二步,我想使用上下文菜单打开一个带有文本字段的窗口,在这里我可以手动插入文本来更改树的命名

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();
        }   
    }
}
package-treeview示例;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.event;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.TextField;
导入javafx.scene.control.TreeCell;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeView;
导入javafx.scene.input.KeyCode;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
导入javafx.util.Callback;
公共类TreeViewExample扩展了应用程序{
@凌驾
公共无效开始(阶段初始阶段){
TreeItem root=新的TreeItem(“根”);
TreeItem1=新的TreeItem(“级别1”);
TreeItem2=新的TreeItem(“级别1”);
TreeItem11=新的TreeItem(“级别2”);
TreeView tree=newtreeview();
item1.getChildren().add(item11);
树根;
tree.getRoot().getChildren().addAll(item1,item2);
tree.getRoot().setExpanded(true);
StackPane rootPane=新的StackPane();
tree.setEditable(true);
setCellFactory(新回调(){
@凌驾
公共TreeCell调用(TreeView参数){
返回新的TextFieldTreeCellImpl();
}
});            
rootPane.getChildren().add(树);
按钮btn=新按钮();
btn.setText(“将名称更改为“测试”);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
//将所选树项的文本更改为“测试”?
}
});
rootPane.getChildren().add(btn);
场景=新场景(根窗格);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
公共类TextFieldTreeCellImpl扩展了TreeCell{
私有文本字段文本字段;
公共文本字段treecellimpl(){
}    
@凌驾
公开作废已启动IT(){
super.startEdit();
if(textField==null){
createTextField();
}
setText(空);
设置图形(文本字段);
textField.selectAll();
}
公共作废取消编辑(){
super.cancelEdit();
setText((字符串)getItem());
setGraphic(getTreeItem().getGraphic());
}
@凌驾
public void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
设置图形(空);
}否则{
if(isEditing()){
if(textField!=null){
setText(getString());
}
setText(空);
设置图形(文本字段);
}否则{
setText(getString());
setGraphic(getTreeItem().getGraphic());
}
}
};
私有void createTextField(){
textField=newtextfield(getString());
setOnKeyReleased(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent t){
if(t.getCode()==KeyCode.ENTER){
committedit(textField.getText());
}else if(t.getCode()==KeyCode.ESCAPE){
取消编辑();
}
} 
});
}
私有字符串getString(){
返回getItem()==null?”:getItem().toString();
}   
}
}

您只需使用setValue()方法更改树项的文本即可

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

        @Override
        public void handle(ActionEvent event) {
              desired_tree_item.setValue("TEST");
        }
    });
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
所需的树项设置值(“测试”);
}
});