JavaFx:再次在TreeView中添加TreeItem [英] JavaFx: Adding TreeItem in TreeView again

查看:763
本文介绍了JavaFx:再次在TreeView中添加TreeItem的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在[1]之前问了这个问题: JavaFx:在Treeview中添加treeItem 但是没有得到任何回复。

I asked this question before [1]: JavaFx: Adding treeItem in Treeview but didn't get any response.

我需要帮助解决这个问题。

Please I need help with this problem.

树视图用户需要添加树项。

A treeview in which user needs to add tree items.

这是我的代码

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
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;

public class Main extends Application
{

    private BorderPane border;
    @SuppressWarnings("unchecked")
    @Override
    public void start(Stage primaryStage)
    {   
        border = new BorderPane();    
        Scene scene = new Scene(border,600,300); 
        primaryStage.setTitle("BorderPane");
        primaryStage.setScene(scene);
        primaryStage.show();

        TreeItem<String> tree = new TreeItem<String>("Main System"); 
        TreeItem<String> item2 = new TreeItem<String>("Roots");
        TreeItem<String> item2Child1 = new TreeItem<String>("UX");
        TreeItem<String> item2Child2 = new TreeItem<String>("UY");
        item2.getChildren().addAll(item2Child1,item2Child2);        
        item2.setExpanded(true);    

        tree.setExpanded(true);
        tree.getChildren().add(item2);
        TreeView<String> treeView  = new TreeView<String>(tree);       

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


        VBox box3 = new VBox();
        treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem>() {

            @Override
            public void changed(ObservableValue<? extends TreeItem> observable, TreeItem oldValue, TreeItem newValue) {
                if (newValue.getValue().equals(item2Child1.getValue())) {
                    box3.getChildren().add(getrightPane1());
                } else {
                    int i = box3.getChildren().size();
                    if (i > 0) {
                        box3.getChildren().remove(0);
                    }
                }
            }
        });

