Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
539 views
in Technique[技术] by (71.8m points)

java - paintComponent is executing twice

This is bothering me, my code works and runs but when I went to run it, it seems to be looping my for loops twice, can anyone help me with my logic? Thanks...

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);
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Calling setPreferredSize() and pack() will cause paintComponent() to be called twice because the display needs to be redrawn for each call.

Try removing pack() and move set size to the bottom, like this:-

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);
}

This should work properly now.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...