Canvas 上的弹出菜单:仅在特定边界内显示

Pop up menu on Canvas: only display within specific boundary

我在 Canvas 上显示 Image。当用户右键单击 canvas 时,会显示上下文菜单。

如何仅在用户在图像范围内单击时才显示菜单?我可以从事件中获得 xy 位置,但到那时肯定为时已晚!

final Menu pixelContextMenu = new Menu(canvas);
canvas.setMenu(pixelContextMenu);

final MenuItem resetImageItem = new MenuItem(pixelContextMenu, SWT.NONE);
resetImageItem.setText("Reset Image");
resetImageItem.addListener(SWT.MenuDetect, new Listener() {
    @Override
    public void handleEvent(Event event) {
        int x = event.x;
        int y = event.y;
    }
});

使用 Event#doit 并将其设置为 false 如果事件在您所在的区域之外。这是一个示例,它将在 Canvas:

的左半部分显示菜单,但不显示右半部分
public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("Whosebug");
    shell.setLayout(new FillLayout());

    final Canvas canvas = new Canvas(shell, SWT.NONE);

    Menu menu = new Menu(canvas);
    new MenuItem(menu, SWT.NONE).setText("MenuItem");
    canvas.setMenu(menu);

    canvas.addListener(SWT.MenuDetect, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            Point location = canvas.toControl(event.x, event.y);
            if(location.x > canvas.getBounds().width / 2f)
                event.doit = false;
        }
    });

    shell.pack();
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

如果您想在任何情况下都显示 Menu,但根据事件位置禁用某些菜单项,请执行以下操作:

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("Whosebug");
    shell.setLayout(new FillLayout());

    final Canvas canvas = new Canvas(shell, SWT.NONE);

    Menu menu = new Menu(canvas);
    final MenuItem item = new MenuItem(menu, SWT.NONE);
    item.setText("MenuItem");
    canvas.setMenu(menu);

    canvas.addListener(SWT.MenuDetect, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            Point location = canvas.toControl(event.x, event.y);

            item.setEnabled(location.x <= canvas.getBounds().width / 2f);
        }
    });

    shell.pack();
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}