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.drawPresent;
}

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.drawPresent;
这样就好了。请帮我看看

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