【问题标题】:Java SWT: mouseUp() is not fired when opening a Dialog in mousDown()Java SWT:在 mousDown() 中打开对话框时不会触发 mouseUp()
【发布时间】:2019-03-14 14:49:41
【问题描述】:

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

【问题讨论】:

  • 很奇怪...你能把你的逻辑移到关闭对话框事件中吗?
  • 您是否尝试在 mouseDown 方法中使用 e.doit = false 来“使用”该事件?另一种解决方法可能是打开使用Display::asyncExec 延迟的对话框,这可能使鼠标向上事件有机会到达样式文本小部件。
  • @RüdigerHerrmann e 是一个 MouseEvent 并且没有 doit。在实例化 MouseEvent (MouseUp) 之前设置 event.doit=false 无效。使用 asyncExec 也不是解决方案。我尝试了以下方法:myStyledText.getShell().getDisplay().asyncExec(() -> { int returnCode = dialog.open(); ... }
  • @navy1978 不知道该怎么做。该代码将 StyledText 的部分文本替换为对话框中输入的内容。我无法在对话框中执行此操作。
  • 您可以尝试编写自己的对话框:vogella.com/tutorials/EclipseDialogs/article.html

标签: java swt


【解决方案1】:

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

【讨论】:

  • 这很有效,在我看来是一个干净的解决方案。但是将语句放在 if 块中很重要,否则选择将被禁用。
  • @Sadik 对不起,我不明白。为什么不能将语句放在 if 块中。
  • 可以,没问题。但是当我写这篇评论时你没有。这只是给其他人的便条。
  • @Sadik Ouch!))是的,你是对的,我在你发表评论后编辑了我的答案。那么,我们找到解决方案了吗?还是不行?
  • 好的,谢谢。我已经实现了这个解决方案,而且效果很好。
【解决方案2】:

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

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

setShellStyle(SWT.MODELESS);

MouseUp() 现在被触发了。

这里的问题是,尽管已经打开了一个对话框,但单击文本可能会打开许多​​对话框。

【讨论】:

    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多