2012-10-10 9 views
0

我有一個問題。如何轉移循環內的關鍵事件

在我的計劃,我有2類:

  1. 大型機

    public class MainFrame extends javax.swing.JFrame 
    { 
    
        Logika logika; 
    
        . 
        . 
        . 
    
        private void przyciskKeyPressed(java.awt.event.KeyEvent evt) { 
         // TODO add your handling code here: 
         char znak = evt.getKeyChar(); 
         int kod = evt.getKeyCode(); 
    
    
         if(kod==KeyEvent.VK_A) 
         { 
          logika.key_pressed("a"); 
         } 
        } 
    
    } 
    
  2. LOGIKA

    public class Logika { 
    
        . 
        . 
        . 
    
    
        Calendar cal = Calendar.getInstance(); 
    
    
    
    
        public void start() 
        { 
         gra_rozpoczeta=true; 
         punkty=0; 
         liczba=1; 
         x[0]=251; 
         y[0]=301; 
    
         cal = Calendar.getInstance(); 
         czas=cal.getTimeInMillis(); 
         while(gra_rozpoczeta==true) 
         { 
          cal=Calendar.getInstance(); 
    
          dif=dif-(int)(cal.getTimeInMillis()-czas); 
          if(dif<0) 
           akcja(); 
          try { 
           Thread.currentThread().sleep(50); 
          } catch (InterruptedException ex) { 
           Logger.getLogger(Logika.class.getName()).log(Level.SEVERE, null, ex); 
          } 
          czas=cal.getTimeInMillis(); 
         } 
    
        } 
    
        private void akcja() 
        { 
         dif=500; 
    
         liczba++; 
         if(liczba==10) 
          key_presed=true; 
         if(key_presed==true) 
          gra_rozpoczeta=false; 
        } 
    
        public void key_pressed(String s) 
        { 
         key_presed=true; 
         key=s; 
        } 
    
    } 
    

有了這個方法,我有問題。

最後5秒循環但我想先停止它,如果我按鍵「a」。

現在工作是: -program開始, -loop最後5秒只在循環

後(IM按下「A」) - 程序響應按鍵的是否有可能做?

回答

0

你的代碼示例有點欠缺,但我猜測這種行爲是由於不恰當地使用線程造成的。當你的主機啓動循環時,它不會在一個新線程中啓動它,它會在主線程中啓動它,這個線程也在監聽鍵盤輸入。所以當循環運行時,鍵盤輸入被阻塞,並且只有在循環結束後才被處理。

如果你想在不同的線程使用邏,你必須改變它是這樣的:

public class Logica implements Runnable { 
    [...] 
    @Override 
    public void run() { 
     [do loop] 
    } 
} 

,並啓動它在大型機一個新的線程這樣的:

//start the loop as a new thread... 
final Thread thread = new Thread(logika); 
thread.start(); 
//keep listening for keyboard input in the main thread