线程和事件监听

问题描述

小弟最近碰到一个现成等待的问题在CANVAS中覆盖了keyPressed方法中wait了一个线程然后我再按键这个事件一直没有被监听到这是什么原因?主要功能是实现了一个窗帘的移动代码如下Canvas类:packageorg.ray;importjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;publicclassCurtainControlextendsCanvas{privateintstep;privateintscreenW=this.getWidth();privateintscreenH=this.getHeight();privateintheight;privatebooleanflag;privateThreadRunt;publicCurtainControl(){step=(int)(screenH*0.01);height=0;flag=false;}publicvoidsetT(ThreadRunt){this.t=t;}protectedvoidkeyPressed(intkeyCode){this.repaint();switch(getGameAction(keyCode)){caseCanvas.FIRE:if(!flag)this.stop();elsethis.continueDo();break;caseCanvas.UP:if(step>=0)step=-step;break;caseCanvas.DOWN:if(step<=0)step=-step;break;}}protectedvoidpaint(Graphicsg){if(step<0){g.setColor(255,255,255);g.fillRect(0,0,this.screenW,this.screenH);}g.setColor(128,128,0);g.fillRect(0,0,screenW,height);g.setColor(184,134,11);intgap=(int)(this.screenW/20);intpreX=0;intthirdY=(int)(Math.sqrt((gap*gap)-(gap/2)*(gap/2)));inti=0;intthirdX=0;for(i=0;i<this.screenW;i=i+gap){thirdX=(int)((preX+i)/2);g.fillTriangle(preX,height,i,height,thirdX,height-thirdY);preX=i;}thirdX=(int)((preX+this.screenW)/2);g.fillTriangle(preX,height,this.screenW,height,thirdX,height-thirdY);}publicvoidstop(){this.flag=true;synchronized(t){try{t.wait();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}//t.stopJOB();}publicvoidcontinueDo(){this.flag=false;synchronized(t){t.notifyAll();}//t.startJOB();}publicsynchronizedvoidaddHeight(){if((height>getHeight())||(height<0)){step=-step;}height+=step;}}

线程类:packageorg.ray;importorg.ray.CurtainControl;publicclassThreadRunimplementsRunnable{privateCurtainControlcc;privatebooleanflag;publicThreadRun(CurtainControlcc){super();this.cc=cc;flag=true;}publicvoidrun(){//TODOAuto-generatedmethodstubwhile(true){if(flag){cc.addHeight();cc.repaint();try{Thread.sleep(100);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}else{try{Thread.sleep(200);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}}publicvoidstopJOB(){flag=false;}publicvoidstartJOB(){synchronized(this){flag=true;}}}

解决方案

解决方案二:
主要问题是线程没启动,稍微做了些改动,不知道你是不是想实现这样的效果。importjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Graphics;publicclassCurtainControlextendsCanvas{privateintstep;privateintscreenW=this.getWidth();privateintscreenH=this.getHeight();privateintheight;privatebooleanflag;privateThreadRunt;publicCurtainControl(){step=(int)(screenH*0.01);height=0;flag=false;setT();}publicvoidsetT(){this.t=newThreadRun(this);}protectedvoidkeyPressed(intkeyCode){this.repaint();switch(getGameAction(keyCode)){caseCanvas.FIRE:System.out.println("fire");System.out.println(flag);if(!flag)this.stop();elsethis.continueDo();break;caseCanvas.UP:if(step>=0)step=-step;break;caseCanvas.DOWN:if(step<=0)step=-step;break;}}protectedvoidpaint(Graphicsg){if(step<0){g.setColor(255,255,255);g.fillRect(0,0,this.screenW,this.screenH);}g.setColor(128,128,0);g.fillRect(0,0,screenW,height);g.setColor(184,134,11);intgap=(int)(this.screenW/20);intpreX=0;intthirdY=(int)(Math.sqrt((gap*gap)-(gap/2)*(gap/2)));inti=0;intthirdX=0;for(i=0;i<this.screenW;i=i+gap){thirdX=(int)((preX+i)/2);g.fillTriangle(preX,height,i,height,thirdX,height-thirdY);preX=i;}thirdX=(int)((preX+this.screenW)/2);g.fillTriangle(preX,height,this.screenW,height,thirdX,height-thirdY);}publicvoidstop(){this.flag=true;//synchronized(t){//try{//t.wait();//}catch(InterruptedExceptione){////TODOAuto-generatedcatchblock//e.printStackTrace();//}//}t.stopJOB();}publicvoidcontinueDo(){this.flag=false;////synchronized(t){//t.notifyAll();//}t.startJOB();}publicsynchronizedvoidaddHeight(){if((height>getHeight())||(height<0)){step=-step;}height+=step;}}classThreadRunimplementsRunnable{privateCurtainControlcc;privatebooleanflag;publicThreadRun(CurtainControlcc){super();this.cc=cc;flag=true;newThread(this).start();//主要是加了这句,让线程启动}publicvoidrun(){//TODOAuto-generatedmethodstubwhile(true){if(flag){cc.addHeight();cc.repaint();try{Thread.sleep(100);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}else{try{Thread.sleep(200);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}}publicvoidstopJOB(){flag=false;}publicvoidstartJOB(){synchronized(this){flag=true;}}}

解决方案三:
uping
解决方案四:
这个是我的错没把外面的Medlet写出来packageorg.ray;importjavax.microedition.lcdui.Command;importjavax.microedition.lcdui.CommandListener;importjavax.microedition.lcdui.Display;importjavax.microedition.lcdui.Displayable;importjavax.microedition.midlet.MIDlet;importjavax.microedition.midlet.MIDletStateChangeException;publicclassMainletextendsMIDlet{publicMainlet(){//TODOAuto-generatedconstructorstub}protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{//TODOAuto-generatedmethodstub}protectedvoidpauseApp(){//TODOAuto-generatedmethodstub}protectedvoidstartApp()throwsMIDletStateChangeException{Displayd=Display.getDisplay(this);CurtainControlcc=newCurtainControl();ThreadRuntr=newThreadRun(cc);finalThreadt=newThread(tr);cc.setT(tr);cc.addCommand(newCommand("a",Command.EXIT,1));d.setCurrent(cc);t.start();}}

再说明白点。。就是线程WAIT了之后就无法唤醒了
解决方案五:
keyPressed本身也是个线程LZ不会把CurtainControl也锁死了吧,虽然没遇到过,但觉得有可能使这个问题
解决方案六:
publicvoidstop(){this.flag=true;synchronized(t){try{t.wait();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}//t.stopJOB();}你觉得你这段执行后,这个方法能返回吗?你把系统主线程阻塞了.

时间: 2024-09-30 23:00:55

线程和事件监听的相关文章

android截图事件监听的原理与实现

Android系统没有对用户截屏行为提供回调的api,所以我们只能走野路子来获取用户是否截屏了.一般大家都会采用如下两种方法 1.监听截屏图片所在目录变化(FileObserver) 2.监听媒体库的变化(ContentObserver) 上面两种方法均不是万能的,需要结合使用才能达到良好的效果,首先看看如何监控目录 在android中,我们可以通过FileObserver来监听目录变化,先来看看如何使用 private static final File DIRECTORY_PICTURES

.NET陷阱 四 事件监听带来的问题与弱监听器

大家可能都遇到过没有取消事件监听而带来的一些问题,像内存泄露.访问无效数据等.当我们写下如下代码时: source.StateChanged += observer.SourceStateChangedHandler 实际上source会保持有对observer的一个引用,所以如果source的生命期长于observer的话,则当其它地方不引用observer时,如果不显示解除监听,则observer不会被垃圾回收.这可能会带来两个问题:其一,如果observer占用了大量内存的话,则这部分内存

JavaScript使用addEventListener添加事件监听用法实例

  本文实例讲述了JavaScript使用addEventListener添加事件监听用法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <!DOCTYPE html> <html lang="en"> <head> <title>This text is the title of the document</title

js实现滑动触屏事件监听的方法

  这篇文章主要介绍了js实现滑动触屏事件监听的方法,适用于手机端触屏滑动事件的监听技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js实现滑动触屏事件监听的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 function span_move_fun(){

java Gui编程 事件监听机制

1.     GUI编程引言     以前的学习当中,我们都使用的是命令交互方式:        例如:在DOS命令行中通过javac java命令启动程序.     软件的交互的方式:      1. 命令交互方式           图书管理系统     2. 图形交互方式     ava提供了专业的API用于开发图形用户界面     GUI--> Graphic  User   Interface      将要了解GUI API的框架结构,以及GUI组件以及组件之间的关系,容器和布局管理

android.widget.Switch- 开/关事件监听

问题描述 android.widget.Switch- 开/关事件监听 我想实现一个开关按钮事件android.widget.Switch (适用于 API v.14) <Switch android:id="@+id/switch1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Switch"

js-JS键盘事件监听之禁用键盘按键

问题描述 JS键盘事件监听之禁用键盘按键 我的页面内有一个输入框,我想要实现的功能是:按下字符键时正常输入字符,但是按下键盘上的上下方向键时什么也不做,但是现在我按下上方向键时光标总会跳到内容的最前面,按下下方向键时光标会跳到内容的最后面,请问怎么禁用这两个键盘的功能啊? 解决方案 chrome会这样,汗,按上下键返回false就行 <input type=""text"" onkeydown=""if(event.keyCode==38|

as3.0键盘事件监听不响应

问题描述 as3.0键盘事件监听不响应 在祯上写代码上的时候可以响应人物可以走,但是要求必须做独立的as文件,所以我放在了主类里面,但是怎么放都不响应键盘事件,只运行ENTERFRAME.求问这是为什么. 解决方案 Flex(AS 3.0)实现快捷键功能--监听键盘事件

事件处理-新手求教大神,java事件监听问题

问题描述 新手求教大神,java事件监听问题 import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JLabel; public class EventModelDemo implements ActionListener{ JLabel tips=new