具有一个“下一个”按钮,当我按下键盘上的Enter键并选择了按钮时,该按钮的widgetSelected事件被反复调用一次,然后进行一次超快操作。这正是我想要的行为,但仅在键盘输入键时发生。我想在按住单击时具有鼠标单击的行为。尝试通过鼠标单击执行相同操作时,其行为是不同的,它仅进行一次事件调用,并且单击结束时(UP)。
如何用鼠标模拟相同的行为?
我尝试过这样做,但是它阻止了UI(无法理解原因)并且从来没有调用mouseUp ,它在action.payload
while
答案 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")));