【问题标题】:paintComponent is executing twicepaintComponent 正在执行两次
【发布时间】:2011-06-15 14:42:01
【问题描述】:

这让我很困扰,我的代码可以运行,但是当我去运行它时,它似乎循环了我的 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);
    }
}

【问题讨论】:

    标签: java loops for-loop


    【解决方案1】:

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

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

    【讨论】:

    • 哦 cripes :) 提醒我在 21 小时后回来投票。 :)
    • 嗯,它还在画两次,伙计,我正在拔头发:(
    • @novar:它不会调用您的 paintComponent() 两次。在paintComponent() 中注释所有代码并放置一个sysout,您会看到它只被调用了一次。我知道,因为我有你的代码在这里运行。 :)
    • @sarnold:别担心。我自己也遇到过几次 30 票限制的问题。 :)
    • 我的循环是否有问题,我一直在遍历它们并尝试不同的东西,但似乎两次打印出相同的行,true true false BREAK true false BREAK true BREAK REPEAT STARTS HERE true真假 BREAK 真假 BREAK 真 BREAK
    【解决方案2】:
           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 测试。叹。 :)

    【讨论】:

    • 嗯,是的,这是真的,谢谢,但由于某种原因,我的 i 变量被重置为 0,它再次重新运行我的代码。所以画错了……
    • 哦,真的吗?然后在两个循环中加入少量System.out.println("i " + i);,看看你是否无法在行动中抓住它。
    • i 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 i 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
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多