Grafiken bewegen und anzeigen!

BabyMitSchnully

Erfahrenes Mitglied
Hi,

leider hat mir die Suche auch nicht weiter geholfen. Mein Problem ist folgendes. Ich möchte eine Simple Grafik in einem JFrame anzeigen. Das hat geklappt. Ich habe das über die Toolkit - Klasse gemacht. Jetzt möchte ich diese Grafik aber bewegen können. Ich habe keine Ahnung wie. Ich habe schon einiges ausprobiert. Z.B.

public void paint(Graphics g)
{
g.drawImage(.......);
}

Ich schaffe es nicht, die Position auf dem Fenster zu verändern. Ich schaffe es nur das Bild noch ein 2tes Mal zu zeichnen. Gibt es da eine einfache Lösung?

Gruß
ChrisP
 
Hallo!

Schau mal hier:
Code:
package de.tutorials;

import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class MoveImage extends JFrame {

	private BufferStrategy strategy;

	private BufferedImage img;

	private int x = 0, y = 0;

	private int w, h;

	private boolean leftDown, rightDown, upDown, downDown, running = true;

	private Thread runner = new Thread() {
		{
			setPriority(MIN_PRIORITY);
		}

		public void run() {
			try {
				while (running) {
					Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
					g.clearRect(0, 0, 400, 300);

					if (rightDown) {
						x += 2;
					} else if (leftDown) {
						x -= 2;
					} else if (upDown) {
						y -= 2;
					} else if (downDown) {
						y += 2;
					}

					if (img != null)
						g.drawImage(img, x, y, MoveImage.this);
					g.dispose();
					strategy.show();
					sleep(50L);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	};

	public MoveImage() {
		super("MoveImage");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		try {
			img = ImageIO.read(new File("c:/Beispiel_small.jpg"));
			w = img.getWidth();
			h = img.getHeight();
		} catch (IOException e) {
			e.printStackTrace();
		}

		addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent evt) {
				int code = evt.getKeyCode();
				switch (code) {
				case KeyEvent.VK_LEFT:
					leftDown = true;
					break;
				case KeyEvent.VK_RIGHT:
					rightDown = true;
					break;
				case KeyEvent.VK_UP:
					upDown = true;
					break;
				case KeyEvent.VK_DOWN:
					downDown = true;
					break;
				default:
					;
				}
			}

			public void keyReleased(KeyEvent evt) {
				int code = evt.getKeyCode();
				switch (code) {
				case KeyEvent.VK_LEFT:
					leftDown = false;
					break;
				case KeyEvent.VK_RIGHT:
					rightDown = false;
					break;
				case KeyEvent.VK_UP:
					upDown = false;
					break;
				case KeyEvent.VK_DOWN:
					downDown = false;
					break;
				default:
					;
				}
			}

			public void keyTyped(KeyEvent evt) {
				int code = evt.getKeyChar();
				switch (code) {
				case KeyEvent.VK_ESCAPE:
					running = false;
					System.exit(0);
				}
			}
		});

		setSize(400, 300);
		setResizable(false);
		setIgnoreRepaint(true);
		setVisible(true);
		createBufferStrategy(2);
		strategy = getBufferStrategy();
	}

	public static void main(String[] args) {
		new MoveImage().start();
	}

	/**
	 *  
	 */
	private void start() {
		runner.start();
	}
}

gruß Tom
 
Hi,

ich bedanke mich an dieser Stelle erst einmal für die in meinen Augen perfekte Antwort :) Das war genau das, was ich gesucht habe. Da ich noch nicht so der Javafreak bin habe ich noch ein paar Fragen zu deinem Quelltext.

1. Die Klasse BufferStrategy! Was macht die? Wofür ist die gut?

2. getBufferStrategy()! Ist das eine Methode von JFrame?

3. private Thread runner = new Thread() {
{
setPriority(MIN_PRIORITY);
}
Was bedeutet dieses lustige Codestück? Wieso kann ich einer Variable so einen riesen Block zuweisen? Wird hier der Konstruktor von Thread überschrieben?

4. Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
g.clearRect(0, 0, 400, 300);
Was machen diese beiden lustigen Zeilen

5. g.drawImage(img, x, y, MoveImage.this);
Bei dieser Zeile hätte ich folgendes erwartet
g.drawImage(img, x, y, this); oder
g.drawImage(img, x, y, this.MoveImage);
Doch wenn ich es so versuche zu compilieren, geht es nicht.

7. createBufferStrategy(2);
Kann ich auch nichts mit anfangen. Ich finde leider auch nichts in der Hilfe, weil die Klasse nicht aufgelistet ist.

Gruß
ChrisP
 
Nutze doch mal folgende Methoden des Graphics-Objekts:

copyArea(...) ---> wo anders hin kopieren
clearRect(...) ---> vorherigen Bereich löschen:)
 
Hallo!

Zu deinen Fragen:

1) Die Klasse BufferStrategy realisiert die Technik der Doppelpufferung um Flackerfreie Animationen anzeigen zu können.

2)getBufferStrategy() ist in der Klasse java.awt.Window definert von der JFrame u.A abgeleitet ist.

3)Diesen Codeblock nennt man Initializierer-Block er wird vor dem eigentlichen Konstruktor ausgeführt aber NACH dem SuperKlassen Konstruktor. Siehe: http://www.tutorials.de/tutorials177489.html&highlight=Konstruktor

4)mit getDrawGraphics() besorge ich mir einen Grafikkontext (der Strategy -> (des JFrames)) um zu Zeichnen. Mit clearRect lösche ich den gesamten Bildinhalt in dem Bereich.

5)Da ich mich in einer Anonymen Klasse (new Thread(){...}) befinde kann ich als Observer kein this verwenden, weil sich this in diesem Kontext auf den Thread bezieht. Mit HauptKlasse.this bekomme ich eine Referenz auf die Umhüllende Klasse die ich als Observer einsetzen kann.

6) (7) Diese Zeile legt einen "DoppelPuffer" an.

Gruß Tom
 
Hi, ich weiß dass dieses Thema schon älter ist aber da ich mich jetzt nicht extra hier registrieren wollte, habe ich kein neues Thema erstellt sondern hier rein geschrieben (Ich vermute mal das nicht registrierte Benutzer kein neues Thema erstellen können) da ich auch ein Problem mit dem Grafik gewegen habe. Ich fange erst ann mit Java und habe bis jetzt nur Applets ohne Mainclass(nur mit ActionListener + init und ein paar Applicationen wie z.B: Taschenrechner, Sortieralgoritmen.. geschrieben, deshalb kenn ich mich noch nicht so gut damit aus.)

Also würde mir jemand die folgenden Zeilen von "Thomas Darimonts" Programm erklären und warum startet (wenn ich das richtig verstanden habe) er aus der main Methode eine andere und die dann Thread?
Code:
private Thread runner = new Thread() {
		{
			setPriority(MIN_PRIORITY);
		}

		public void run() {
			try {
				while (running) {
					Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
					g.clearRect(0, 0, 400, 300);





					if (img != null)
						g.drawImage(img, x, y, MoveImage.this);
					g.dispose();
					strategy.show();
					sleep(50L);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	};







setResizable(false);
		setIgnoreRepaint(true);
		setVisible(true);
		createBufferStrategy(2);
		strategy = getBufferStrategy();
	}

	public static void main(String[] args) {
		new MoveImage().start();
	}

	/**
	 *  
	 */
	private void start() {
		runner.start();
	}
}

Es wäre sehr nett wenn mir irgen jemand dass einfach erklären könnte, danke.

MfG Death Overlord
 
Zurück