Javafx:使用正确的顺序调整TreeView

时间:2017-06-27 11:23:50

标签: javafx

这是一个TreeView,用户可以在其中添加Roots及其Coordinates等树项。

问题是所有新添加的Roots都有Coordinates生成的相同矩形。每个根应该有自己的结果与其他Roots不同。为此,我必须为每个根分配索引,以便它有自己的结果吗?

public class Main extends Application
{       public static void main(String[] args)
            {launch(args);}

    static final Map<TreeItem<String>, BorderPane> map = new HashMap();
    @Override
    public void start(Stage primaryStage)
    {        
        BorderPane root = new BorderPane();
        TreeItem<String> tree = new TreeItem<String>("Main System");
        TreeItem<String> item1 = new TreeItem<String>("Roots");
        TreeView<String> treeView = new TreeView<String>(tree); 
        treeView.setOnMouseClicked((event)->{
           TreeItem<String> TreeItem = (TreeItem<String>)treeView.getSelectionModel().getSelectedItem();
           if(TreeItem.getValue().equals("Roots"))
            {              
               root.setCenter(getRootsPanel());
            }
           else
            {
               root.setCenter(map.get(TreeItem));
            }
        });

        treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
            @Override
            public TreeCell<String> call(TreeView<String> p) {
                return new AddMenuTreeCell();
            }
        });
        tree.setExpanded(true);
        root.setLeft(treeView);
        tree.getChildren().add(item1);

        Scene scene = new Scene(root, 700, 500);
        primaryStage.setTitle("Tree View");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

   TreeItem<String> addNewTreeItem(String name){ 
       TreeItem TreeItem = new TreeItem(name);
       return TreeItem;
    } 
   private static class AddMenuTreeCell extends TextFieldTreeCell<String> {
        private ContextMenu menu = new ContextMenu();            
        private TextField textField;

        public AddMenuTreeCell() {
            MenuItem newitem1 = new MenuItem("Insert Roots");
            MenuItem newitem2 = new MenuItem("Insert Coordinates");
            menu.getItems().addAll(newitem1,newitem2);
            newitem1.setOnAction(new EventHandler<ActionEvent>() {              
                @Override
                public void handle(ActionEvent arg0) {                      
                    TreeItem<String> item3 = new TreeItem<String>("Roots");
                       //     item3.getChildren().clear();
                            getTreeItem().getChildren().add(item3);            
                }    
            });   
            newitem2.setOnAction(new EventHandler<ActionEvent>() {
                @SuppressWarnings("unchecked")
                @Override
                public void handle(ActionEvent arg0) {
                    TreeItem<String> newLeaf =  new TreeItem<String>("Coordinates");
                                TreeItem<String> uxItem1 = new TreeItem("X");
                                map.put(uxItem1, getrightPane1());
                                TreeItem<String> uyItem1 = new TreeItem("y");
                                map.put(uyItem1, getrightPane1());
                                newLeaf.getChildren().addAll(uxItem1,uyItem1);
                                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(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 rect1 = new Rectangle();
                    rect1.setHeight(Double.parseDouble(textf1.getText()));
                    rect1.setWidth(Double.parseDouble(textf2.getText()));
                    rect1.setFill(null);
                    rect1.setStroke(Color.RED);
                    root1.setCenter(rect1);
                }
            }
        });
        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 rect2 = new Rectangle();
                    rect2.setHeight(Double.parseDouble(textf1.getText()));
                    rect2.setWidth(Double.parseDouble(textf2.getText()));
                    rect2.setFill(null);
                    rect2.setStroke(Color.RED);
                    root1.setCenter(rect2);
                }
            }
        });

        if(textf1.getText().length() > 0 && textf2.getText().length() > 0 && root1.getCenter() == 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.setCenter(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 root2 = new BorderPane(); 
        HBox hbox = new HBox(10);
        hbox.setPadding(new Insets(40));
        hbox.setAlignment(Pos.TOP_CENTER);

        List<BorderPane> listBordePane = new ArrayList(map.values());
        for(BorderPane element : listBordePane)
        {          
            Node node = element.getCenter();
            if(node instanceof Rectangle)
            {
                Rectangle rect1 = ((Rectangle)node);
                Rectangle rect2 = new Rectangle();
                rect2.setWidth(rect1.getWidth());
                rect2.setHeight(rect1.getHeight());
                rect2.setFill(rect1.getFill());
                rect2.setStroke(rect1.getStroke());
                Platform.runLater(()->{hbox.getChildren().add(rect2);});               
            }
        }
        Platform.runLater(()->{root2.setLeft(hbox);});
        return root2;
    } 
}

注意:如果使用clear()清除每个根,则会导致此问题的问题,

&#34;假设用户有主根,其中有2个子根,每个子根有1个坐标。所以每个子根按水平顺序显示2个矩形,主根将按水平顺序显示4个矩形&#34;。

任何想法都会有所帮助。谢谢

0 个答案:

没有答案