JavaFx:再次在TreeView中添加TreeItem

JavaFx:再次在TreeView中添加TreeItem,javafx,Javafx,TreeView必须添加TreeItems。这是我的密码: 导入javafx.application.application; 导入javafx.beans.value.ChangeListener; 导入javafx.beans.value.observeValue; 导入javafx.event.ActionEvent; 导入javafx.event.EventHandler; 导入javafx.geometry.Insets; 导入javafx.geometry.Pos; 导入javafx

TreeView
必须添加
TreeItem
s。这是我的密码:

导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Insets;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.ContextMenu;
导入javafx.scene.control.Label;
导入javafx.scene.control.MenuItem;
导入javafx.scene.control.TextField;
导入javafx.scene.control.TreeCell;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeView;
导入javafx.scene.control.cell.TextFieldTreeCell;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
导入javafx.util.Callback;
公共类主扩展应用程序
{
私人边界;
@抑制警告(“未选中”)
@凌驾
公共无效开始(阶段primaryStage)
{   
border=新边框窗格();
场景=新场景(边框,600300);
primaryStage.setTitle(“边框窗格”);
初级阶段。场景(场景);
primaryStage.show();
TreeItem tree=新的TreeItem(“主系统”);
TreeItem2=新的TreeItem(“根”);
TreeItem2Child1=新的TreeItem(“UX”);
TreeItem2Child2=新的TreeItem(“UY”);
item2.getChildren().addAll(item2Child1,item2Child2);
项目2.设置扩展(真);
tree.setExpanded(true);
tree.getChildren().add(item2);
树视图树视图=新树视图(树);
setCellFactory(新回调(){
@凌驾
公共TreeCell呼叫(TreeView p){
返回新的AddMenuTreeCell();
}
});
VBox box3=新的VBox();
treeView.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(ObservalEvalue我稍微更改了代码。问题是您多次尝试将节点添加到场景中。在本例中,我创建了一个与树视图及其关联的边框窗格保持一致的贴图

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.TextFieldTreeCell;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication124 extends Application
{
    //List<BorderPane> rightPanels = new ArrayList();
   static final Map<TreeItem<String>, BorderPane> MAP = new HashMap();
   static BorderPane root;

    @Override
    public void start(Stage primaryStage)
    {        
        

        TreeItem<String> treeRoot = new TreeItem("Main System");  
        root = new BorderPane();

        TreeView treeView = new TreeView(treeRoot); 
        treeView.setOnMouseClicked((event)->{
            TreeItem tempTreeItem = (TreeItem)treeView.getSelectionModel().getSelectedItem(); 
                if(tempTreeItem.getValue().equals("Main System"))
                {
                    root.setCenter(getRootsPanel());
                    //System.out.println(getRootsPanel());
                }
                else
                {
                    root.setCenter(MAP.get(tempTreeItem));
                    System.out.println(MAP.get(tempTreeItem));
                }
                
           
        });

        treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
            @Override
            public TreeCell<String> call(TreeView<String> p) {
                return new AddMenuTreeCell();
            }
        });        
        treeRoot.setExpanded(true);

        root.setLeft(treeView);

        TreeItem<String> uxItem1 = new TreeItem("UX");
        MAP.put(uxItem1, getrightPane1());
        TreeItem<String> uyItem1 = new TreeItem("UY");
        MAP.put(uyItem1, getrightPane1());
        treeRoot.getChildren().addAll(uxItem1, uyItem1);

        Scene scene = new Scene(root, 500, 500);



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

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


    TreeItem<String> addNewTreeItem(String name)
    {
        TreeItem tempTreeItem = new TreeItem(name);

        return tempTreeItem;
    }


    private static class AddMenuTreeCell extends TextFieldTreeCell<String> {
        private final ContextMenu menu = new ContextMenu();     
        private TextField textField;

        public AddMenuTreeCell() {
            MenuItem newitem1 = new MenuItem("Insert leaf");
            menu.getItems().add(newitem1);

            newitem1.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent arg0) {
                    TreeItem<String> newLeaf =  new TreeItem("UY");                    
                    getTreeItem().getChildren().add(newLeaf);
                    MAP.put(newLeaf, getrightPane1());
                }
            });
        }

        @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(item);
                    }
                    setText(null);
                    setGraphic(textField);
                } else {
                    setText(item);
                    setGraphic(getTreeItem().getGraphic());
                    if (!(getTreeItem().isLeaf() && getTreeItem().getParent() == null)){
                        setContextMenu(menu);
                    }
                }           
            }
        }  
    }

    private static BorderPane getrightPane1() {              
        TextField textf1 = new TextField();
        TextField textf2 = new TextField();
        BorderPane root1 = new BorderPane(); 

        VBox vbox = new VBox(20);
        vbox.setPadding(new Insets(10));        
        HBox h1 = new HBox(7);
        HBox h2 = new HBox(7); 

        textf1.setPrefWidth(100);
        textf1.setPromptText("Enter Height");   
        textf1.setOnKeyReleased(new EventHandler<KeyEvent>(){
            @Override
            public void handle(KeyEvent event)
            {  
                if(textf1.getText().length() > 0 && textf2.getText().length() > 0)
                {
                    Rectangle rect = new Rectangle();
                    rect.setHeight(Double.parseDouble(textf1.getText()));
                    rect.setWidth(Double.parseDouble(textf2.getText()));
                    rect.setFill(null);
                    rect.setStroke(Color.RED);
                    root1.setBottom(rect);
                }
            }
        });
        textf2.setPrefWidth(100);
        textf2.setPromptText("Enter Width");
        textf2.setOnKeyReleased(new EventHandler<KeyEvent>(){
            @Override
            public void handle(KeyEvent event)
            {
                if(textf1.getText().length() > 0 && textf2.getText().length() > 0)
                {
                    Rectangle rect = new Rectangle();
                    rect.setHeight(Double.parseDouble(textf1.getText()));
                    rect.setWidth(Double.parseDouble(textf2.getText()));
                    rect.setFill(null);
                    rect.setStroke(Color.RED);
                    root1.setBottom(rect);
                }
            }
        });
        
        if(textf1.getText().length() > 0 && textf2.getText().length() > 0 && root1.getBottom() == null)
        {
            Rectangle rect = new Rectangle();
            rect.setHeight(Double.parseDouble(textf1.getText()));
            rect.setWidth(Double.parseDouble(textf2.getText()));
            rect.setFill(null);
            rect.setStroke(Color.RED);
            root1.setBottom(rect);
        }
        
        h1.getChildren().addAll(new Label("Y1:"), textf1);
        h2.getChildren().addAll(new Label("X1:"), textf2);
        vbox.getChildren().addAll(h1, h2);
        root1.setLeft(vbox);
        return root1;
    } 
    
    private static BorderPane getRootsPanel() { 
        BorderPane root1 = new BorderPane(); 
        HBox hbox = new HBox();
        
        List<BorderPane> listBordePane = new ArrayList(MAP.values());
        for(BorderPane element : listBordePane)
        {          
            Node node = element.getBottom();
            if(node instanceof Rectangle)
            {
                Rectangle tempRectangle = ((Rectangle)node);
                Rectangle newRectangle = new Rectangle();
                newRectangle.setWidth(tempRectangle.getWidth());
                newRectangle.setHeight(tempRectangle.getHeight());
                newRectangle.setFill(tempRectangle.getFill());
                newRectangle.setStroke(tempRectangle.getStroke());
                hbox.getChildren().add(newRectangle);
            }
        }
               
        root1.setLeft(hbox);
        return root1;
    } 
}
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入javafx.application.application;
导入javafx.application.Platform;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Insets;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.control.ContextMenu;
导入javafx.scene.control.Label;
导入javafx.scene.control.MenuItem;
导入javafx.scene.control.TextField;
导入javafx.scene.control.TreeCell;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeView;
导入javafx.scene.control.cell.TextFieldTreeCell;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
导入javafx.util.Callback;
/**
*
*@author blj0011
*/
公共类JavaFXApplication124扩展了应用程序
{
//List rightPanels=新建ArrayList();
静态最终映射=新HashMap();
静态边界根;
@凌驾
公共无效开始(阶段primaryStage)
{        
TreeItem treeRoot=新的TreeItem(“主系统”);
root=新边框窗格();
TreeView TreeView=新的TreeView(treeRoot);
treeView.setOnMouseClicked((事件)->{
TreeItem TestreeItem=(TreeItem)treeView.getSelectionModel().getSelectedItem();
if(testreeItem.getValue().equals(“主系统”))
{
setCenter(getRootsPanel());
//System.out.println(getRootsPanel());
}
其他的
{
setCenter(MAP.get(testreeitem));
System.out.println(MAP.get(testreeitem));
}
});
setCellFactory(新回调(){
@凌驾
公共TreeCell呼叫(TreeView p){
返回新的AddMenuTreeCell();
}
});        
treeRoot.setExpanded(true);
根。设置左(treeView);
TreeItem uxItem1=新的TreeItem(“UX”);
put(uxItem1,getrightPane1());
TreeItem uyItem1=新TreeItem(“UY”);
put(uyItem1,getrightPane1());
treeRoot.getChildren().addAll(uxItem1,uyItem1);
场景=新场景(根,500500);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args)
{
发射(args);
}
TreeItem addNewTreeItem(字符串名称)
{
TreeItem-tentreeitem=新的TreeItem(名称);
退货项目;
}
私有静态类AddMenuTreeCell扩展了TextFieldTreeCell{
私有最终上下文菜单=新建上下文菜单();
私有文本字段文本字段;
公共AddMenuTreeCell(){
MenuItem newitem1=新MenuItem(“插入叶”);
menu.getItems().add(newitem1);
newitem1.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent arg0){
TreeItem newLeaf=新TreeItem(“UY”);
getTreeItem().getChildren().add(newLeaf);
put(newLeaf,getrightPane1());
}
});
}
@凌驾
公共无效更新