2017-08-07 10 views
-1

私は8つの楕円がすべて同じ色に設定されています。秒後、最初の楕円が色を変えてくれることを望み、次にもう1つの楕円が最初の楕円を元の色に戻し、次に2番目の楕円の色を変えたい。私が円を描いたと私はスレッドを実装しようとしましたが、私はそれを実行していないと思う...毎秒楕円を塗ります

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Circle extends JPanel implements Runnable 
{ 

    Graphics g; 

    Thread t = new Thread(); 

    int[][] fillCircles = new int[8][4]; 


@Override 
public void paintComponent(Graphics g) 
{ 
    this.g = g; 
    super.paintComponent(this.g); 

    this.g.setColor(new java.awt.Color(237, 54, 26)); 

    this.g.drawOval(300, 50, 100, 100); 
    this.g.drawOval(450, 125, 100, 100); 
    this.g.drawOval(500, 250, 100, 100); 
    this.g.drawOval(425, 375, 100, 100); 
    this.g.drawOval(300, 400, 100, 100); 
    this.g.drawOval(175, 350, 100, 100); 
    this.g.drawOval(125, 225, 100, 100); 
    this.g.drawOval(175, 100, 100, 100); 

    this.g.fillOval(300, 50, 100, 100); 
    this.g.fillOval(450, 125, 100, 100); 
    this.g.fillOval(500, 250, 100, 100); 
    this.g.fillOval(425, 375, 100, 100); 
    this.g.fillOval(300, 400, 100, 100); 
    this.g.fillOval(175, 350, 100, 100); 
    this.g.fillOval(125, 225, 100, 100); 
    this.g.fillOval(175, 100, 100, 100); 

    fillCircles[0][0] = 300; 
    fillCircles[0][1] = 50; 
    fillCircles[0][2] = 100; 
    fillCircles[0][3] = 100; 

    fillCircles[1][0] = 450; 
    fillCircles[1][1] = 125; 
    fillCircles[1][2] = 100; 
    fillCircles[1][3] = 100; 

    fillCircles[2][0] = 500; 
    fillCircles[2][1] = 250; 
    fillCircles[2][2] = 100; 
    fillCircles[2][3] = 100; 

    fillCircles[3][0] = 425; 
    fillCircles[3][1] = 375; 
    fillCircles[3][2] = 100; 
    fillCircles[3][3] = 100; 

    fillCircles[4][0] = 300; 
    fillCircles[4][1] = 400; 
    fillCircles[4][2] = 100; 
    fillCircles[4][3] = 100; 

    fillCircles[5][0] = 175; 
    fillCircles[5][1] = 350; 
    fillCircles[5][2] = 100; 
    fillCircles[5][3] = 100; 

    fillCircles[6][0] = 125; 
    fillCircles[6][1] = 225; 
    fillCircles[6][2] = 100; 
    fillCircles[6][3] = 100; 

    fillCircles[7][0] = 175; 
    fillCircles[7][1] = 100; 
    fillCircles[7][2] = 100; 
    fillCircles[7][3] = 100; 


} 

Circle() { 
    t.start(); 
} 


public void run() { 

    int circle = 0; 

    try { 
     for (;;) { 

      Thread.sleep(1000); 

      if (circle > 0) { 
       this.g.setColor(new java.awt.Color(237, 54, 26)); 
       circle--; 
       this.g.fillOval(fillCircles[circle][0], fillCircles[circle][1], fillCircles[circle][2], fillCircles[circle][2]); 
       circle++; 
      } 
      this.g.setColor(Color.red); 
      this.g.fillOval(fillCircles[circle][0], fillCircles[circle][1], fillCircles[circle][2], fillCircles[circle][2]); 


      circle++; 

      if (circle == 8) { 
       circle = 0; 
      } 

     } 
    } catch (InterruptedException e) { 
     System.out.println ("Thread Interrupted"); 
    } 

} 


public static void main(String[] args) { 
    Circle c; 

    JFrame application = new JFrame(); 

    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    application.add(c=new Circle()); 
    application.setSize(1200, 900); 
    application.setVisible(true); 


} 

}

答えて

2

あなたはそれRunnableを与えることなくThreadをインスタンス化しているので、それはですあなたが意図しているものを実行していない。 CircleRunnableあるとrun()方法がそれであるため、

Thread t = new Thread(); 

Thread t = new Thread(this); 

これでなければなりません。 色の変化に関して、私はあなたに考えを与えるでしょう。 円を描くとき、​​毎秒colorChangeIndex

if(circleIndex == colorChangeIndex){ 
    // another color 
else 
//the default color 
colorChangeIndex++; (modulo number of cricles to reset it) 
+0

現在のサークルを確認してください。--->私は従いません。 – Yeezus

1

を変更し、別の変数に対する現在のサークル数/指数をチェックし、あなたのコードの基本的な構造は間違っています。ペイントはpaintComponent()メソッドでのみ行う必要があります。スレッド内のGraphicsオブジェクトは決して参照しないでください。

代わりに、「円」オブジェクトのArrayListを保持することをお勧めします。このカスタムオブジェクトには、ペイントされる円とその色が含まれます。次にpaintComponent()メソッドで、ArrayListを繰り返し処理し、ArrayList内のすべての円をペイントします。 Custom Painting ApprochesにあるDrawOnComponentの例をご覧ください。第二の後

は、私が最初に楕円形の色を変更し、その後、他の第2の後に、私は最初の楕円形が元の色に戻った後、第2の楕円の色を変更したいたいです。

ここで、Swing Timerを使用して絵をアニメーション化する必要があります。タイマーが起動すると、適切な円の色をリセットして、パネルを再描画します。

+0

ありがとうございます:) !!!! – Yeezus