在“鼠标按下事件”中启动“ asyncExec”会导致阻止行为

时间:2018-11-09 19:55:47

标签: java multithreading asynchronous swt mouseevent

具有一个“下一个”按钮,当我按下键盘上的Enter键并选择了按钮时,该按钮的widgetSelected事件被反复调用一次,然后进行一次超快操作。这正是我想要的行为,但仅在键盘输入键时发生。我想在按住单击时具有鼠标单击的行为。尝试通过鼠标单击执行相同操作时,其行为是不同的,它仅进行一次事件调用,并且单击结束时(UP)。

如何用鼠标模拟相同的行为?

我尝试过这样做,但是它阻止了UI(无法理解原因)并且从来没有调用mouseUp ,它在action.payload

中永远阻止了
while

2 个答案:

答案 0 :(得分:3)

您赋予Runnable的{​​{1}}在UI线程中运行。您必须从不在UI线程中进行任何形式的等待,因为这将阻止UI直到完成。

因此,您不能运行这样的循环,因为它会阻塞UI。由于循环永远不会返回到主SWT asyncExec循环,因此不会执行任何UI操作。

请改为使用readAndDispatch的{​​{1}}方法来安排timerExec在给定间隔后运行。该可运行对象应执行该操作的第一步,并使用Display安排以后的下一步。

答案 1 :(得分:1)

我记得几天前还有另一个关于长时间鼠标单击行为的问题,但是我再也找不到了。在尝试在UI线程中使用asyncExec失败之后,我将基于greg-449解决方案的这段代码使用了timerExec方法。 :)

    button.addMouseListener(new MouseAdapter() {
        boolean mouseDown;

        @Override
        public void mouseDown(MouseEvent e) {
            mouseDown = true;
            Display.getCurrent().timerExec(1000, () -> {
                if (mouseDown) {
                    button.notifyListeners(SWT.Selection, new Event());
                    button.notifyListeners(SWT.MouseDown, new Event());
                }
            });
        }

        @Override
        public void mouseUp(MouseEvent e) {
            mouseDown = false;
        }
    });

    button.addSelectionListener(SelectionListener.widgetSelectedAdapter(
            e -> System.out.println("Do next")));