首页 > 解决方案 > Java SWT:在 mousDown() 中打开对话框时不会触发 mouseUp()

问题描述

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

在我的用例中,我不需要 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() 方法中,但这实际上不是我想要的。该对话框应立即出现。我还可以做些什么?

标签: javaswt

解决方案


尝试添加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) {}
});

推荐阅读