我的JavaFX应用程序有一个ListView,其中包含需要处理的项目。我有两个按钮,用户可以点击它们来处理列表中的下一个项目(即“前进”按钮),或者撤消列表中最后一个项目的处理(即“后退”按钮)。我不希望他们随意选择列表中的项目(他们应该只能使用这两个按钮移动)。但是,我希望他们能够右键单击项目以获取一些上下文菜单(例如,从列表中删除右键单击的项目)。
我添加了以下事件过滤器以禁用通过单击选择项目,同时仍然允许用户滚动并查看列表中的所有项目。
instrList.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
if (event.getButton() == MouseButton.SECONDARY)
System.out.println("right clicked... something");
event.consume();
});
我所坚持的是确定点击列表中的哪个项目,以便我可以对其执行某些操作(再次,例如将其从列表中删除)。
答案 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
使用的任何类型。)