确定在未选中的情况下单击了哪个JavaFX ListView项目

确定在未选中的情况下单击了哪个JavaFX ListView项目,listview,javafx,mouseevent,Listview,Javafx,Mouseevent,我的JavaFX应用程序有一个ListView,其中包含需要处理的项。我有两个按钮,用户可以单击它们来处理列表中的下一项(即“前进”按钮),或撤消对列表中最后一项的处理(即“后退”按钮)。我不希望他们随意选择列表中的项目(他们应该只能使用这两个按钮移动)。但是,我希望他们能够右键单击项目以获得一些上下文菜单(例如,从列表中删除右键单击的项目) 我添加了以下事件过滤器,以禁用通过单击项目来选择项目,同时仍然允许用户滚动浏览并查看列表中的所有项目 instrList.addEventFilter(M

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

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

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

我一直坚持的是确定列表上的哪个项目被点击,这样我就可以对它做些什么(再次,例如,将它从列表中删除)。

使用单元格工厂,这样你就可以用
列表单元格
注册监听器,而不是用
列表视图

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 ;
});
instrList.setCellFactory(lv->{
ListCell=新ListCell(){
@凌驾
受保护的void updateItem(MyDataType项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
}否则{
setText(item.toString());
}
}
};
cell.addEventFilter(MouseeEvent.MOUSE_按下,事件->{
if(event.getButton()==MouseButton.SECONDARY&&(!cell.isEmpty()){
MyDataType项=cell.getItem();
System.out.println(“右键单击”+项);
}
});
返回单元;
});

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

使用单元格工厂,以便可以使用
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 ;
});
instrList.setCellFactory(lv->{
ListCell=新ListCell(){
@凌驾
受保护的void updateItem(MyDataType项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
}否则{
setText(item.toString());
}
}
};
cell.addEventFilter(MouseeEvent.MOUSE_按下,事件->{
if(event.getButton()==MouseButton.SECONDARY&&(!cell.isEmpty()){
MyDataType项=cell.getItem();
System.out.println(“右键单击”+项);
}
});
返回单元;
});
(将
MyDataType
替换为用于
列表视图的任何类型)