Java SWT:在 mouseDown() 中打开对话框时未触发 mouseUp()

Java SWT: mouseUp() is not fired when opening a Dialog in mousDown()

如果在 StyledText 中单击某个字符串,我的程序会打开一个对话框。所以在 mouseDown() 中,我首先要检查单击了什么,然后打开一个对话框。这行得通。关闭对话框后,不会调用 mouseUp()。这导致在移动光标时 selecting 文本,就好像用户试图 select 文本一样。 我可以通过执行以下任务来重现该行为:

在我的用例中,我不需要触发 mouseUp()。但是没有触发它意味着 OS 假定鼠标按钮仍然按下并且 selects 文本。如果对话框打开并窃取了焦点,这可能是正确的行为。但是必须有可能告诉系统,鼠标按钮已被释放。

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 is fired" 没有打印在控制台上。

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

我自己尝试调用 mouseUp:

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

这导致消息 "MousUp is fired",但 selection 问题仍然存在。

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

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

可以在 Dialog 的构造函数中将 SWT.MODELESS 添加到 shell 样式,它扩展了 jface.dialog.Dialog.

setShellStyle(SWT.MODELESS);

MouseUp() 现在被解雇了。

这里的问题是,虽然一个对话框已经打开,但通过单击文本可以打开多个对话框。

尝试将 myStlyedText.notifyListeners(SWT.MouseUp, null); 添加到您的代码中。 它应该工作。

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

    @Override
    public void mouseDown(MouseEvent e) {
        if (certainStringClicked()) {
            myStlyedText.notifyListeners( SWT.MouseUp, null );
            openDialog();
        }
    }

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