我使用 NatTable。如何根据单元格的内容在特定条件下显示上下文菜单项?以及如何选择调用上下文菜单的单元格?我用下面的代码绑定(bind)菜单
uiBindingRegistry.registerMouseDownBinding(
new MouseEventMatcher(SWT.NONE, null, MouseEventMatcher.RIGHT_BUTTON), new PopupMenuAction(menu));
更新:
我创建了这样的菜单,但是尽管 isActive
始终返回 false
,但“测试”项仍然可见。有什么问题吗?
menu = new PopupMenuBuilder(natTable).withMenuItemProvider(ITEM_ID, new IMenuItemProvider() {
@Override
public void addMenuItem(final NatTable natTable, final Menu popupMenu) {
final MenuItem menuItem = new MenuItem(popupMenu, SWT.PUSH);
menuItem.setText("Test");
menuItem.setEnabled(true);
menuItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent event) {
System.out.println("test");
}
});
}
}).withVisibleState(ITEM_ID, new IMenuItemState() {
@Override
public boolean isActive(final NatEventData natEventData) {
return false;
}
}).build();
最佳答案
给出的答案是正确的。虽然可以改进。您不需要 SelectionLayer。
class CellPopupMenuAction implements IMouseAction {
private final Menu menu;
public CellPopupMenuAction(Menu menu) {
this.menu = menu;
}
@Override
public void run(NatTable natTable, MouseEvent event) {
int columnPosition = natTable.getColumnPositionByX(event.x);
int rowPosition = natTable.getRowPositionByY(event.y);
ILayerCell cell = natTable.getCellByPosition(columnPosition, rowPosition);
if (!cell.getDisplayMode().equals(DisplayMode.SELECT)) {
natTable.doCommand(
new SelectCellCommand(
natTable,
columnPosition,
rowPosition,
false,
false));
}
menu.setData(MenuItemProviders.NAT_EVENT_DATA_KEY, event.data);
menu.setVisible(true);
}
}
这样您就完全不需要引用 SelectionLayer,甚至可以改进功能,因为如果您右键单击选定的单元格,SelectCellCommand 永远不会被触发。
关于java - 显示 NatTable 上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34748101/