2011-01-26 8 views
2

これは私の悩みです。私のコードが動作して実行されますが、実行すると、forループが2回繰り返されているようです。paintComponentが2回実行されています

 for(int i = 0; i < radius.length; i++) 
     { 
      for (int j = i; j < radius.length; j++) 
      { 

(注:2つの要素のすべてのペアを比較したいほとんどのループは、代わりにこのように書かれているおかげで...

package pkgcirc; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.*; 

/* 
* Notes: 
* Draw 20 circles 
* radius/location (x/y/r) all random 
* if (circle) is between radii pt (step thru loop) of all values, if its within , 
* draw it cyan if it overlaps, else black 
* 
*/ 
public class Main extends JPanel { 
    int[] radius = new int [3]; 
    int[] xArray = new int [3]; 
    int[] yArray = new int [3]; 

    public Main() 
    {  
     Random g = new Random(); 
     setPreferredSize (new Dimension(300, 200)); 
     for(int i = 0; i < radius.length; i++) 
     { 
      radius[i] = g.nextInt(50)+1; 
      xArray[i] = g.nextInt(250)+1; 
      yArray[i] = g.nextInt(150)+1; 
     } 
    } 

    public void paintComponent(Graphics page) 
    { 
     super.paintComponent(page); 
     for(int i = 0; i < radius.length; i++) 
     { 
      for (int j = 0; j < radius.length; j++) 
      { 
       int xpoint1 = xArray[i]+radius[i]; 
       int ypoint1 = yArray[i]+radius[i]; 
       int xpoint2 = xArray[j]+radius[j]; 
       int ypoint2 = yArray[j]+radius[j]; 
       int radius1 = radius[i]; 
       int radius2 = radius[j]; 
       boolean Collide = circlesCollide(xpoint1, ypoint1, radius1, radius2, xpoint2, ypoint2); 

       if (i != j && Collide == false) 
       { 
        page.setColor(Color.cyan); 
        page.fillOval(xArray[i] ,yArray[i], radius[i], radius[i]); 
        System.out.println("false"); 
       } 
       else{ 
        System.out.println("true"); 
        page.setColor(Color.black); 
        page.drawOval(xArray[j] ,yArray[j], radius[j], radius[j]); 
       } 
      } 
      System.out.println("BREAK");  
     } 
    } 

    public boolean circlesCollide(double x1, double y1, double r1, double x2, double y2, double r2){ 
     return (distance(x1, y1, x2, y2) <= (r1 + r2)); 
    } 

    public double distance(double x1, double y1, double x2, double y2) { 
     return Math.sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))); 
    }  

    public static void main (String[] args) 
    { 
     JFrame frame = new JFrame ("Circles"); 
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 

     frame.getContentPane().add (new Main()); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

答えて

5

setPreferredSize()pack()を呼び出すと、呼び出しごとに表示を再描画する必要があるため、paintComponent()が2回呼び出されます。

pack()を削除してみて、このように、下に設定サイズを移動: -

public Main() { 
    Random g = new Random(); 

    //setPreferredSize(...); // commented this line 

    for (int i = 0; i < radius.length; i++) { 
     radius[i] = g.nextInt(50) + 1; 
     xArray[i] = g.nextInt(250) + 1; 
     yArray[i] = g.nextInt(150) + 1; 
    } 
} 

public void paintComponent(Graphics page) { 
     ... 
} 

public static void main(String[] args) { 
    JFrame frame = new JFrame("Circles"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    frame.setSize(300, 200); // added this line 

    frame.getContentPane().add(new Main()); 

    // frame.pack(); // commented this line 

    frame.setVisible(true); 
} 

これは正しく動作するはずです。

+0

ためcripesああ:)背中とupvote来て21時間で私を思い出させます。 :) – sarnold

+0

うーん、それはまだ2回、私は私の頭髪を引っ張っている男:( – novar

+0

@novar:それはあなたのpaintComponent()を2回呼び出すことはありません:paintComponent()のすべてのコードをコメントし、私はあなたのコードがここで走っていたので、私はそれを知っています:) – limc

1
 for(int i = 0; i < radius.length; i++) 
     { 
      for (int j = 0; j < radius.length; j++) 
      { 

第2ループのj = i

これにより、i != jテストを削除することもできます。 :)

EDITj = iの場合はまだi != jテストが必要です。j = i+1を使用した場合は、i != jテストを削除できます。一口。 :)

+0

本当にありがとうございます。何らかの理由で私の変数が0にリセットされていて、私のコードを再び見ています。だからそれは間違っている... – novar

+0

ああ本当ですか?次に、両方のループで 'System.out.println(" i "+ i);の一握りの要素を投げて、あなたがそれをキャッチできないかどうかを確認します。 – sarnold

+0

私1ST 0 I 2ND 0 I 2ND 0 I 2ND 0 I 1ST 1 I 2ND 1 I 2ND 1 I 1ST 2 I 2ND 2 私は1 0 I 2ND 0 iについて2ND 0 私2ND 0 私1STは1 I 2ND 1 I 2ND 1 I 1STのための2 I 2ND 2 – novar

関連する問題