2013-07-21 113 views
3

此代碼包含可移動的pacman,按下空格按鈕後拍攝小橢圓。所以布爾變量默認爲false。按空格按鈕後變爲true,並繪製橢圓。按空格按鈕之後,線程啓動。這個線程包含代碼向前移動橢圓形,並且一旦它達到某些協調它消失。因此,當我第一次按空格時,一切工作正常。事實上,它也工作正常後,但更多的時間,但繼續拋出IllegalThreadStateException.I決定把線程代碼放到while(c!=22)塊中,因爲當c = 21時球消失了,所以我認爲線程會因爲條件無法滿載而繼續運行。所以我的意思是每次按下空格按鈕時都會讓橢圓運動。 這不是完整的代碼。很重要的一部分。如果您需要完整的代碼,請讓我知道。 謝謝!重複啓動線程

主題:

 thread=new Thread(){ 
     public void run(){ 
      while(c!=22){ 
      try{ 
      for (c=0;c<=20;c++){ 
       newX=newX+c; 
       repaint=true; 
       Thread.sleep(100); 
       } 
      if(c==21){ 
       shoot=false; 
       c=0; 
      } 
     }catch(InterruptedException v){System.out.println(v);} 
     } 
     } 
    }; 

的paintComponent方法:

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) 
     newX=x+20; 
     newY=y+10; 

    if(shoot){ 
    g.drawOval(newX,newY,10,10); 
    } 

    if(repaint) 
     repaint(); 

} 

關鍵事件,啓動線程:

if(e.getKeyCode()==KeyEvent.VK_SPACE){ 
    shoot=true; 
    thread.start(); 
} 
+1

1)爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 2)'i = new ImageIcon(「C:\\ Users \\ Jakub \\ Desktop \\ pm.gif」);'不要試圖在繪製方法中加載資源。相反,將它們聲明爲類屬性,並在需要時簡單地繪製它們。 –

回答

5

IllegalThreadStateException可能是拋出,因爲你叫Thread.start()多次爲同一線程對象。避免這種異常的關鍵是在啓動它之前每次實例化thread(具體實現取決於你想要實現的行爲)。