2011-01-26 77 views
2

這是困擾我,我的代碼工作並運行,但是當我去運行它時,它似乎循環了兩次循環,任何人都可以用我的邏輯來幫助我嗎?謝謝...paintComponent正在執行兩次

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()被調用兩次,因爲顯示需要爲每個調用重新繪製。

嘗試取出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); 
} 

這應該現在正常工作。

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

,你希望兩個元素結合在一起,而不是被這樣寫的每一成對比較多數循環:

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

(注第二個循環中的j = i)。

這也可以讓您刪除i != j測試。 :)

編輯:糟糕; j = i意味着您仍然需要i != j測試 - 如果您使用j = i+1那麼您可以刪除i != j測試。嘆。 :)

+0

嗯,是的,這是真的,謝謝你,但由於某種原因,我的變量被重置爲0,它又重新在我的代碼上重新行走。所以它畫錯了...... – novar 2011-01-26 02:42:07

+0

真的嗎?然後在兩個循環中加入一些`System.out.println(「i」+ i);``````````````` – sarnold 2011-01-26 02:45:04