当我运行while循环我的paint方法时,关键监听器不工作

时间:2014-05-10 07:32:31

标签: java

我是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

    }
}`

1 个答案:

答案 0 :(得分:0)

您需要在不同的线程中运行两个代码段, 如果你有一个while循环运行,那么线程将不会在while循环之后到达代码,直到它完成。

我的建议是将你的项目符号的绘制方法放在一个单独的类中,该类将在它自己的线程中运行。然后,您可以同时收听事件并进行绘画。