JavaFX ListView - 通过鼠标点击添加项目到选择

时间:2016-06-06 19:03:50

标签: listview javafx multipleselection

我想用鼠标创建一个只有多个选择的ListView(不按住ctrl或shift)

单击某个项目应选择此项目。如果选择了其他项目,请将此新项目添加到选定列表。如果之前选择了此项目,请将其解除。

我不知道保留所选项目。在selectionModel上有一个名为“selectIndices()”的方法,它只接受一个或多个整数,而不是整数列表......

 DataTypesLV.getSelectionModel().selectedItemProperty().addListener(new ChangeListener <String>() {
        @Override
        public void changed(ObservableValue<? extends String> arg0, String oldVal, String newVal) {
            int idx = DataTypesLV.getItems().indexOf(newVal);
            if(newVal.equals(oldVal)){
                DataTypesLV.getSelectionModel().getSelectedIndices().remove(idx);
              } else {
                  DataTypesLV.getSelectionModel().getSelectedIndices().add(idx);
              }
        }
    });

有任何想法吗?

1 个答案:

答案 0 :(得分:2)

在JavaFX中更改控件的行为通常很困难。执行此操作的“正确”方法是创建一个新的皮肤实现,其中涉及大量工作,并且由于行为类目前不是公共API,因此将涉及大量“重新发明轮子”。合理的黑客攻击是在默认皮肤类接收鼠标事件之前拦截鼠标事件,并相应地修改选择。您可以使用事件过滤器执行此操作,使用事件来阻止皮肤接收它:

data Atom = Atom { _element :: String, _pos :: Point } deriving Show
poslens :: MySetter Atom Atom Point Point
poslens f a = a { _pos = f (_pos a) }

a = Atom "Oxygen" p
(poslens . xlens) :: (Int -> Int) -> Atom -> Atom
(poslens . xlens) (+1) a -- Results in Atom "Oxygen" (Point 101 200)

防止皮肤接收鼠标事件是一种破坏行为,并且你冒着破坏现有功能的风险。另一种更强大的解决方案可能是使用列表单元格中的复选框或类似的东西来管理您自己的“选择”功能。