如何在JavaFX tableview中监听取消选择行?

时间:2014-10-06 07:28:07

标签: java javafx java-8 javafx-8

我有一个使用SelectionMode.MULTIPLE的表视图:

    table.setEditable(true);
    table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

    table.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> {
                table.getSelectionModel().getSelectedItems().forEach(System.out::println);
            });

选择行有效,但如果再次取消选择一行(通过单击ctrl +左键单击),则侦听器不会立即对此作出反应。我要取消选择行的方法如下:

  1. 选择让我们说'Rob','Peter','Max'和'John'(通过ctrl +左键单击选择它们,或者通过shift +左键单击它们全部)
  2. 通过单击ctrl +左键单击取消选择'Peter'(现在此行有一个奇怪的蓝色边框,并且侦听器未检测到更改)
  3. 取消选择另一行(现在这行有这个奇怪的边框,'彼得'行看起来很正常)
  4. 重新选择上一行(现在听众检测到我未选中'彼得'enter image description here

1 个答案:

答案 0 :(得分:4)

根据javadocs,多选项模式中的selectedItem属性是指最后选择的项目:

  

选择时最常用的是所选项目属性   model设置为单选,但同样适用于   多选模式。在此模式下,所选项目将   始终代表最后的选择。

在您的方案中,如果您按顺序选择“Rob”,“Peter”,“Max”和“John”,则所选项目最终将作为最后一个人选择(“John”),并且选中项目列表包含所有四个项目。取消选择“Peter”时,所选的最后一项仍然是“John”。由于selectedItem未更改,因此不会调用您的更改侦听器。当您取消选择另一个项目然后重新选择它时,最后选择的项目将更改为该项目,并调用您的侦听器。

您看到的“怪异”边框只是表格中显示的焦点(您只是点击它)未被选中的单元格。

要查看所选项目的所有更改,您需要使用所选项目的列表注册ListChangeListener

table.getSelectionModel().getSelectedItems().addListener((Change<? extends Person> change) -> 
    System.out.println(table.getSelectionModel().getSelectedItems());