Java SWT:在mousDown()中打开对话框时不会触发mouseUp()

时间:2019-03-14 14:49:42

标签: java swt

如果在StyledText中单击某个字符串,我的程序将打开一个对话框。因此,在mouseDown()中,我首先要检查已单击的内容,然后打开一个对话框。这可行。关闭对话框后,不会调用mouseUp()。这将导致在移动光标时选择文本,就像用户尝试选择文本一样。 我可以通过执行以下任务来重现该行为:

  • 单击StyledText中的字符串 ->对话框打开
  • 关闭对话框
  • 无需单击即可移动鼠标 ->文本被标记为选中状态

在我的用例中,不需要触发mouseUp()。但是,如果不触发它,则表示操作系统假定鼠标按钮仍处于按下状态并选择了文本。如果对话框打开并夺走焦点,这可能是正确的行为。但是,肯定没有办法告诉系统鼠标按钮已被释放。

myStlyedText.addMouseListener(new MouseListener() {
    @Override
    public void mouseUp(MouseEvent e) {
        System.out.println("MouseUp is fired");
    }

    @Override
    public void mouseDown(MouseEvent e) {
        if (certainStringClicked()) {
            openDialog();
        }
    }

    @Override
    public void mouseDoubleClick(MouseEvent e) {}
});

我可以确认未调用mouseUp(),因为控制台上未打印“ MousUp被触发”。

处理此问题的最佳方法是什么?我已经尝试将精力放在另一个小部件(setFocus()和forceFocus())上,但这没有帮助。

我试图自己打电话给mouseUp:

Event event = new Event();
event.type = SWT.MouseUp;
event.button = 1;
MouseEvent mouseUpEvent = new MouseEvent(event);
mouseUp(mouseUpEvent);

这导致出现消息“已触发MousUp”,但是选择问题仍然存在。

我可以将代码移到mouseUp()方法中,但这实际上并不是我想要的。该对话框应立即出现。我还能做什么?

2 个答案:

答案 0 :(得分:2)

尝试将Mode 1添加到您的代码中。 它应该工作。

myStlyedText.notifyListeners(SWT.MouseUp, null);

答案 1 :(得分:1)

这不是一个好的解决方案。但这对于某些人来说可能是一种解决方法。

可以在对话框的构造函数中向外壳样式添加SWT.MODELESS,该对话框扩展了jface.dialog.Dialog

setShellStyle(SWT.MODELESS);

MouseUp()立即被触发。

这里的问题是,尽管一个对话框已经打开,但仍可以通过单击文本来打开许多对话框。