确定单击了哪个JavaFX ListView项而不选择它

时间:2017-07-07 21:16:51

标签: listview javafx mouseevent

我的JavaFX应用程序有一个ListView,其中包含需要处理的项目。我有两个按钮,用户可以点击它们来处理列表中的下一个项目(即“前进”按钮),或者撤消列表中最后一个项目的处理(即“后退”按钮)。我不希望他们随意选择列表中的项目(他们应该只能使用这两个按钮移动)。但是,我希望他们能够右键单击项目以获取一些上下文菜单(例如,从列表中删除右键单击的项目)。

我添加了以下事件过滤器以禁用通过单击选择项目,同时仍然允许用户滚动并查看列表中的所有项目。

instrList.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
        if (event.getButton() == MouseButton.SECONDARY) 
            System.out.println("right clicked... something"); 
        event.consume();
    });

我所坚持的是确定点击列表中的哪个项目,以便我可以对其执行某些操作(再次,例如将其从列表中删除)。

1 个答案:

答案 0 :(得分:2)

使用单元工厂,以便您可以使用ListCell而不是ListView注册听众:

instrList.setCellFactory(lv -> {
    ListCell<MyDataType> cell = new ListCell<MyDataType>() {
        @Override
        protected void updateItem(MyDataType item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
            } else {
                setText(item.toString());
            }
        }
    };
    cell.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
        if (event.getButton()== MouseButton.SECONDARY && (! cell.isEmpty())) {
            MyDataType item = cell.getItem();
            System.out.println("Right clicked "+item);
        }
    });
    return cell ;
});

(将MyDataType替换为ListView使用的任何类型。)