Javafx:treeView中新添加项的复选框侦听器

Javafx:treeView中新添加项的复选框侦听器,javafx,Javafx,我问了这个问题,但没有得到任何回应。请帮我解决这个问题。代码是 import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.Insets; import javafx.geometry.Pos;

我问了这个问题,但没有得到任何回应。请帮我解决这个问题。代码是

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
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();
        private TextField textField;
        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.BLUE);
                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);

        CheckBox box1 = new CheckBox("Change order");
        CheckBox box2 = new CheckBox("Change View");
        box1.selectedProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue) {
             //   rect1.setStroke(Color.RED);
             //   rect2.setStroke(Color.BLUE);
            } else {
               // rect1.setStroke(Color.BLUE);
               // rect2.setStroke(Color.RED);
            }
        });
        box2.selectedProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue) {

            } else {

            }
        });

        VBox vbox = new VBox(30, box1,box2);

        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().addAll(rect2));
                }
            }
        }
        hbox.getChildren().add(vbox);

        Platform.runLater(() -> root2.setLeft(hbox));
        return root2;
    }
}
导入javafx.application.application;
导入javafx.application.Platform;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.geometry.Insets;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.CheckBox;
导入javafx.scene.control.ContextMenu;
导入javafx.scene.control.Label;
导入javafx.scene.control.MenuItem;
导入javafx.scene.control.TextField;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeView;
导入javafx.scene.control.cell.TextFieldTreeCell;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
导入java.util.HashMap;
导入java.util.Map;
公共类主扩展应用程序{
私有静态int rootNr=0;
专用静态int坐标=0;
公共静态void main(字符串[]args){
发射(args);
}
静态最终映射=新HashMap();
@凌驾
公共无效开始(阶段primaryStage){
BorderPane根=新的BorderPane();
TreeItem tree=新的TreeItem(“主系统”);
TreeItem1=新的TreeItem(“根”);
树视图树视图=新树视图(树);
treeView.setOnMouseClicked((事件)->{
TreeItem TreeItem=treeView.getSelectionModel().getSelectedItem();
if(treeItem.getChildren().stream().anyMatch(child->child.getValue().startsWith(“C”)){
setCenter(getRootsPanel(treeItem.getValue());
}否则{
root.setCenter(map.get(treeItem));
}
});
setCellFactory(p->newaddMenuTreeCell());
tree.setExpanded(true);
根。设置左(treeView);
tree.getChildren().add(item1);
场景=新场景(根,700500);
primaryStage.setTitle(“树视图”);
初级阶段。场景(场景);
primaryStage.show();
}
私有静态类AddMenuTreeCell扩展了TextFieldTreeCell{
私有上下文菜单=新建上下文菜单();
私有文本字段文本字段;
公共AddMenuTreeCell(){
MenuItem newitem1=新MenuItem(“插入根”);
MenuItem newitem2=新MenuItem(“插入坐标”);
menu.getItems().addAll(newitem1,newitem2);
newitem1.setOnAction(arg0->{
TreeItem item3=新的TreeItem(“根”+rootNr++);
getTreeItem().getChildren().add(item3);
});
newitem2.setOnAction(arg0->{
TreeItem newLeaf=新TreeItem(“坐标”+坐标+);
TreeItem uxItem1=新的TreeItem(“X”);
put(uxItem1,getrightPane1());
TreeItem uyItem1=新的TreeItem(“y”);
put(uyItem1,getrightPane1());
newLeaf.getChildren().add(uxItem1);
newLeaf.getChildren().add(uyItem1);
getTreeItem().getChildren().add(newLeaf);
});
}
@凌驾
public void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
设置图形(空);
}否则{
如果(!isEditing()){
setText(项目);
setGraphic(getTreeItem().getGraphic());
if(!(getTreeItem().isLeaf()&&getTreeItem().getParent()==null)){
设置上下文菜单(菜单);
}
}
}
}
}
私有静态边界窗格getrightPane1(){
TextField textf1=新的TextField();
TextField textf2=新的TextField();
BorderPane root1=新的BorderPane();
VBox VBox=新的VBox(20);
vbox.setPadding(新插图(10));
HBox h1=新的HBox(7);
HBox h2=新的HBox(7);
textf1.setPrefWidth(100);
textf1.setPrompText(“输入高度”);
textf1.setOnKeyReleased(事件->{
if(textf1.getText().length()>0&&textf2.getText().length()>0){
矩形rect1=新矩形();
rect1.setHeight(Double.parseDouble(textf1.getText());
rect1.setWidth(Double.parseDouble(textf2.getText());
rect1.setFill(null);
rect1.设定行程(颜色:蓝色);
root1.setCenter(rect1);
}
});
textf2.setPrefWidth(100);
textf2.setPrompText(“输入宽度”);
textf2.setOnKeyReleased(事件->{
if(textf1.getText().length()>0&&textf2.getText().length()>0){
矩形rect2=新矩形();
rect2.setHeight(Double.parseDouble(textf1.getText());
rect2.setWidth(Double.parseDouble(textf2.getText());
rect2.setFill(null);
rect2.设定行程(颜色为红色);
根1.设置中心(rect2);
}
});
if(textf1.getText().length()>0&&textf2.getText().length()>0&&root1.getCenter()==null){
矩形rect=新矩形();
setHeight(Double.parseDouble(textf1.getText());
setWidth(Double.parseDouble(textf2.getText());
rect.setFill(null);
直接设定行程(颜色为红色);
root1.setCenter(rect);
}
h1.getChildren().addAll(新标签(“Y1:”),textf1);
h2.getChildren().addAll(新标签(“X1:”),textf2);
vbox.getChildren().addAll(h1,h2);
root1.setLeft(vbox);
返回根1;
}
私有静态边界窗格getRootsPanel(字符串根){
BorderPane root2=新的BorderPane();
H