我是Java的新手。我知道keylisteners和paint方法在一个名为EDT的单独线程上运行。但在我的情况下,我需要在paint方法中运行一个while循环一段时间但是在运行期间循环我需要听我传入的密钥。你可以给我一个很好的方法,因为我可以在循环运行期间运行我的循环以及监听密钥。我实际上创建了一个循环来发射子弹一个游戏设计。所以任何其他建议
about the making of the thing work would be helpful!!!!thanx in advance`enter code here
import java.awt.Color;
import java.awt.DisplayMode;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class aadil extends Screen implements KeyListener {
public int i=0,j=0,condition=0,l=0;
int a=0,b=0;
Screen s=new Screen();
public static void main(String aadil[]){
DisplayMode dm=new DisplayMode(800,600,16,DisplayMode.REFRESH_RATE_UNKNOWN);
aadil a=new aadil();
a.run(dm);
}
public void run(DisplayMode dm){
setBackground(Color.red);
setForeground(Color.blue);
setFont(new Font("Arial",Font.PLAIN,44));
try{
s.setFullScreen(dm, this);
Window w= s.getFullScreenWindow();
w.addKeyListener(this);
try{
//Thread.sleep(9000);
}
catch(Exception e){}
}
finally{
//s.restore();
}
}
public void paint(Graphics g){
g.setColor(Color.black);
//if(i==10){
//while(a<750){
if(a>i)
g.clearRect(50+i+10, 60+j, 120, 120);
if(a<i) g.clearRect(50+i-10, 60+j, 120, 120);
if(b>j)
g.clearRect(50+i, 60+j+10, 120, 120);
if(b<j) g.clearRect(50+i, 60+j-10, 120, 120);
g.fillRect(50+i, 60+j, 120, 120);
a=i;
b=j;
//a+=9;
if(l==1){
// while(condition<400){
g.setColor(Color.blue);
g.fillRect(170+i+condition, 120+j, 30, 20);
try{
Thread.sleep(700);
g.clearRect(170+i+condition, 120+j, 30, 20);
}
catch(Exception e){}
condition+=19;
//}
//l=0;
}
//g.fillRect(200, 200, 200, 200);
//}
//}
//if(i==20){
//g.fillRect(200, 300, 120, 60);
//}
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keycode=e.getKeyCode();
//System.out.print(keycode);
if(keycode==KeyEvent.VK_LEFT)
i-=10;
if(keycode==KeyEvent.VK_RIGHT)
i+=10;
if(keycode==KeyEvent.VK_UP)
j-=10;
if(keycode==KeyEvent.VK_DOWN){
j+=10;
}
if(keycode==KeyEvent.VK_A)
l=1;
condition=0;
//s.restore();
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}`
答案 0 :(得分:0)
您需要在不同的线程中运行两个代码段, 如果你有一个while循环运行,那么线程将不会在while循环之后到达代码,直到它完成。
我的建议是将你的项目符号的绘制方法放在一个单独的类中,该类将在它自己的线程中运行。然后,您可以同时收听事件并进行绘画。