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



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

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

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

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) {}
});

i可以验证mouseup()未调用,因为"触发了鼠标"未打印在控制台上。

处理此问题的最佳方法是什么?我已经尝试将重点放在另一个小部件(setFocus()和forcefocus())上,但这无济于事。

我试图自己打电话给MouseUp:

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

这导致消息"放电了",但是选择问题仍然存在。

我可以将代码移动到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) {}
});

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

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

setShellStyle(SWT.MODELESS);

mouseup()立即发射。

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

最新更新