2013-05-06 122 views
1

我正在嘗試使單擊按鈕後執行某些任務的stoplight。這個指示燈應該做的是在50秒後從綠色變爲黃色,10秒後從黃色變爲紅色,60秒後從紅色變爲綠色(這部分我工作正常),並且如果按下按鈕時是綠色的,它應該變成黃色,這應該只有10秒後至少通過綠色。我有什麼問題是我該如何檢查10秒是否通過?Java線程處理

public class Stoplight extends Applet 
{ 
    Button cross; 

    public void init(){ 
     cross = new Button("Cross"); 
     add(cross); 

     StoplightCanvas stoplightCanvas = new StoplightCanvas(cross); 
     add(stoplightCanvas); 

     new StoplightThread(stoplightCanvas).start(); 
    } 
} 

class StoplightCanvas extends Canvas implements ActionListener 
{ 
    int Xpos; 
    int Ypos; 
    int diameter; 
    Button cross; 
    int x = 1; 

    StoplightCanvas(Button cross) 
    { 
     this.cross = cross; 
     cross.addActionListener(this); 
     setSize(300, 600); 
    } 

    public void paint(Graphics g) 
    { 
     diameter = 70; 
     Xpos = 70; 
     Ypos = 50; 

     g.setColor(Color.BLUE); 
     g.fillRect(70, 50, 74, 220); 

     g.setColor(Color.WHITE); 

     if (x == 1) 
      g.setColor(Color.RED); 
     drawCircles(g, Xpos, Ypos); 

     g.setColor(Color.WHITE); 
     if (x == 2) 
      g.setColor(Color.YELLOW); 
     drawCircles(g, Xpos, Ypos + diameter); 

     g.setColor(Color.WHITE); 
     if (x == 3) 
     g.setColor(Color.GREEN); 
     drawCircles(g, Xpos, Ypos + diameter * 2);  
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     if (e.getSource() == cross) {     
     } 

     repaint(); 
    } 

    void drawCircles(Graphics g, int x, int y) 
    { 
     g.fillOval(x, y, diameter, diameter);  
    } 

    public void toggleColor() { 
     if (x == 1) 
      x = 3; 
     else if (x == 2) 
      x = 1; 
     else if (x == 3) 
      x = 2; 
    } 
} 

class StoplightThread extends Thread 
{ 
    StoplightCanvas stoplightCanvas; 

    StoplightThread(StoplightCanvas stoplightCanvas) { 
     this.stoplightCanvas = stoplightCanvas; 
    } 

    public void run() 
    { 
     while (true) { 
      try { 
       if (stoplightCanvas.x == 3){ 
        Thread.sleep(50000); 
       } else if (stoplightCanvas.x == 2) { 
        Thread.sleep(10000);  
       } else if (stoplightCanvas.x == 1) { 
        Thread.sleep(60000); 
       } 
      } catch (InterruptedException e){} 

      stoplightCanvas.toggleColor(); 
      stoplightCanvas.repaint(); 
     }   
    } 
} 
+0

1)爲什麼要編寫一個小程序?如果由於規格而到期。由老師,請參考[爲什麼CS老師應該停止教Java applets](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/)。 2)爲什麼選擇AWT而不是Swing?在[Swing extras over AWT]上看到這個答案(http://stackoverflow.com/a/6255978/418556)有很多很好的理由放棄使用AWT組件。如果您需要支持較老的基於AWT的API,請參閱[混合重量級和輕量級組件](http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html)。 – 2013-05-06 15:13:44

回答

1

你可以設置一個計時器,當他們按下按鈕10秒。當時間到期時,通過回調將顏色更改爲黃色。這比處理例外要好得多,因爲它們應該適用於特殊情況。

請參閱this thread關於如何爲以後設置計時器。

編輯

海報希望不使用計時器。一種方法是存儲按鈕在變量中的時間,然後訪問該變量並與run方法的while循環內的當前時間進行比較。

+0

有沒有辦法做到這一點沒有計時器? – FJam 2013-05-06 01:41:20

+0

是否有不想使用計時器的特定原因?如果你不使用定時器,那麼你最終會在線程中休眠,這會導致GUI無響應。定時器是處理這個問題的經典方式。 – 2013-05-06 01:42:39

+0

這是作業,我們還沒有學習計時器,這是唯一的原因。如果我沒有找到任何其他方式,生病只需要使用一個計時器 – FJam 2013-05-06 01:44:35