【发布时间】:2018-11-09 19:55:47
【问题描述】:
有一个“下一个”按钮,当我在选择按钮的情况下按下键盘输入键时,按钮的 widgetSelected 事件被重复调用一次又一次,然后执行超快。这正是我想要的行为,但只发生在键盘输入键上。
我希望在按住单击时通过鼠标单击来实现该行为。当试图用鼠标点击做同样的事情时,行为是不一样的,它只调用一个事件,当点击结束时(UP)。如何用鼠标点击模拟相同的行为?
我试过这样做,但它会阻塞 UI(不明白为什么)并且永远不会调用 mouseUp,它会在 while 中永远阻塞:
button.addMouseListener(new MouseAdapter() {
boolean mouseDown;
@Override
public void mouseDown(MouseEvent e) {
System.out.println("mouseDown");
mouseDown = true;
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
while (mouseDown) {
System.out.println("Doing next in mouseDown");
next(composite, label_1);
synchronized(this){
try {
wait(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
}
@Override
public void mouseUp(MouseEvent e) {
System.out.println("mouseUp");
mouseDown = false;
}
});
【问题讨论】:
-
从“阻塞”问题开始。此外,如果有多个线程,变量必须是
volatile以确保它在线程之间“可见”。 -
@user2864740 你能在你的提案中发布一些示例代码吗?不明白你想让我做什么
-
除了使用
volatile boolean mouseDown之外我没有其他建议[我更喜欢使用明确的线程,但我也是这样的“老派”] :) 希望有人能提供有用的反馈可能的 UI 异步交互。
标签: java multithreading asynchronous swt mouseevent