Rectangle flackert

hiok

Mitglied
Hallo, ich bin gerade dabei ein Rechteck zu realisieren, welches ich mit Pfeiltasten herumfahren lassen kann. Das Ganze habe ich nun im Fullscreen erstellt und das einzigste Problem, das sich nun auftut ist, dass das Rectangle etwas flackert, also dass es nicht immer komplett zu sehen ist (also würde ein Bild von oben nach unten durchlaufen).

Folgendes ist mein bisheriger Quellcode:

Java:
public Main() {

	// ...

	addKeyListener(new KeyHandler());
        
	while(true) {  
		setNewPos();
		repaint();
        	
		try {
			Thread.sleep(15);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

public void paint(Graphics g) {
	super.paint(g);
	g.setColor(Color.RED);
	g.fillRect(pPosX, pPosY, 50, 50);
}

Zur Berechnung von neuen Positionen addiere bzw. subtrahiere ich einfach 3 von pPosX bzw. pPosY.
Habt ihr eine Vorstellung, woran es liegen könnte?
 

Volvagia

Top Contributor
Typisches Problem. Bevor gezeichnet wird wird das alte Bild weiß übermahlt.

A) update() leer überschreiben und so einfach über das alte drüber zeichnen.
B) Doublebuffering verwenden (BufferStrategy oder eigenimpl. in der update und paint)
C) Swing verwenden (von Haus aus doppelt gebuffert)
 

hiok

Mitglied
A) update() leer überschreiben und so einfach über das alte drüber zeichnen.

Wie meinst du "leer überschreiben"?

B) Doublebuffering verwenden (BufferStrategy oder eigenimpl. in der update und paint)

Ich werde mich mal einlesen.

C) Swing verwenden (von Haus aus doppelt gebuffert)[/QUOTE]

Folgernd aus meinen Import's sollte sich doch durch das JFrame bereits ergeben, dass ich swing verwende - oder verstehe ich da etwas falsch (es kommt doch hierbei auf den Frame an, richtig)?

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Bei deinen Beispielsource standen keine Importe.
Dann kannst du einfach die paintComponent eines JPanels überschreiben und dieses auf das JFrame hinzufügen.
 

hiok

Mitglied
Das hatte ich vorhin bereits probiert, dennoch ohne Erfolg. Habe ich es evt. nicht zum JFrame hinzugefügt? Falls ja, wie?

Java:
private Screen screen;

public Main() {
	
	// ...
        
	Screen screen = new Screen();
	addKeyListener(new KeyHandler());
        
	while(true) {  
		setNewPos();
		screen.repaint();
        	
		try {
			Thread.sleep(15);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

private class Screen extends JLabel {
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.RED);
		g.fillRect(pPosX, pPosY, 50, 50);
	}
}
 

Volvagia

Top Contributor
Java:
package org.javaforum;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main {
	private static enum MoveDirectory {
		RIGHT,
		LEFT
	};
	
	private Rectangle rectangle;
	private MoveDirectory moveDir;
	private Screen screen;
	
	public Main() {
		moveDir = MoveDirectory.RIGHT;
		rectangle = new Rectangle(0, 0, 100, 100);
		
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		screen = new Screen();
		frame.add(screen, BorderLayout.CENTER);

        frame.setSize(200, 200);
        frame.setVisible(true);
	}
	private void startRectangleMoving() {
		new Thread(new MoveRectRunnable()).start();
	}
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Main().startRectangleMoving();
			}
		});
	}
	
	private class MoveRectRunnable implements Runnable {
		public void run() {
			do {
				if(moveDir == MoveDirectory.RIGHT) {
					rectangle.x++;
					
					if(rectangle.x > 150) {
						rectangle.x = 150;
						moveDir = MoveDirectory.LEFT;
					}
				} else {
					rectangle.x--;
					
					if(rectangle.x <= 0) {
						rectangle.x = 0;
						moveDir = MoveDirectory.RIGHT;
					}
				}
				
				screen.repaint();
				
				try {
					TimeUnit.MILLISECONDS.sleep(1L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			} while(true);
		}
	}
	private class Screen extends JPanel {
		protected void paintComponent(Graphics g) {
	        super.paintComponent(g);
	        g.setColor(Color.RED);
	        g.fillRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
	    }
	}
}
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Ähnliche Java Themen

Neue Themen


Oben