Doublebuffering korrekt anwenden

bluna

Mitglied
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:
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 );
	}
	

}
 

Network

Top Contributor
Ein JPanel führt automatisch DoubleBuffering aus. Mit anderen Worten, wenn du die paintComponent(Graphics g)-Methode eines JPanels überschreibst und darin zeichnest, wird automatisch ohne dein zutun DoubleBuffering angewendet.
 

bluna

Mitglied
danke .. das hat schonmal geholfen und scheint auch wesentlich performanter zu sein.

Bei sehr schnellen Mausbewegungen hat die Linie lücken (man sieht also eine gestrichelte linie).

Noch ein kleiner Tipp, wie ich das lösen kann ? :) Brauch man da Threads?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Flackern trotz DoubleBuffering AWT, Swing, JavaFX & SWT 8
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
T 2D-Grafik Slideshow (DoubleBuffering und Image transformieren/bewegen) AWT, Swing, JavaFX & SWT 6
Dreamy Swing Mehrfaches DoubleBuffering in Swing? AWT, Swing, JavaFX & SWT 10
R noch ein DoubleBuffering Noob AWT, Swing, JavaFX & SWT 10
W DoubleBuffering nutzung? AWT, Swing, JavaFX & SWT 5
J Manual-DoubleBuffering im JPanel AWT, Swing, JavaFX & SWT 19
M zooming-Framework und doubleBuffering AWT, Swing, JavaFX & SWT 6
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
F JavaFX (Tree)TableView korrekt drucken AWT, Swing, JavaFX & SWT 1
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
J Event Handling Button "enablen" wenn Eingaben in Textfeldern korrekt sind AWT, Swing, JavaFX & SWT 1
R Swing Programm läuft nur beim Debuggen korrekt ab AWT, Swing, JavaFX & SWT 4
L JavaFX Node wird nicht korrekt angezeigt AWT, Swing, JavaFX & SWT 7
D Umlaute bei Druck nicht korrekt AWT, Swing, JavaFX & SWT 4
S Warum wird dieses Rechteck nicht korrekt gemalt? AWT, Swing, JavaFX & SWT 7
J AWT choice mit viel Auswahl aktualisiert sich nicht korrekt beim scrollen?! AWT, Swing, JavaFX & SWT 3
B Swing Umlaute nicht korrekt dargestellt AWT, Swing, JavaFX & SWT 6
A Swing GridBagLayout - constraints.anchor scheint nicht korrekt zu funktionieren? AWT, Swing, JavaFX & SWT 7
W Grafik von JFrame korrekt speichern AWT, Swing, JavaFX & SWT 7
C AWT Zaehler wird nicht korrekt angezeigt AWT, Swing, JavaFX & SWT 2
N Swing Nimbus arbeitet nicht korrekt korrekt bei setEnabled() für JMenuItem AWT, Swing, JavaFX & SWT 2
B 2D-Grafik Fisch bewegt sich nicht korrekt AWT, Swing, JavaFX & SWT 3
S Animation korrekt darstellen AWT, Swing, JavaFX & SWT 8
0 AWT Graphics2D.drawImage() funktioniert nicht mehr korrekt mit Core i7 AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
N JListenanzeige nicht korrekt AWT, Swing, JavaFX & SWT 2
N JFormattedTextField erst Verlassen, wenn Eingabe korrekt AWT, Swing, JavaFX & SWT 6
C Swing-Oberfläche wird auf einiges PCs nicht korrekt dargeste AWT, Swing, JavaFX & SWT 19
B JComboBox Flatter bzw wird nicht korrekt angezeigt? AWT, Swing, JavaFX & SWT 3
N JTable korrekt anzeigen AWT, Swing, JavaFX & SWT 2
I Swing-Oberfläche wird nicht korrekt gezeichnet AWT, Swing, JavaFX & SWT 6
M paint() zeichnet nicht korrekt AWT, Swing, JavaFX & SWT 2
D Welche Layouts anwenden? AWT, Swing, JavaFX & SWT 2
W Swing SwingUtilities.invokeLater wie konsequent anwenden? AWT, Swing, JavaFX & SWT 3
S mehere Affine Transformationen auf JPanel anwenden AWT, Swing, JavaFX & SWT 5
aze Layout auf Teil eines Panels anwenden AWT, Swing, JavaFX & SWT 5
B Swing Passendes Layout finden: Welche Klassen muss ich wie anwenden? AWT, Swing, JavaFX & SWT 8
P Für den Inhalt einer Zelle (aus Tabelle) STRG-C anwenden AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben