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()); } } } ); }
解决问题。
一点浩然气,千里快哉风!