Instanz von Graphics in run()

Status
Nicht offen für weitere Antworten.

DarkwingDuck

Mitglied
Hallo Zusammen! 😀

Ich habe die Forumsuche benutzt, aber die bereits existierenden Threads haben mir nicht wirklich geholfen. Ich hoffe, dass ich hier keinen nerve :wink:

Also mein Problem ist folgendes: Ich möchte einfach nur in einem Thread zeichnen und ich kriege es einfach nicht hin mir eine Instanz von Graphics zu erzeugen. Also mein Code ist folgender:
Code:
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class Draw extends Frame implements WindowListener
{
	private static final long serialVersionUID = 1L;
	public static void main(String[] args)
	{
		new Draw();
		DrawToo df = new DrawToo();
		Thread t = new Thread(df);
		t.start();
	}
	
	public Draw()
	{
		setLayout(null);
		setTitle("Draw");
		setSize(1024, 768);
		setVisible(true);
		addWindowListener(this);
	}
	
	public void paint(Graphics g)
	{
		g.setColor(Color.RED);
		g.fillRect(100, 100, 100, 100);
	}
}


class DrawToo extends Frame implements Runnable
{
	public void run()
	{
		Graphics g = new Graphics();
		g.setColor(Color.BLUE);
		g.drawRect(300,300,100,100);
	}
}

Ich steh noch ziemlich am Anfang und es tut mir leid wenn ich dumme Fragen stelle, aber ich hoffe ihr helft mir trotzdem :roll:

Vielen Dank schonmal
DarkwingDuck
 
DarkwingDuck hat gesagt.:
Ich steh noch ziemlich am Anfang und es tut mir leid wenn ich dumme Fragen stelle, aber ich hoffe ihr helft mir trotzdem :roll:
Dafür ist das Forum samt seiner ehrenamtlichen Mitarbeiter ja da. 😀

Dein Code ist noch ein wenig unverständlich. Zum ersten kannst du selbst gar kein
Graphic Objekt erzeugen. Diese werden vom System erzeugt und dir zum Zeichen
in Methoden wie paintComponent zur Verfügung gestellt.

Weiter hat dein erzeugtes g in der Methode run gar keine Verbindung zu irgendeinem
Frame.

Auch versteht ich nicht wieso du 2 Klassen hast, die beide von JFrame erben?
In welches willst du denn zeichnen?

Beschreib doch einfach mal mit eigenen Worten was du eigentlich vorhast,
vielleicht können wir die dann ein entsprechendes Gerüst coden an dem
du dann weiter raufklettern kannst 😎
 
oh, dass die zweite Klasse von Frame erbt ist noch ein Überbleibsel von einem Experiment. Bitte einfach wegdenken :roll:

Ich erkläre am besten erstmal wie ich zu dieser Frage gekommen bin:
- Ich will 2 animierte Grafiken darstellen, dazu brauche ich 2 Schleifen die alle paar milisekunden ein neues Bild ausgeben
- da die 2 Schleifen dazu ja gleichzeitig laufen müssen brauche ich Threads (oder?)
- Also muss ich in einem Thread ein Bild darstellen. Die einzig mir bekannte Methode das zu tun ist:
Code:
Image[] raupe = new Image[4];

raupe[0] = getToolkit().getImage("raupe0.gif");		
raupe[1] = getToolkit().getImage("raupe1.gif");
raupe[2] = getToolkit().getImage("raupe2.gif");
raupe[3] = getToolkit().getImage("raupe3.gif");

MediaTracker mt = new MediaTracker(this);
mt.addImage(raupe[0], 0);
mt.addImage(raupe[1], 1);
mt.addImage(raupe[2], 2);
mt.addImage(raupe[3], 3);

g.drawImage(raupe[i], 100,100,this); // i ändert sich in einer Schleife ständig
- mein Problem ist jetzt, dass das "g" von "g.drawImage(raupe...." gar nicht existiert 🙁
Ich kenne das nur von "public void paint(Graphics g)" und da wird doch eine Instanz von Graphics namens g erzeugt oder? Und ich dachte, dass selbe könnte ich mit "Graphics g = new Graphics();" auch tun. Denn es in der run() genauso zu tun wie in der paint() --> also "run(Graphics g)" verbietet mir der Compiler...

Und genau das ist meine Frage: Wie bekomme ich eine Instanz von Graphics in meine run() ?

Wäre super wenn ihr mir da helfen könntet (oder bin ich komplett auf dem Holzweg..? :bahnhof: )

Vielen Dank! 😀
 
DarkwingDuck hat gesagt.:
Und genau das ist meine Frage: Wie bekomme ich eine Instanz von Graphics in meine run() ?

Am besten gar nicht 😎

Und zwar aus folgendem Grund: Wenn du außerhalb deines Frames in die Instanz von Graphics schreibst,
ist alles was du gezeichnet hast verschwunden wenn dein Frame mal miminiert oder von einem anderen
Frame überdeckt wird.

Aus diesem Grund solltest du am besten nur dem Frame selbst erlaubej etwas zu zeichen und
das was er zeichnen soll auch nur in der paintComponent Methode.

Ein sauberer Ansatz ist, in deiner run-Methode dem Frame über den Aufruf einer Methode einfach
nur mitzuteilen, daß und was er zeichnen soll. Diese Methode vermerkt in seiner Instanz (Instanzvariablen)
was aktuell darzustellen ist und ruft am Ende repaint() auf um widerum den Event-Dispatch-Thread
zu veranlassen die paintComponent-Methode des Frames aufzurufen. Dort und nur dort findet
dann das eigentliche Zeichnen in die sowieso übergebene Graphics-Instanz statt.
 
Zum Verständnis:

Du meinst also, ich soll in meiner run() eine Schleife laufen lassen, die einer Variable ständig ein neues Bild zuweist. Diese Variable übergebe ich an meinen Frame und lasse ihn dort darstellen.
Ist das so richtig?

Nur was ein Event-Dispatch-Thread ist weiß ich nicht. Aber ich denke das kann ich auch googeln
 
Genau!
Bleibt nur noch die Frage, woher deine Run-Methode das Frame kennt.

Du kannst im Konstruktor der Klasse DrawTo die Frame-Instanz übergeben und in einer
Instanzvariablen speichern.

Oder du verzichtest gleich ganz auf DrawTo, läßt dein Hauptframe das Interface Runnable implementieren
und verlagerst die run-Methode dorthin. Dadurch hat deine run-Methode automatisch zugriff auf
das Frame.
 
Alles klar. Hab ich verstanden glaub ich!

Werd ich heut abend gleich mal ausprobieren

Vielen Dank für deine Hilfe! 😀 :applaus:
 
DarkwingDuck hat gesagt.:
- mein Problem ist jetzt, dass das "g" von "g.drawImage(raupe...." gar nicht existiert 🙁
Ich kenne das nur von "public void paint(Graphics g)" und da wird doch eine Instanz von Graphics namens g erzeugt oder? Und ich dachte, dass selbe könnte ich mit "Graphics g = new Graphics();" auch tun. Denn es in der run() genauso zu tun wie in der paint() --> also "run(Graphics g)" verbietet mir der Compiler...

Ein Blick in die Java API offenbart, dass Graphics abstrakt ist, weshalb Du auch kein Graphics-Objekt erzeugen kannst.
 
Java API hört sieht interessant aus. Muss man sich aber erstmal einarbeiten glaub ich.
Aber Danke für den Tip!

Mein Programm läuft jetzt übrigens so wie es soll.
Danke für die Hilfe! 😀
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben