2016-03-29 108 views
-1

我正在嘗試使用線程建立交通燈信號量,但我無法得到正確的信號量。應該顯示紅色,黃色,綠色和顏色之間的中斷。任何幫助深表感謝。 謝謝。 這裏是我的代碼...使用線程的交通燈信號量

import java.awt.BorderLayout; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class StopTheLights extends JFrame implements ActionListener { 

    JButton start; 
    JButton stop; 
     JPanel panel; 
    Boolean flag; 

    public StopTheLights(String title) { 
       Container c = getContentPane(); 

     start = new JButton("Start"); 
     stop = new JButton("Stop"); 

     start.addActionListener(this); 
     stop.addActionListener(this); 

     panel= new JPanel(); 
     panel.add(start); 
     panel.add(stop); 

     c.add(panel, BorderLayout.SOUTH); 

     setSize(300, 450);      
     setVisible(true); 
     setLocation(200,200); 

    } 

    public void paint(Graphics g){ 
     super.paint(g); 
     g.setColor(Color.black); 
     g.drawOval(50,50,100,100); 
     g.drawOval(50,155,100,100); 
     g.drawOval(50,260,100,100); 
    } 

     public void actionPerformed(ActionEvent e){ 
     if(e.getSource() == start){ 
      flag = true; 
      new ThreadExtend(this).start(); 
     }else{ 
      flag = false; 
     } 
    } 
    public class ThreadExtend extends Thread { 
     Graphics g; 
     JFrame frame; 

     public ThreadExtend(JFrame frame){ 
      this.frame = frame; 
      g = frame.getGraphics(); 
     } 
     public void run(){ 
      while(flag) { 
       try{ 
        paintRed(g); 
        if(!flag) { 
         break; 
        } 
        Thread.sleep(1000); 
        paintAmber(g); 
        if(!flag) { 
        break; 
        } 
        Thread.sleep(1000); 
        paintGreen(g); 
        if(!flag){ 
         break; 
        } 


       }catch(InterruptedException e) { 

       } 
      } 

     } 

    } 
    public void paintRed(Graphics g){ 
     g.setColor(new Color(255,0,0)); 
     g.fillOval(52, 52, 96, 96); 
      g.fillOval(52, 52, 96, 96); 
     g.fillOval(52, 262, 96, 96); 

    } 
    public void paintAmber(Graphics g){ 
     g.setColor(new Color(250,170,0)); 
     g.fillOval(52, 157, 96, 96); 
      g.fillOval(52, 52, 96, 96); 
     g.fillOval(52, 262, 96, 96); 

    } 
    public void paintGreen(Graphics g){ 
     g.setColor(new Color(0,250,0)); 
     g.fillOval(52, 262, 96, 96); 
      g.fillOval(52, 52, 96, 96); 
     g.fillOval(52, 157, 96, 96); 

    } 
     public static void main(String[] args) { 
     new StopTheLights(); 

    } 


} 
+1

是什麼問題? – jhamon

回答

1

這裏有幾個問題。

  • 您的主題在顯示綠燈後不會等待。
  • 您繪製所有方法調用中的所有燈光,這是不需要的。
  • 當「關閉」其他燈時,您不會更改顏色。

我沒有在你的代碼中的一些固定的,現在它的工作原理:

import java.awt.BorderLayout; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class StopTheLights extends JFrame implements ActionListener { 

    JButton start; 
    JButton stop; 
    Boolean i; 
    //create constructor method 
    public StopTheLights(String title) { 
      // create Start button 
      start = new JButton("Start"); 
      //create Stop button 
      stop = new JButton("Stop"); 
      //add Action listeners 
      start.addActionListener(this); 
      stop.addActionListener(this); 
      //create new Button Panel 
      JPanel buttonPanel = new JPanel(); 
      buttonPanel.add(start); 
      buttonPanel.add(stop); 
      Container c = getContentPane(); 
      c.add(buttonPanel, BorderLayout.SOUTH); 

      setSize(200, 425); 
      setLocationRelativeTo(null); 
      setResizable(false); 
      setVisible(true); 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    public void paint(Graphics g){ 
      super.paint(g); 
      g.setColor(Color.black); 
      g.fillOval(50,50,100,100); 
      g.fillOval(50,155,100,100); 
      g.fillOval(50,260,100,100); 
    } 

    public static void main(String[] args) { 
      new StopTheLights("Stop The Lights"); 

    } 
    public void actionPerformed(ActionEvent e){ 
      if(e.getSource() == start){ 
        i = true; 
        new ThreadExtend(this).start(); 
      }else{ 
        i = false; 
      } 
    } 
    public class ThreadExtend extends Thread { 
      Graphics g; 
      JFrame frame; 

      public ThreadExtend(JFrame frame){ 
        this.frame = frame; 
        g = frame.getGraphics(); 
      } 
      public void run(){ 
        while(i) { 
          try{ 
            red(g); 
            if(!i) { 
              break; 
            } 
            Thread.sleep(1000); 
            amber(g); 
            if(!i) { 
              break; 
            } 
            Thread.sleep(1000); 
            green(g); 
            if(!i){ 
              break; 
            } 
            Thread.sleep(1000); 


          }catch(InterruptedException e) { 
             e.printStackTrace(); 
         } 
        } 
      } 

    } 
    public void red(Graphics g){ 
      g.setColor(Color.black); 
      g.fillOval(52, 262, 96, 96); 
      g.setColor(new Color(255,0,0)); 
      g.fillOval(52, 52, 96, 96); 
    } 
    public void amber(Graphics g){ 
      g.setColor(Color.black); 
      g.fillOval(52, 52, 96, 96); 
      g.setColor(new Color(250,170,0)); 
      g.fillOval(52, 157, 96, 96); 
    } 
    public void green(Graphics g){ 
      g.setColor(Color.black); 
      g.fillOval(52, 157, 96, 96); 
      g.setColor(new Color(0,250,0)); 
      g.fillOval(52, 262, 96, 96); 
    } 

} 
+0

謝謝。你是對的。它工作正常。 – danielG