【问题标题】:Java, swt, How to distinguish right-click from left-click on popup menuJava,swt,如何区分弹出菜单的右键单击和左键单击
【发布时间】:2014-10-30 18:17:17
【问题描述】:

如何区分 swt 中弹出菜单的右键单击和左键单击?

通过添加一个 SelectionListener 我可以对左键和右键单击进行操作,但是如何 我知道用的是哪一个吗?是否可以在 MenuItem 上有一个 MouseListener?

我想做的类似于浏览器收藏夹菜单,左键选择 并右键单击最喜欢的上下文菜单。

Button bn = new Button(shell, SWT.FLAT);
bn.setText("Right Click to see the popup menu");

Menu popupMenu = new Menu(bn);
MenuItem newItem = new MenuItem(popupMenu, SWT.CASCADE);
newItem.setText("New");

newItem.addSelectionListener(new SelectionListener() {
 public void widgetSelected(SelectionEvent e) {    
      System.out.print("SELECTED1\n" );
 }
 public void widgetDefaultSelected(SelectionEvent e) {
      System.out.print("SELECTED2\n" );
 }
});

澄清: 抱歉,没有设法包含屏幕截图,但如果您按照此说明进行操作,我想您会明白我的意思。

  1. 在 Windows 资源管理器(或任何其他浏览器)中选择“收藏夹”菜单
  2. 如果您左键单击收藏夹之一,浏览器将打开此 URL, 但您也可以右键单击此收藏夹。
  3. 右键单击会弹出一个对所选收藏有效的上下文菜单。

我还需要对同一个 MenuItem 进行两个不同的操作(实际上与浏览器的目的相同)。

【问题讨论】:

  • 好的,但是选择(左键单击)和上下文菜单(右键单击)已包含在我的答案中...
  • 在按钮上是的,但我没有设法在 MenuItem 上做到这一点。事实上,我怀疑操作系统只有菜单的“选定”事件,据我所知,这个事件没有携带有关使用哪个按钮的信息。它在浏览器中很可能是一个看起来像菜单的小部件。当然我也可以这样做,但是如果可以使用 Menu 会节省很多工作。
  • 好的,经过一些测试,我很确定在 MenuItem 上单击左键和右键是不可能区分的。
  • 我担心是这种情况,但感谢您的尝试。

标签: java swt menuitem selected right-click


【解决方案1】:

左键可以听SWT.Selection,右键可以听SWT.MenuDetect:

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

    Button bn = new Button(shell, SWT.FLAT);
    bn.setText("Right Click to see the popup menu");

    Menu popupMenu = new Menu(bn);
    MenuItem newItem = new MenuItem(popupMenu, SWT.CASCADE);
    newItem.setText("New");

    bn.addListener(SWT.Selection, new Listener()
    {
        @Override
        public void handleEvent(Event e)
        {
            System.out.println("click");
        }
    });
    bn.addListener(SWT.MenuDetect, new Listener()
    {
        @Override
        public void handleEvent(Event e)
        {
            System.out.println("menu");
        }
    });
    bn.setMenu(popupMenu);

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

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

也就是说,对于菜单,您不需要SWT.MenuDetect 侦听器。只需致电 Button#setMenu(Menu) 就可以了。

【讨论】:

  • 好的,谢谢,但它是 MenuItem newItem 我想检测右键/左键单击。添加 newItem.addListener(SWT.MenuDetect... 似乎不起作用。
  • @owan 那么右键单击菜单项应该做什么?
  • 它应该打开一个上下文菜单,您可以在其中删除或重命名菜单项。这与浏览器处理收藏夹(至少是 explorer 或 firefox)的方式几乎相同。
  • @owan 那么你想从上下文菜单中打开上下文菜单吗?
  • 嗯,它并不是真正来自上下文菜单。弹出菜单将通过左键单击启动,但是弹出菜单的启动方式会有所不同吗?
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多