Hallo,
Ich habe das Problem, dass ich relativ frequentiert Polygone auf meinem Fenster zeichnen möchte.
Das Problem ist, dass es flackert. Ich weiß, dass das Problem schon oft dagewesen ist und es verschiedene Ansätze gibt. Ich habe jetzt diverse ausprobiert, allerdings führte keiner zum Erfolg.
Mein letzter Ansatz bestand daraus, eine von JPanel abgeleitete Klasse zu erzeugen und das Image, welches ich von außerhalb bemale in der PaintComponent Methode zu zeichnen.
Hier mal ein wenig Code:
Vielen Dank schonmal,
mfg
Ich habe das Problem, dass ich relativ frequentiert Polygone auf meinem Fenster zeichnen möchte.
Das Problem ist, dass es flackert. Ich weiß, dass das Problem schon oft dagewesen ist und es verschiedene Ansätze gibt. Ich habe jetzt diverse ausprobiert, allerdings führte keiner zum Erfolg.
Mein letzter Ansatz bestand daraus, eine von JPanel abgeleitete Klasse zu erzeugen und das Image, welches ich von außerhalb bemale in der PaintComponent Methode zu zeichnen.
Hier mal ein wenig Code:
Code:
import java.awt.Graphics;
import javax.swing.*;
import java.awt.Image;
class DrawPanel extends JPanel {
private Image drawImage;
public DrawPanel(Image drawImage) {
this.drawImage = drawImage;
setDoubleBuffered(true);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(drawImage, 0, 0, this);
}
}
Code:
import java.awt.*;
import javax.swing.*;
import java.awt.Image;
public class PolygonTest extends JFrame {
Polygon p = new Polygon();
Graphics offscreenGraphics;
Image offscreenImage;
DrawPanel panel;
public PolygonTest() {
super("Polygon Test");
setSize(640, 480);
setVisible(true);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((d.width - getSize().width) / 2, (d.height - getSize().height) / 2);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Offscreen painting (auf dieses Bild wird gezeichnet)
offscreenImage = createImage(640, 480);
offscreenGraphics = offscreenImage.getGraphics();
// Components (panel bekommt das Bild zum Zeichnen)
panel = new DrawPanel(offscreenImage);
add(panel);
// Polygon welches gezeichnet werden soll
p.position = new Vector2d(200.0, 200.0);
p.addVertex(new Vector2d(100.0, 50.0));
p.addVertex(new Vector2d(100.0, -50.0));
p.addVertex(new Vector2d(-100.0, -50.0));
p.addVertex(new Vector2d(-100.0, 50.0));
}
// Mainloop - Hier geht die Action
public void mainloop() {
double a = 0.0;
while (true) {
// Polygon drehen
p.angle = Math.toRadians(a % 360);
a += 0.01;
// Zeichnen
offscreenGraphics.clearRect(0, 0, 640, 480); // braucht tierisch lange
p.draw((Graphics2D)offscreenGraphics);
// neu zeichnen
repaint();
}
}
public static void main(String[] args) {
PolygonTest w = new PolygonTest();
w.mainloop();
}
}
Vielen Dank schonmal,
mfg