Moin moin,
ich bin gerade am rumexperimentieren was das Zeichnen mit Swing angeht - und damit ich nicht andauernd solch ein unschönes "Flackern" habe, habe ich mir kurz etwas zum Doublebuffering angeschaut. Ich stelle mal zwei Lösungswege rein, die auf den ersten Blick beide für mich logisch erscheinen, allerdings funktioniert nur der Zweite.
Ziel: Eine Linie zeichnen, die dem Mauszeiger folgt (Für jede Koordinate, über die der Mauszeiger fährt einen Punkt zeichnen)
Problem: Es wird nichts oder nur ein Punkt gezeichnet.
Code:
Meine Vorstellung hinter diesem Code: Ich bewege die Maus -> mouseMoved wird aufgerufen -> ich merke mir das aktuelle Bild und hole mir dazu das Graphicsobjekt -> Ich rufe offPaint auf mit den aktuellen Koordinaten und zeichne darauf einen neuen Punkt - > repaint() zeichnet das fertiggestellte Bild
--------------
Ich war schon etwas weiter. Führt man den folgenden Code aus, kann man bereits eine solche Linie ohne "Flackern" zeichnen, allerdings birgt diese Lücken, wenn man den Zeiger zu schnell bewegt (Aber das soll vorerst nicht interessieren).
Ich weiß, über Performance sollte man sich erst Gedanken machen, wenn es Probleme gibt, jedoch denke ich mir einfach "Warum bei jeder kleinen Mausbewegung das ganze Bild anhand von koordinaten neu Zeichnen, wenn ich mir einfach das vorherige Bild speichern kann und einen einzigen Punkt hinzufügen könnte?"
ich bin gerade am rumexperimentieren was das Zeichnen mit Swing angeht - und damit ich nicht andauernd solch ein unschönes "Flackern" habe, habe ich mir kurz etwas zum Doublebuffering angeschaut. Ich stelle mal zwei Lösungswege rein, die auf den ersten Blick beide für mich logisch erscheinen, allerdings funktioniert nur der Zweite.
Ziel: Eine Linie zeichnen, die dem Mauszeiger folgt (Für jede Koordinate, über die der Mauszeiger fährt einen Punkt zeichnen)
Problem: Es wird nichts oder nur ein Punkt gezeichnet.
Code:
Java:
package particle;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
public class ParticleFrame extends JFrame {
Image offscreenImage;
Graphics offscreenGraphics;
public ParticleFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
getContentPane().setBackground(Color.WHITE);
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent me) {
offscreenImage = createImage( 800, 600 );
offscreenGraphics = offscreenImage.getGraphics();
offPaint(me.getX(), me.getY());
repaint();
}
@Override
public void mouseDragged(MouseEvent arg0) {
}
});
setVisible(true);
}
private void offPaint(int x, int y) {
offscreenGraphics.drawLine(x, y, x, y);
}
public void paint( Graphics g )
{
if ( offscreenImage != null ){
g.drawImage( offscreenImage, 0, 0, this );
}
}
}
Meine Vorstellung hinter diesem Code: Ich bewege die Maus -> mouseMoved wird aufgerufen -> ich merke mir das aktuelle Bild und hole mir dazu das Graphicsobjekt -> Ich rufe offPaint auf mit den aktuellen Koordinaten und zeichne darauf einen neuen Punkt - > repaint() zeichnet das fertiggestellte Bild
--------------
Ich war schon etwas weiter. Führt man den folgenden Code aus, kann man bereits eine solche Linie ohne "Flackern" zeichnen, allerdings birgt diese Lücken, wenn man den Zeiger zu schnell bewegt (Aber das soll vorerst nicht interessieren).
Ich weiß, über Performance sollte man sich erst Gedanken machen, wenn es Probleme gibt, jedoch denke ich mir einfach "Warum bei jeder kleinen Mausbewegung das ganze Bild anhand von koordinaten neu Zeichnen, wenn ich mir einfach das vorherige Bild speichern kann und einen einzigen Punkt hinzufügen könnte?"
Java:
package particle;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import javax.swing.JFrame;
public class ParticleFrame extends JFrame {
ArrayList<Punkt> punkte = new ArrayList<Punkt>();
Image offscreenImage;
Graphics offscreenGraphics;
public ParticleFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent me) {
offscreenImage = createImage( 800, 600 );
offscreenGraphics = offscreenImage.getGraphics();
punkte.add(new Punkt(me.getX(), me.getY()));
offPaint();
repaint();
}
@Override
public void mouseDragged(MouseEvent arg0) {
}
});
setVisible(true);
}
private void offPaint() {
for (Punkt p : punkte){
int x = p.getX();
int y = p.getY();
offscreenGraphics.drawLine(x, y, x, y);
}
}
public void paint( Graphics g )
{
if ( offscreenImage != null )
g.drawImage( offscreenImage, 0, 0, this );
}
}