-1

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

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

主.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();
            }
        });

    }

}
4

1 回答 1

2

你说:

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

你不应该做任何事,因为

  1. 您无法直接控制何时、是否或多久paintComponent(...)调用一次。您的代码可以假定它在 GUI 组件呈现时至少被调用一次,然后如果您通过 建议它可能repaint()会调用它,但是根据 Java API,这并不能保证它会被调用,特别是如果重绘是“堆积”。
  2. 您的paintComponent(...)方法中应该没有程序逻辑。
  3. 如果遵守这一点,您的代码不应该真正关心是否paintComponent(...)被调用两次或更多。

换句话说,如果你的代码构造正确,这真的不是问题。

于 2013-04-07T12:10:36.987 回答