我有一个问题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();
}
});
}
}