2013-05-06 2 views
1

Я пытаюсь сделать стоп-сигнал, который выполняет определенные задачи после нажатия кнопки. То, что должен делать этот стоп-сигнал, - это переход от зеленого к желтому через 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-апплеты] (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. Если вам необходимо поддерживать более старые API на основе AWT, см. [Смешивание тяжеловесных и легких компонентов] (http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html). –

ответ

1

Вы можете установить таймер при нажатии кнопки в течение 10 секунд. Когда это время истечет, измените цвет на желтый с помощью обратного вызова. Это намного лучше, чем иметь дело с исключениями, потому что они должны быть в исключительных обстоятельствах.

См. this thread о том, как установить таймер для последующего использования.

Редактировать

Плакат не хочет использовать таймеры. Один из способов - сохранить время, когда кнопка нажата в переменной, затем получить доступ к этой переменной и сравнить ее с текущим временем внутри цикла while метода run.

+0

Есть ли способ сделать это без таймера? – FJam

+0

Есть ли конкретная причина, по которой вы не хотите использовать таймеры? Если вы не используете таймеры, то в итоге вы будете спать в потоке, что сделает GUI невосприимчивым. Таймеры - это классический способ решения этой проблемы. –

+0

Это для домашней работы, и мы еще не научились таймерам, это единственная причина. Если я не найду другого способа, мне просто нужно использовать таймер – FJam