2012-11-23 56 views
0

我編寫了繪製輪子(6段圓圈)和每段不同顏色的程序。和動畫輪..停止無限循環paint()方法?用paint()添加JButton?

這裏是代碼:

public class ExamWheel extends JFrame implements ActionListener{ 
     JButton b_start = new JButton("Start"); 
     JButton b_stop = new JButton("Stop"); 
     Thread th; 
     Boolean doDraw = true; 

     public ExamWheel(){ 
      setSize(400,400); 
      setVisible(true); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setLocationRelativeTo(null); 
      setTitle("Wheel.."); 
      //add(b_start); 
      this.setLayout (new FlowLayout()); 
      this.add(b_stop); 
      b_start.addActionListener(this); 
     } 

     public void actionPerformed(ActionEvent e) { 
      if(e.getSource()==b_start) 
       doDraw=true; 
     } 

     public void paint(Graphics graphics) { 
     if (doDraw){ 
      super.paint(graphics); 
      Graphics2D g = (Graphics2D) graphics; 
      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

      try{ 
      // draw the circle 
      for(int i=0; ; i=i+1){ 
       g.setColor(Color.CYAN); 
       g.fillArc(50, 50, 300, 300, i+0, 60); 
       th.sleep(1); 
       g.setColor(Color.red); 
       g.fillArc(50, 50, 300, 300, i+60, 60); 
       th.sleep(1); 
       g.setColor(Color.green); 
       g.fillArc(50, 50, 300, 300, i+120, 60); 
       th.sleep(1); 
       g.setColor(Color.blue); 
       g.fillArc(50, 50, 300, 300, i+180, 60); 
       th.sleep(1); 
       g.setColor(Color.gray); 
       g.fillArc(50, 50, 300, 300, i+240, 60); 
       th.sleep(1); 
       g.setColor(Color.pink); 
       g.fillArc(50, 50, 300, 300, i+300, 60); 
       th.sleep(1); 
      } 
      } 
      catch(InterruptedException e){ 
       Thread.currentThread().interrupt(); 
      } 
     } 
     } 

     public static void main(String[] args) { 
      ExamWheel f = new ExamWheel(); 
     } 

    } 

問題:它是無限循環,我不能停止或關閉框架。

,所以我不得不想法:

我創建布爾變量(doDraw)與真正的價值,並添加一個JButton,當單擊該按鈕的變量將變更爲假,並在paint()方法我會如果第一次繪製條件()

問題:我不能用paint()添加JButton到Frame,所以我該怎麼做?

注意:我試着使用paintComponent(),但循環(for with thread)不起作用。

IT解決 感謝皮特Kirham

我加入定時器和的paintComponent()

public class ExamWheel extends JPanel implements ActionListener { 
    int i=0; 
    Timer tm = new Timer(10, this); 
    public void paintComponent(Graphics graphics) { 
     super.paintComponent(graphics); 
     Graphics2D g = (Graphics2D) graphics; 
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     g.setColor(Color.CYAN); 
     g.fillArc(50, 50, 300, 300, i+0, 60); 
     g.setColor(Color.red); 
     g.fillArc(50, 50, 300, 300, i+60, 60); 
     g.setColor(Color.green); 
     g.fillArc(50, 50, 300, 300, i+120, 60); 
     g.setColor(Color.blue); 
     g.fillArc(50, 50, 300, 300, i+180, 60); 
     g.setColor(Color.gray); 
     g.fillArc(50, 50, 300, 300, i+240, 60); 
     g.setColor(Color.pink); 
     g.fillArc(50, 50, 300, 300, i+300, 60); 
     tm.start(); 
    } 
    public void actionPerformed(ActionEvent e) { 
     i++; 
     repaint(); 
    } 
    public static void main(String[] args) { 
     ExamWheel wh = new ExamWheel(); 
     JFrame jf = new JFrame(); 
     jf.setSize(500,500); 
     jf.setResizable(false); 
     jf.setVisible(true); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setLocationRelativeTo(null); 
     jf.setTitle("Wheel.."); 
     jf.add(wh); 
    } 
+0

爲什麼你在paint()中有無限循環,gui會在一定的時間間隔內調用paint()。你永遠不會分配'th'值。睡一個你應該調用'Thread.sleep();'的線程。 –

回答