paintComponent生成太多的矩形

时间:2013-04-07 11:23:13

标签: java swing graphics2d paintcomponent

我遇到paintComponent的问题。我使用“while”循环绘制矩形。每个下一个矩形应该更小并旋转。它有效。但paintComponent执行两次,而不是我期望的一次。我该怎么办?

在那里你可以找到完整的代码:

Main.java:

 import java.awt.*;

    public class Main {


        public static void main(String[] args) {
            new Kalejdoskop(600, 600,    
                    5,         
                    Color.YELLOW,
                    Color.GREEN,  
                    1, 5);      
        }
    }

MyPanel.java:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Rectangle2D;

/**
 * Created with IntelliJ IDEA.
 * User: Hans92
 * Date: 07.04.13
 * Time: 01:34
 * To change this template use File | Settings | File Templates.
 */
public class MyPanel extends JPanel {
    int szerokoscOkna = Kalejdoskop.szerokoscOkna;
    int wysokoscOkna = Kalejdoskop.wysokoscOkna;
    double kat = 90;
    double wspolczynnik = kat * Kalejdoskop.stosunekWspolczynnika1 / Kalejdoskop.stosunekWspolczynnika2;

    public MyPanel() {
        setPreferredSize(new Dimension(szerokoscOkna, wysokoscOkna));
    }





    protected void paintComponent(Graphics g) {
        System.out.println(Kalejdoskop.kwadraty);

        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        int verticalCenter = this.getHeight() / 2;


        double rogKwadratu = verticalCenter - (szerokoscOkna / 2);
        double bok = szerokoscOkna;
        int i = 0;
        int jakiKolor = 0;


        Rectangle2D kwad = new Rectangle2D.Double(rogKwadratu, rogKwadratu, szerokoscOkna, szerokoscOkna);
        g2d.setPaint(Kalejdoskop.pierwszyKolor);
        g2d.fill(kwad);


        while (i < Kalejdoskop.kwadraty) {
            if (jakiKolor == 0) {
                bok = (bok * Math.tan(Math.toRadians(wspolczynnik))) / ((Math.sin(Math.toRadians(wspolczynnik))) * (1 + Math.tan(Math.toRadians(wspolczynnik))));
                rogKwadratu = verticalCenter - (bok / 2);


                g2d.rotate(Math.toRadians(wspolczynnik), szerokoscOkna / 2, szerokoscOkna / 2);
                kwad = new Rectangle2D.Double(rogKwadratu, rogKwadratu, bok, bok);


                g2d.setPaint(Kalejdoskop.drugiKolor);

                g2d.fill(kwad);


                jakiKolor = 1;
            }


            if (jakiKolor == 1) {
                bok = (bok * Math.tan(Math.toRadians(wspolczynnik))) / ((Math.sin(Math.toRadians(wspolczynnik))) * (1 + Math.tan(Math.toRadians(wspolczynnik))));
                rogKwadratu = verticalCenter - (bok / 2);


                g2d.rotate(Math.toRadians(wspolczynnik), szerokoscOkna / 2, szerokoscOkna / 2);
                kwad = new Rectangle2D.Double(rogKwadratu, rogKwadratu, bok, bok);


                g2d.setPaint(Kalejdoskop.pierwszyKolor);

                g2d.fill(kwad);


                jakiKolor = 0;
            }

            i++;
        }


    }

}

MyFrame.java:

import javax.swing.*;


/**
 * Created with IntelliJ IDEA.
 * User: Hans92
 * Date: 07.04.13
 * Time: 01:33
 * To change this template use File | Settings | File Templates.
 */
public class MyFrame extends JFrame {
    public MyFrame() {
        super("Kalejdoskop");
        JPanel panel = new MyPanel();

        add(panel);

        pack();


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

Kalejdoskop.java:

import javax.swing.*;
import java.awt.*;
import java.awt.EventQueue;
import java.awt.geom.Rectangle2D;

/**
 * Created with IntelliJ IDEA.
 * User: Hans92
 * Date: 06.04.13
 * Time: 20:52
 * To change this template use File | Settings | File Templates.
 */


class Kalejdoskop extends JPanel {
    static int szerokoscOkna = 0;
    static int wysokoscOkna = 0;
    static int kwadraty = 0;
    static Color pierwszyKolor = Color.RED;
    static Color drugiKolor = Color.YELLOW;
    static int stosunekWspolczynnika1 = 0;
    static int stosunekWspolczynnika2 = 0;


    public Kalejdoskop(int szerokosc, int wysokosc, int liczbaKwadratow, Color a, Color b, int stosunek1, int stosunek2) {

        szerokoscOkna = szerokosc;
        wysokoscOkna = wysokosc;
        kwadraty = liczbaKwadratow;
        pierwszyKolor = a;
        drugiKolor = b;
        stosunekWspolczynnika1 = stosunek1;
        stosunekWspolczynnika2 = stosunek2;



           jedziesz();



    }


    public static void jedziesz(){

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new MyFrame();
            }
        });

    }

}

1 个答案:

答案 0 :(得分:2)

你说:

  

我遇到了paintComponent的问题。我使用“while”循环绘制矩形。每个下一个矩形应该更小并旋转。它有效。但paintComponent执行2次,而不是我期望的一次。我该怎么办?

你应该什么也不做,

  1. 您无法直接控制paintComponent(...)的调用时间,时间或频率。您的代码可以假设它在GUI组件呈现时至少调用一次,然后如果您通过repaint()建议它可以调用,但是根据Java API,这不是保证它会被调用,特别是如果重新绘制“堆叠”。
  2. 您的paintComponent(...)方法中应该没有程序逻辑。
  3. 如果遵守此规定,您的代码应该不关心paintComponent(...)被调用两次或更多次。
  4. 换句话说,如果您的代码构造正确,这实际上不是问题。