我正在使用TreeTableView,我想根据所选行内的数据更改与上下文菜单关联的菜单项。
假设我的表格结构如下:
访问者
Chatters
在这个表格中我们可以比喻说我们有两个根节点,它们是"访客"和#34; Chatters"。现在,我想要两个具有不同选项的上下文菜单。我们可以说访问者的上下文菜单中有一个项目是"邀请聊天"和另一个处理聊天的上下文菜单,有不同的选项,如:" kick" ," ban"等等。我的问题是如何实现这种情况?我应该在哪里使用这些上下文菜单?我应该将它们与细胞,行或桌子一起使用吗?
答案 0 :(得分:4)
使用自定义行工厂并在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测试,但它应该给你一般的想法。这将显示用户点击行的相应上下文菜单(使用适当的上下文菜单触发器,例如右键单击);这与选择的项目无关。