【问题标题】:Pop up menu on Canvas: only display within specific boundaryCanvas 上的弹出菜单:仅在特定边界内显示
【发布时间】:2016-06-09 15:09:45
【问题描述】:

我在Canvas 上显示Image。当用户在画布上单击鼠标右键时,会显示一个上下文菜单。

如果用户在图像范围内单击,我如何只显示菜单?我可以从活动中获得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;
    }
});

【问题讨论】:

  • 暂时移除它,然后看看它是否有效。

标签: java canvas swt popupmenu


【解决方案1】:

如果活动不在您的区域,请使用 Event#doit 并将其设置为 false。这是一个示例,它会在左半边显示菜单,而不是在 Canvas 的右半边显示:

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("Stackoverflow");
    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("Stackoverflow");
    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();
}

【讨论】:

  • 太棒了!当图书馆的行为与您期望的一样时,您不喜欢它吗:)
  • 其实我相信这里有错误,因为事件会在用户右键单击画布时执行,而不是在单击菜单项时执行
  • @Robben_Ford_Fan_boy 好吧,这是你的问题:“我只在用户在图像范围内单击时才显示菜单?”。这就是我提供的。无论如何,我用另一种方法更新了我的答案。也许这就是你要找的。​​span>
  • 我的意思是在您的示例中,侦听器代码在用户右键单击画布时执行。预期的行为是右键单击画布,获取弹出菜单,然后选择将执行侦听器代码的项目。
  • @Robben_Ford_Fan_boy 好,那么添加一个监听到MenuItem的选择来捕捉item的选择事件
猜你喜欢
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2019-05-28
  • 2016-10-16
  • 1970-01-01
相关资源
最近更新 更多