2013-05-06 3 views
1

버튼을 클릭 한 후 특정 작업을 수행하는 신호등을 만들려고합니다. 이 신호등은 50 초 후 녹색에서 노란색으로, 10 초 후 노란색에서 빨간색으로, 60 초 후에 빨간색에서 녹색으로 바뀌며 (이 부분은 잘 작동합니다), 버튼을 누르면 그것이 초록색으로 바뀌어야하는 초록색인데, 이것은 초록색을 유지하면서 적어도 10 초가 지난 후에만 작동해야합니다. 내가 문제가되는 것은 10 초가 경과했는지 여부를 확인하는 것입니다.자바 스레드 처리

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 애플릿 교육을 중단해야하는지] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/)를 참조하십시오. 2) Swing이 아닌 AWT를 사용해야하는 이유 AWT 구성 요소를 사용하여 포기해야하는 여러 가지 이유 때문에 [AWT를 통한 스윙 엑스트라] (http://stackoverflow.com/a/6255978/418556)에서이 대답을 참조하십시오. 이전 AWT 기반 API를 지원해야하는 경우 [중량 및 중량 구성 요소 혼합] (http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html)을 참조하십시오. –

답변

1

버튼을 10 초 동안 누르면 타이머를 설정할 수 있습니다. 시간이 만료되면 콜백을 통해 색상을 노란색으로 변경합니다. 그것은 예외적 인 상황을 위해 있어야하기 때문에 예외를 다루는 것보다 훨씬 낫습니다.

나중에 타이머를 설정하는 방법은 this thread을 참조하십시오.

편집

포스터는 타이머를 사용하지 않기를 바랍니다. 한 가지 방법은 버튼을 변수에서 누른 다음 변수에 액세스하고 run 메서드의 while 루프 내에서 현재 시간과 비교하는 시간을 저장하는 것입니다.

+0

거기에 타이머없이 할 수있는 방법이 있습니까? – FJam

+0

타이머를 사용하지 않는 특별한 이유가 있습니까? 타이머를 사용하지 않으면 스레드에서 잠자 게됩니다. 이로 인해 GUI가 응답하지 않습니다. 타이머는이 문제를 처리하는 고전적인 방법입니다. –

+0

이것은 숙제를위한 것이며 우리는 아직 타이머를 배웠습니다. 이것이 유일한 이유입니다. 다른 방법을 찾지 못하면 아프다 타이머를 사용해야합니다. – FJam