Javafx:TreeView以正确的顺序添加项目

时间:2017-06-29 11:16:17

标签: javafx

之前我问过这个问题,但没有得到任何回复! Javafx: Adjusting TreeView with right order。请我帮忙解决这个问题。这是代码

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

TreeView,用户可以在其中添加根及其坐标。坐标生成矩形,矩形在根中水平显示。

代码应该如何工作“每个根应该显示其root内或其子根内的所有坐标的矩形。”简单说明用户是否有2个根,每个应该有自己的协调矩形,如果两个都有子根,那么应该添加矩形。

由于这个if(TreeItem.getValue().equals("Roots"))我在每个根上都得到了所有错误的矩形。我也试过if(TreeItem == item1)这是错误的。

如果你看看我的这个问题,我将非常感激。谢谢

1 个答案:

答案 0 :(得分:1)

所以这里的代码对我来说是部分的(在我看来)。

import javafx.application.Application;
import javafx.application.Platform;
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.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.TextFieldTreeCell;
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 java.util.HashMap;
import java.util.Map;

public class Main extends Application {

private static int rootNr = 0;
private static int coordinateNr = 0;

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<>("Main System");
    TreeItem<String> item1 = new TreeItem<>("Roots");
    TreeView<String> treeView = new TreeView<>(tree);
    treeView.setOnMouseClicked((event) -> {
        TreeItem<String> treeItem = treeView.getSelectionModel().getSelectedItem();
        if (treeItem.getChildren().stream().anyMatch(child -> child.getValue().startsWith("C"))) {
            root.setCenter(getRootsPanel(treeItem.getValue()));
        } else {
            root.setCenter(map.get(treeItem));
        }
    });

    treeView.setCellFactory(p -> 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();
}

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

    public AddMenuTreeCell() {
        MenuItem newitem1 = new MenuItem("Insert Roots");
        MenuItem newitem2 = new MenuItem("Insert Coordinates");
        menu.getItems().addAll(newitem1, newitem2);
        newitem1.setOnAction(arg0 -> {
            TreeItem<String> item3 = new TreeItem<>("Root" + rootNr++);
            getTreeItem().getChildren().add(item3);
        });
        newitem2.setOnAction(arg0 -> {
            TreeItem<String> newLeaf = new TreeItem<>("Coordinates" + coordinateNr++);
            TreeItem<String> uxItem1 = new TreeItem<>("X");
            map.put(uxItem1, getrightPane1());
            TreeItem<String> uyItem1 = new TreeItem<>("y");
            map.put(uyItem1, getrightPane1());
            newLeaf.getChildren().add(uxItem1);
            newLeaf.getChildren().add(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()) {
                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(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(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(String root) {
    BorderPane root2 = new BorderPane();
    HBox hbox = new HBox(10);
    hbox.setPadding(new Insets(40));
    hbox.setAlignment(Pos.TOP_CENTER);

    for (Map.Entry<TreeItem<String>, BorderPane> entry : map.entrySet()) {
        if (entry.getKey().getParent().getParent().getValue().equals(root)) {
            Rectangle rect1 = (Rectangle) entry.getValue().getCenter();
            if (rect1 != null) {
                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;
}
}

所以你的问题来了:你必须“记住”矩形在孩子身上的每个根。所以你有一些编号可以区分它们,但没有它就可以完成。当您单击根时,将显示其子项(即坐标)子项(X和Y)项。所以现在每个Root都会显示正确的矩形。

你应该考虑一个问题:

  • 如果我有一个拥有另外两个Roots的根并且那两个根有另外2-3个坐标,那么如果我点击主Root会怎么样?应该显示所有矩形或什么都没有?