使用自定义行工厂并在updateItem(...)
方法中配置上下文菜单。
假设你有一个
TreeTableView<MyDataType> treeTable = ... ;
你会做类似的事情
treeTable.setRowFactory(ttv -> {
ContextMenu contextMenu = new ContextMenu();
MenuItem inviteMenuItem = new MenuItem("Invite to Chat");
// ...
MenuItem banMenuItem = new MenuItem("Ban");
// ...
TreeTableRow<MyDataType> row = new TreeTableRow<MyDataType>() {
@Override
public void updateItem(MyDataType item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setContextMenu(null);
} else {
// configure context menu with appropriate menu items,
// depending on value of item
setContextMenu(contextMenu);
}
}
};
inviteMenuItem.setOnAction(evt -> {
MyDataType item = row.getItem();
// do something with item...
});
// event handlers for other menu items...
return row ;
});
警告:这没有经过测试,因为你没有提供MCVE供我测试,但它应该给你一个大致的想法。这将为用户单击的行显示适当的上下文菜单(具有上下文菜单的适当触发器,例如右键单击);这与选择的项目无关。