首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javafx: TreeView添加具有正确顺序的项目

Javafx: TreeView添加具有正确顺序的项目
EN

Stack Overflow用户
提问于 2017-06-29 11:16:16
回答 1查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
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 内部或子根内的所有坐标矩形。”简单地说,如果用户有两个根,那么每个根都应该有自己的协调矩形,如果两个根都有子根,那么就应该添加矩形。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-29 12:38:46

下面是部分适用于我的代码(在我看来)。

代码语言:javascript
复制
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项)。所以现在每个根都显示正确的矩形。

有一个问题你应该考虑一下:

  • 如果我有一个根,它有另外两个根,而这两个根有另一个2-3坐标,那么如果我点击主根会发生什么呢?应该显示所有的矩形还是什么都没有?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44823626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档