2

这只是我的代码的一部分,如果你们需要完整的代码,请告诉我。所以我的问题是,这部分if(shoot) thread.start();实际上不能像我希望的那样工作。使用 KeyListener 布尔变量拍摄在按下后变为真空格键。如果我使用thread.start()一切正常,但我不想在程序启动时启动线程,而是在按下空格键后(变量拍摄变为真)。谢谢你的建议!

public void paintComponent(Graphics g){
super.paintComponent(g);

i=new ImageIcon("C:\\Users\\Jakub\\Desktop\\pm.gif");
pacman=i.getImage();

g.drawImage(pacman,x,y,this);

if(shoot){
g.drawOval(newX+20,y+10,10,10);
}

if(repaint)
    repaint();
 }

public static void main(String args[]){
Buffer z= new Buffer();
z.setBackground(Color.cyan);

frame=new JFrame();
frame.setSize(500,500);
frame.add(z);
frame.addKeyListener(z);
frame.setVisible(true);

thread=new Thread(){
    public void run(){
        try{
        for (int i=0;i<=20;i++){
            newX=newX+i;
            repaint=true;
            Thread.sleep(100);                
            }
    }catch(InterruptedException v){System.out.println(v);}
    }
};
if(shoot)
    thread.start();
}
    if(e.getKeyCode()==KeyEvent.VK_SPACE){
    shoot=true;
}
4

2 回答 2

3
    if(shoot)
        thread.start();
=>  }

启动应用程序后,它会创建一个新的 JFrame,设置其大小等,创建一个Thread实例,检查是否shoot为真,如果为假,则不会启动线程。之后,它在上面提供的点等待 JFrame 关闭。当您单击 时shoot,您的应用程序此时仍在等待,因此它永远不会检查shoot是真还是假。

你可以做的是将上面的代码移动到你的关键监听方法中。也不要忘记搬到shoot合适的地方。

于 2013-07-20T13:12:42.823 回答
2

您可以做的是在keyPressed()方法本身中执行启动线程的任务,而不是在按下键时使变量为 true。

于 2013-07-20T13:13:52.167 回答