作者H45 (!H45)
看板java
标题Re: [问题] 如何让滑鼠点很多次仍视为一次?
时间Thu Jan 8 04:21:43 2009
※ 引述《tatibana31 (橘三十一)》之铭言:
: 以下是类似的程式码:
: public void procedure()
: {
: if(computer){
: Action_A(); Action_B(); Drawing();
: computer = false;
: procedure();
: }else if(!computer){
: Action_A(); mouseControl = true;
: }
: }
: 滑鼠的程式码为:
: public void mouseClicked(mouseEvent m)
: {
: if(mouseControll){
: Action_B(); Drawing(); mouseControll = false;
: computer = true;
: procedure();
: }
: }
: 大概就是玩牌时那种轮流的状况,我现在遇到一个问题,
: 如果我只click 一次的话,什麽问题都没有(这应该是正常的)
: 但是如果我连续狂按十次的话,procedure会连跑十次,即使有mouseControl这个
: 变数去控制的话,也是一样
: 这种情形我该怎麽作,才有办法在取得下次滑鼠控制权之前,只接受一次click,其
: 它视为无效?
: 我试过
: 用Thread.sleep()....无效。
: 用add & removeMouseListener()....无效
: 在procedure前加一个单次回圈....无效
: 加synchronized好像在此是没有作用的....
: 恳请有空的人,可以告诉我该怎麽作才可以作到?非常感谢!
刚刚手滑,重要的反而没贴上来....
add & removeMouseListener() 是有效的,问题是在这两者实际生效的时间点并非立即
的,所以才会有明明已经 removeMouseListener 但是该听取者却又收的到事件的怪事。
解决的方法仍然是 Multi-threading 目标是想办法在重要的工作进行的过程中,接收
到滑鼠事件直接略过并丢弃。
注意:呼叫 mouseClicked 方法的执行绪只有一个: AWTThread
所以不用想竞速条件的问题,在此问题下,使用 synchronized 语法是不必要的。
以下是我的解决办法:
mouseAdapter = new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
// 判断事件是否已启用
if (eventAvailable) {
// 停用事件
eventAvailable = false;
// 移除滑鼠听取者
myComponent.removeMouseListener(mouseAdapter);
// 跑重要的工作 (说明一)
new Thread(task).start();
}
}
};
task = new Runnable() {
public void run() {
// TODO 在这边写下你的程式码
// 加回滑鼠听取者
myComponent.addMouseListener(mouseAdapter);
// 启用事件
eventAvailable = true;
}
};
说明一:改写成 task.run() 是错误的,原因是 AWTThread 在做完 task 之後会去拿取
新的事件,此时 eventAvailable 是 true,且滑鼠听取者已被加回去。只有 new
Thread(task).start() 或类似方法让 AWTThread 离开万恶的 mouseClicked 方法,赶
快拿取新的事件,趁 task 还没做完,快速地略过并丢弃新的事件。
如果 Component 提供的 getMouseListener()[0] 能协助判断的话,请将
eventAvailable 移除,并且换成 getMouseListener()[0] 相关的控制方式,以减少不
必要的控制变数。
我已经写好一份范例,如果需要的话,请来信通知。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.127.39.76
1F:→ H45:getMouseListeners()[0] 01/08 04:24
2F:推 tatibana31:超级感谢,不过我从没写过这种,可能需要想一下,刚刚 01/08 07:36
3F:推 tatibana31:失眠时,想到一种写法,待会儿比较有精神时再来试试 01/08 07:40
4F:推 superlubu:大推 01/08 09:55