gpt4 book ai didi

java - PaintComponent 执行了两次

转载 作者:行者123 更新时间:2023-11-30 05:58:06 29 4
gpt4 key购买 nike

这让我很困扰,我的代码可以工作并运行,但是当我运行它时,它似乎循环了两次 for 循环,任何人都可以帮助我解决我的逻辑吗?谢谢...

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

最佳答案

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

现在应该可以正常工作了。

关于java - PaintComponent 执行了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4800885/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com