2011-01-26 112 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