java 板


LINE

※ 引述《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
5F:推 TonyQ:我这篇也有一些相关的参考资料 #17MwHw0E (java) 01/08 14:45







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping 或 站内搜寻

TOP