模仿CTRL +使用Javafx在ListView中单击多个选择

我正在尝试找到在ListView中选择多个项目的不同方法。 GUI将在触摸屏显示器上运行,因此我将无法按CTRL + Click。 通过研究各种过去的post,我已经能够通过将所有选定的项保留在数组中然后循环遍历它以获得最终选择来实现多选。 我的代码唯一的问题是,与CTRL +点击相比,选择顺利完成,每次选择新项目时,我的代码会导致类型闪烁。 所以基本上listView清除所有选择,然后选择正确的选择。 有没有办法让这种转变顺利进行? 是否更容易模仿触摸以获得CTRL +点击效果?

selectedList = new int[totalTypes];//total number of item properties for(int x=0; x<selectedList.length;x++){//0 = not selected, 1 = selected selectedList[x]=0; } testView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); testView.setOnMouseClicked(new EventHandler(){ @Override public void handle(Event event){ if(selectedList[testView.getSelectionModel().getSelectedIndex()]==0){ selectedList[testView.getSelectionModel().getSelectedIndex()]=1; } else{ selectedList[testView.getSelectionModel().getSelectedIndex()]=0; } for(int x=0; x<selectedList.length;x++){ if(selectedList[x]==1){ testView.getSelectionModel().select(x); } else{ testView.getSelectionModel().clearSelection(x);; } } } }); 

当用户自己单击ListCell而不是使用标准事件处理时,您可以处理更改选择:

 @Override public void start(Stage primaryStage) { ListView listView = new ListView<>(); listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); listView.getItems().setAll(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); listView.addEventFilter(MouseEvent.MOUSE_PRESSED, evt -> { Node node = evt.getPickResult().getIntersectedNode(); // go up from the target node until a list cell is found or it's clear // it was not a cell that was clicked while (node != null && node != listView && !(node instanceof ListCell)) { node = node.getParent(); } // if is part of a cell or the cell, // handle event instead of using standard handling if (node instanceof ListCell) { // prevent further handling evt.consume(); ListCell cell = (ListCell) node; ListView lv = cell.getListView(); // focus the listview lv.requestFocus(); if (!cell.isEmpty()) { // handle selection for non-empty cells int index = cell.getIndex(); if (cell.isSelected()) { lv.getSelectionModel().clearSelection(index); } else { lv.getSelectionModel().select(index); } } } }); Scene scene = new Scene(listView); primaryStage.setScene(scene); primaryStage.show(); }