        VBox box4 = new VBox();
        treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem>() {

            @Override
            public void changed(ObservableValue<? extends TreeItem> observable, TreeItem oldValue, TreeItem newValue) {
                if (newValue.getValue().equals(item2Child2.getValue())) {
                    box4.getChildren().add(getrightPane2());
                } else {
                    int i = box4.getChildren().size();
                    if (i > 0) {
                        box4.getChildren().remove(0);
                    }
                }
            }
        });

        VBox box2 = new VBox();
        treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem>() {

            @Override
            public void changed(ObservableValue<? extends TreeItem> observable, TreeItem oldValue, TreeItem newValue) {
                if (newValue.getValue().equals(item2.getValue())) {
                    box2.getChildren().add(getrightPane3());
                } else {
                    int i = box2.getChildren().size();
                    if (i > 0) {
                        box2.getChildren().remove(0);
                    }
                }
            }
        });

        HBox hb = new HBox(); 
        hb.getChildren().addAll(treeView,box2,box3,box4);        
        border.setCenter(hb);
    }

    private static class AddMenuTreeCell extends TextFieldTreeCell<String> {
        private 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<String>("UY" );
                                getTreeItem().getChildren().add(newLeaf);
                }
            });
        }

        @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());
                    if (!(getTreeItem().isLeaf() && getTreeItem().getParent() == null)){
                        setContextMenu(menu);
                    }
                }           
            }
        }        
        private String getString() {
            return getItem() == null ? "" : getItem().toString();
        }
    }

    TextField textf1 = new TextField();
    TextField textf2 = new TextField();
    BorderPane root1 = new BorderPane();    
    private BorderPane getrightPane1() {            
        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);
                }
            }
        });
        h1.getChildren().addAll(new Label("Y1:"), textf1);
        h2.getChildren().addAll(new Label("X1:"), textf2);
        vbox.getChildren().addAll(h1, h2);
        root1.setLeft(vbox);
        return root1;
    }

    TextField textf3 = new TextField();
    TextField textf4 = new TextField();
    BorderPane root2 = new BorderPane();    
    private BorderPane getrightPane2() {        
        VBox vbox = new VBox(20);
        vbox.setPadding(new Insets(10));

        HBox h1 = new HBox(7);
        HBox h2 = new HBox(7);
        textf3.setPrefWidth(100);
        textf3.setPromptText("Enter Height");
        textf3.setOnKeyReleased(new EventHandler<KeyEvent>(){
            @Override
            public void handle(KeyEvent event)
            {  
                if(textf3.getText().length() > 0 && textf4.getText().length() > 0)
                {
                    Rectangle rect = new Rectangle();
                    rect.setHeight(Double.parseDouble(textf3.getText()));
                    rect.setWidth(Double.parseDouble(textf4.getText()));
                    rect.setFill(null);
                    rect.setStroke(Color.BLUE);
                    root2.setBottom(rect);
                }
            }
        });

        textf4.setPrefWidth(100);
        textf4.setPromptText("Enter Width");
        textf4.setOnKeyReleased(new EventHandler<KeyEvent>(){
            @Override
            public void handle(KeyEvent event)
            {
                if(textf3.getText().length() > 0 && textf4.getText().length() > 0)
                {
                    Rectangle rect = new Rectangle();
                    rect.setHeight(Double.parseDouble(textf3.getText()));
                    rect.setWidth(Double.parseDouble(textf4.getText()));
                    rect.setFill(null);
                    rect.setStroke(Color.BLUE);
                    root2.setBottom(rect);
                }
            }
        });

        h1.getChildren().addAll(new Label("Y2:"), textf3);
        h2.getChildren().addAll(new Label("X2:"), textf4);
        vbox.getChildren().addAll(h1, h2);
        root2.setLeft(vbox);
        return root2;
    }

    private HBox getrightPane3() {

        HBox hbox = new HBox(20);
        hbox.setAlignment(Pos.BOTTOM_CENTER);
        hbox.setPadding(new Insets(50));

        HBox hbox1 = new HBox();
        Rectangle rect1 = new Rectangle();

        if (!textf1.getText().equals("") && !textf2.getText().equals("")) {            
            rect1.setHeight(Double.parseDouble(textf1.getText()));
            rect1.setWidth(Double.parseDouble(textf2.getText()));
            rect1.setFill(null);
            rect1.setStroke(Color.RED);
            hbox1.getChildren().addAll(rect1);
        } 

        HBox hbox2 = new HBox();
         Rectangle rect2 = new Rectangle();

        if (!textf3.getText().equals("") && !textf4.getText().equals("")) {
            rect2.setHeight(Double.parseDouble(textf3.getText()));
            rect2.setWidth(Double.parseDouble(textf4.getText()));
            rect2.setFill(null);
            rect2.setStroke(Color.BLUE);
            hbox2.getChildren().addAll(rect2);
        } 

        hbox.getChildren().addAll(hbox1,hbox2); 
        return hbox;
    } 

}

Root有2片叶子 Ux,Uy ,两者都包含构建矩形的逻辑,并且矩形在根中水平显示。现在问题是用户需要添加另一个叶子名称Uy并且应该具有相同的Rectangle构建逻辑,并且这些新构建的矩形应该自动显示在root中。

Root has 2 leafs Ux, Uy and both contains logic to build rectangle and that rectangles are Horizontally shown in root. Now the problem is that the user needs to add another leaf name Uy and that should have same Rectangle building logic and these newly build rectangles should be automatically shown in root.

I尝试添加另一个Uy,但这不起作用。

I tried with adding another Uy but this doesn't work.

我该怎么办?

请知道吗?

谢谢。

推荐答案

我改变了你的代码。问题是您尝试多次向场景添加节点。在这个例子中,我创建了一个与TreeView和与之关联的BorderPane的地图。

I changed your code a little. The problem is that you are trying to add nodes to the scene more than once. In this example, I created a map that keeps up with the TreeView and the BorderPane associated with it.

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());
                Platform.runLater(()->{hbox.getChildren().add(newRectangle);});
            }
        }

        Platform.runLater(()->{root1.setLeft(hbox);});
        return root1;
    } 
}




代码已更新!你需要捕获TextField java.lang.NumberFormatException!

Code updated! You need to catch the TextField java.lang.NumberFormatException!

这篇关于JavaFx:再次在TreeView中添加TreeItem的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