ListView不会在selectedItemProperty上触发已更改的事件

时间:2013-11-22 17:05:45

标签: listview javafx-2

我创建了一个带有一堆字符串的ListView,它有多种选择模式,最后我添加了一个Listener到selectedItemProperty(),如下所示:

  ObservableList<String> myStringsObsList = FXCollections.observableArrayList(strings);
  ListView<String> listView = new ListView<String>(myStringsObsList);
  listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

  listView.getSelectionModel().selectedItemProperty().addListener(
    new ChangeListener<String>() {
        public void changed(ObservableValue<? extends String> ov, String old_val, String new_val) 
       {
         System.out.println("Selection Changed!");
       }
     }
  });

选择项目时,所有内容都打印好了,但是一旦我开始使用Ctrl取消选择项目。此处未打印任何内容,因为更改的事件可能未被触发。

任何人都知道这是不是一个错误?或者我在这里做错了什么?

最后我只需要知道选择是否以某种方式改变(无论是选择还是取消选择项目),所以我可以启动另一个过程。

EDIT --- 使用Ctrl取消选择时,“选择已更改!”仅在取消选择所选项目的最后一项时打印。

2 个答案:

答案 0 :(得分:4)

将此侦听器注册到listview:

listView.getSelectionModel().getSelectedItems()
        .addListener(new ListChangeListener<String>()
        {

            @Override
            public void onChanged(Change<? extends String> arg0)
            {
                System.out.println("Selection Changed!");

            }

        });

答案 1 :(得分:1)

与上述答案相同,但添加一行来捕捉指数。

listView.getSelectionModel().getSelectedItems()
    .addListener(new ListChangeListener<String>()
    {

        @Override
        public void onChanged(Change<? extends String> arg0)
        {
            System.out.println("Selection Changed!");
            ObservableList<Integer> sel = listView.getSelectionModel().getSelectedIndices();
        }

    });