Topic: 请教问题 (Frame 与 线程) |
Print this page |
1.请教问题 (Frame 与 线程) | Copy to clipboard |
Posted by: sd Posted on: 2003-04-14 16:08 我想执行一个线程,然后线程sleep一段时间。在线程sleep的时候。程序接受键盘的指令。如下: class labelFrame extends Frame implements Runnable{ ......................... 然后在另一个程序中调用 public class t{ public static void main(String[] args){ labelFrame tt=new labelFrame("this w"); tt.setSize(600,800); tt.setLocation(100,80); tt.setVisible(true); Thread thread=new Thread(tt); thread.setPriority(Thread.MAX_PRIORITY); thread.start(); .................... 始终没有收到键盘的指令 |
2.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: seacloudy Posted on: 2003-04-15 09:06 既然你的Frame是一个线程,而且,你让它sleep了,当然不可能收到键盘的输入了。 我不知道你为什么要让一个Frame做成Thread? |
3.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: jiangns3000 Posted on: 2003-04-15 10:34 你的问题是不是:在一个程序(设为P)中创建一个以线程方式运行的JFrame窗口。当JFrame进入Sleep时,程序P能进行键盘输入? 若以上理解算对的话,无论是程序P还是JFrame(当它不是Sleep时)都可以进行键盘输入。键盘输入是共享的,简单一些说,谁是当前窗口,此时谁就接受键盘输入。(否则考虑键盘焦点。) 以上解释不知是否能解决你的问题。 |
4.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: sd Posted on: 2003-04-15 13:43 我的问题是: run() {while(true) {if.................; else.....................; try{Thread.sleep(1000);}catch........... }} 1是不是这个线程执行后永远退不出? 2Thread.sleep时候,是不是程序(addKeyListener(this))可以接受键盘的指令? thanks to everyone who answer me. |
5.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: jiangns3000 Posted on: 2003-04-15 15:22 你贴出了代码,我终于准确理解了你的问题。 1)如果你在run()代码中,没有设置某一个条件退出run()方法,则该线程永远执行(理论上,当run()代码执行完成,线程才结束)。但你的情况有点不一样,即除了刚才那一点外,当关闭JFrame时,若事件处理是正常的程序关闭操作,则该线程会结束。 2)恰恰相反,是当该线程化的JFrame不是处于sleep时,接受键盘处理。若它sleep,则其它非sleep线程接受键盘处理。 |
6.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: jiangns3000 Posted on: 2003-04-15 15:35 例如: 不妨设一个JFrame对象,有一个TextArea,它按受键盘输入。同时该JFrame中有一个run(),(作为线程运行),其代码: run() {while(true) { 程序自动往该TextArea中写入内容; try{Thread.sleep(1000);}catch........... } } 这时,TextArea中不断有内容加入(run()),但你照样可用键盘向这个JFrame的TextArea中加入内容。这时TextArea中内容是你的键盘输入与run() 输入的混合体。 |
7.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: sd Posted on: 2003-04-16 09:50 能不能将键盘事件处理放在线程之外(键盘事件代码放在线程之外),也就是说当run()方法sleep的时候,处理键盘事件?(run()不包含键盘事件代码) 我的程序是键盘处理和线程分开,我以为当线程sleep的时候,main()会去处理键盘事件,然后因为是while(true),所以过了一秒后继续做while之内的事。 以下是我精简过的代码,只要copy,编译,你就可以看到我在做什么了,也就是javac t.java。抱歉给您带来这么多的麻烦·! import java.awt.Graphics; import java.awt.event.*; import java.awt.*; class labelFrame extends Frame implements Runnable,KeyListener{ Graphics g; tubiao T; public static int[][] m=new int[15][10]; labelFrame(String title) { super(title); T=newTubiao(); setLayout(new FlowLayout()); addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e) {System.exit(0);}}); m[14][1]=1;m[14][2]=1;m[14][3]=1;m[14][4]=1;m[14][5]=1; m[14][0]=1;m[14][9]=1;m[14][8]=0;m[14][7]=1;m[14][6]=1; repaint();} public void paint(Graphics g) { int x,y,f,n; g.setColor(Color.blue); for(y=0;y<=14;++y) for(x=0;x<=9;x++) if(m[y][x]==1) { f=(30+15*x); n=(50+15*y); g.fillRect(f,n,15,15); } T.draw; } public tubiao newTubiao() {return new tubiao1(0,2);} public void run() {while(true) {if(T.down()==true) {repaint();} else{ T=newTubiao(); repaint();} try{Thread.sleep(500);} catch(InterruptedException e){} }} public void keyTyped(KeyEvent e) {if(e.getKeyChar()=='f'){T.left();repaint();} if(e.getKeyChar()=='J'){T.right();repaint();}} public void keyReleased(KeyEvent e){} public void keyPressed(KeyEvent e){}} public class t { String contents="null"; public static void main(String[] args){ labelFrame tt=new labelFrame("this w"); tt.setSize(600,800); tt.setLocation(100,80); tt.setVisible(true); Thread thread=new Thread(tt); thread.setPriority(Thread.MAX_PRIORITY); thread.start(); }} //*******************tubiao1是俄罗斯游戏中下落的小方块******// class tubiao1 implements tubiao { int i,j=8; public tubiao1(int i,int j) {this.i=i;this.j=j;} public boolean down(){ i++; if(labelFrame.m[i][j]==0&&labelFrame.m[i][++j]==0) { j--; return true;} else{i--; labelFrame.m[i][j]=1;labelFrame.m[i][++j]=1; j--; return false;} } public void left(){ j--; if(labelFrame.m[i][j]==0) {} else{j++;} } public void right(){ j+=2; if(labelFrame.m[i][j]==0) {j--;} else{j-=2;} } public void draw(Graphics g) { int x,y; x=(30+15*j); y=(50+15*i); g.fillRect(x,y,30,15);} } //***********接口。是为实现多态***************// interface tubiao{ public boolean down(); public void left(); public void right(); public void draw(Graphics g); } |
8.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: sd Posted on: 2003-04-16 09:57 有一行要该,T.draw(有图标) 改为 T.draw; 这样就好了。请帮我看看 |
9.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: jiangns3000 Posted on: 2003-04-16 11:30 当然可以。当run()进入sleep()时,labelFrame处理键盘事件。(见我上边所弄TextArea的例子) 你的代码几乎完成正确,只差一点儿:在 labelFrame 的最后repaint();之前, 加上:addKeyListener(this) ;即可。 你没有注册,当然不能处理键盘事件。 |
10.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: sd Posted on: 2003-04-17 08:51 very good. |
11.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: sd Posted on: 2003-04-26 09:08 请问package 用来干什么的呀,我怎么感觉import 有用, package 好象没什么用处,因为类文件和源代码都在指定的目录下了,package 起了什么做用了呢? |
12.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: jiangns3000 Posted on: 2003-04-26 09:34 作用太大啦。比如说:各个类相当于文件,包相当于文件夹,文件夹作用是:对文件进行分类、组织、管理。包对类进行分类、组织、管理。这个比喻但愿对你理解有些帮助。 |
13.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: sd Posted on: 2003-04-27 08:02 i am sorry, 但是你存放.java文件或.class文件的时候,不是已经放在指定的实际目录下了?既然如此当然可以用import 导入,倒 不见得package有什么用处。请指点,本人太笨了 |
14.Re:请教问题 [Re: sd] | Copy to clipboard |
Posted by: jiangns3000 Posted on: 2003-04-27 09:07 对呀,你这个指定的目录路经就是包名,你必须用package来告诉JAVA,这些class等文件属于这个包。(而不是仅仅将文件复制到该目录路经下就了事了)另外,包本身是一种访问权限的范围。 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |