2017-01-15 12 views
-1

何も表示されません。 私は移動しようとしました。ランダムなrand =新しいRandom()をループの外側に移動しましたが、まだ動作しません。 フレームが閉じても終了しません。Sierpinski Triangle:表示しない

public class myMain { 

    public static void main(String args[]) { 
     Frame frame = new Frame(); 
    } 
} 


public class Frame extends JFrame { 

    public Frame(){ 
     super("Fancy Triangle"); 
     setSize(1024, 768); 

     myPanel panel = new myPanel(); 
     add(panel); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

} 

public class myPanel extends JPanel { 

    int x1 = 512; 

    int y1 = 109; 

    int x2 = 146; 
    int y2 = 654; 

    int x3 = 876; 
    int y3 = 654; 

    int x = 512; 
    int y = 382; 

    int dx, dy; 

    Random rand; 

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

     for (int i = 0; i < 50000; i++) { 

      g.drawLine(x, y, x, y); 
      try { 
       Thread.sleep(300); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      rand = new Random(); 
      int random = 1 + rand.nextInt(3); 

      if (random == 1) { 
       dx = x - x1; 
       dy = y - y1; 

      } else if (random == 2) { 
       dx = x - x2; 
       dy = y - y2; 

      } else { 
       dx = x - x3; 
       dy = y - y3; 

      } 

      x = x - (dx/2); 
      y = y - (dy/2); 

     } 
    } 
} 
+0

なぜ 'paintComponent'の内部で' Thread.sleep'を呼びますか? – khelwood

+0

無関係:Java命名規則についてお読みください。クラスはCamelCaseに行きますが、常に大文字で始まります。このような規則に違反すると、他人が入力を読みにくくなります。 – GhostCat

答えて

2

この:

Thread.sleep(300); 

は、あなたがそれをするつもり何をしていません。私はあなたが遅れをもって描こうとしていると思いますが、それはそうではありません。代わりに、Swingイベントスレッドでsleepを呼び出すと、スレッドはアプリケーションの描画やユーザーとの対話など、必要な処理を実行できないため、アプリケーション全体がスリープ状態になります。さらに悪いことに、ペインティング方法の中でこれを実行しています。これは、スイングアプリケーションの感知された応答性がペイントスピードによって決定されることが多いため、非常に高速である必要があるメソッドです。

代わりにスイングタイマー(Swing Timer tutorial)を使用して、クラスのフィールドの状態を変更し、repaintを呼び出します。 paintComponentは、変更されたフィールドを使用して、描画対象と場所を決定します。 Sierpinskiの三角形はドットで構成されているので、ArrayList<Point>を作成し、描画メソッド内でforループを取り除き、Swing Timerを使用してthis forループを置き換えることを検討してください。 TimerのActionListener内で、セミランダムな点をArrayListに配置し、repaintを呼び出します。それから、paintComponent内で、ArrayListを繰り返し、その中に含まれる各点を描画します。

また、スイングタイマーのBufferedImageにポイントを描画し、paintComponentにg.drawImage(...)メソッド呼び出しを使用してBufferedImageを表示させることもできます。これはおそらくより効率的です。

関連する問題