JavaFX:ChoiceBox响应重复创建窗口问题及解决

如上图,我打算选择choicebox中不同的选项跳出不同的界面,但是出现一个问题就是会重复创建窗口,比如说我点击了树,会创建一个树的窗口,关闭窗口,

再点击一个其他的创建窗口,会创建两个窗口,再点击树,又会创建三个窗口,感到很困惑;效果如下图:

原因以及解决方法:

原因:我将choicebox的响应写在了一个onMouseClicked("#choicecon")的鼠标事件中,所以我每次点击choicebox一次,都会多创建一个窗口,

错误代码如下:

inputctree是另一个窗口的类。

public void choicecon(){
        choicetree.getSelectionModel().selectedIndexProperty().addListener(
            (ObservableValue<? extends Number> ov,
             Number old_val,Number new_val) -> {
                if(new_val.intValue() == 1) {
                    System.out.println(1);
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                  inputctree.getInstance().start(new Stage());
                            } catch (Exception e) {
                                  System.out.println(e.getMessage());
                            }
                        }
                    });
                }
                else{
                    System.out.println(2);
                    try {
                        inputctree ict = inputctree.getInstance();
                        ict.start(new Stage());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                }
            }
        );
    }

解决方法:

删除choicebox的鼠标点击响应函数,将对choicebox的监听放在重写的initialize()函数中,代码如下:

@Override
    public void initialize(URL location, ResourceBundle resources) {
        choicetree.getSelectionModel().selectedIndexProperty().addListener(
                (ObservableValue<? extends Number> ov,
                 Number old_val,Number new_val) -> {
                    if(new_val.intValue() == 1) {
                        System.out.println(1);
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    inputctree.getInstance().start(new Stage());
                                } catch (Exception e) {
                                    System.out.println(e.getMessage());
                                }
                            }
                        });
                    }
                    else{
                        System.out.println(2);
                        try {
                            inputctree ict = inputctree.getInstance();
                            ict.start(new Stage());
                        } catch (Exception e) {
                            System.out.println(e.getMessage());
                        }
                    }
                }
        );
    }

解决问题。

posted @ 2018-12-10 17:23  fanghuiX  阅读(898)  评论(0编辑  收藏  举报