repaint() ruft paint() nicht auf

Warrior7777

Bekanntes Mitglied
Hallo miteinander

dies ist mein erster Beitrag, macht mich also bitte darauf aufmerksam, wenn ich unhöflich etc. bin.

Nun zu meiner Frage: Wieso funktioniert paint() nicht?

Java:
import java.lang.*;
import java.awt.*;

class FirstGame extends Frame implements Runnable{
	
	Frame window=new Frame("FirstGame");
	Thread thread;
	
	public void paint(Graphics g){
		g.setColor(new Color(250, 250, 250));
		g.fillOval(300, 300, 100, 100);
		System.out.println("paint() aufgerufen.");
	}	
	//Image offScreen=new Image();
	FirstGame(){
		window.addWindowListener(new ClosingAdapter());
		window.setBounds(300, 300, 400, 300);
		window.setBackground(new Color(0, 0, 0));
		window.setVisible(true);
		thread=new Thread(this);
		thread.start();
	}
	
	public void run(){
		while(true){
			window.repaint();
			System.out.println("run() gestartet.");
			try{
				Thread.sleep(1000);
			}catch(InterruptedException e){}
		}
	}
	


	

	
	public static void main(String[] args){
		
		new FirstGame();
	}
}

Danke schon im Voraus!
 
Wenn du von Frame erbst musst du nicht ein neues Frame anlegen snndern kannst das alles auf dich selbst aufrufen.

lösche die Variable window und ersetzte ueberall dort wo du eine Methode von window aufgerufen hast dies mit this.

also z.B.

Java:
//von
window.addWindowListener(new ClosingAdapter());
//zu
this.addWindowListener(new ClosingAdapter());

paint funktioniert deswegen nicht weil du rapaint von Frame aufrufst und nicht von dir selbst

edit:

weiters warum verwendest du AWT und nicht swing (also JFrame statt Frame)?
 
Zuletzt bearbeitet:
Code:
class FirstGame extends Frame
Code:
Frame window=new Frame("FirstGame");
Ein Frame reicht aus 😉
 
Gäbe es keine Möglichkeit ohne extends Frame (also mit der Variablen)?

Übrigens: ich brauch das AWT, weil in einem Buch ein Beispiel mit AWT ist ("Handbuch der Java-Programmierung"). Dort ist übrigens die Variante ohne Variable (also mit extends) angegeben. Ich wollte nur wissen, weshalb "meine" Variante nicht funktioniert. Und danke!🙂
 
wenn du eine Methode ueberschreiben möchtest ( hier also die paint-Methode ) dann musst du immer etwas mit extends machen (bei einem Interface mit implements)


deine Lösung funktioniert nicht, da dein window deine ueberschriebene Methode paint nicht kennt (wie sollte sie auch) und diese daher nicht ausgefuehrt wird.
 
wenn du eine Methode ueberschreiben möchtest ( hier also die paint-Methode ) dann musst du immer etwas mit extends machen (bei einem Interface mit implements)
Das stimmt nicht so ganz.
Folgendes geht genauso gut:
Java:
Frame frame = new Frame("FirstGame") {
  @Override
  public void paint(Graphics g) {
    // ...
  }
}
Das erstellte Frame Objekt kann dann ganz normal benutzt werden.
 
Das stimmt nicht so ganz.
Folgendes geht genauso gut:
Java:
Frame frame = new Frame("FirstGame") {
  @Override
  public void paint(Graphics g) {
    // ...
  }
}
Das erstellte Frame Objekt kann dann ganz normal benutzt werden.

Und was ist das? Kaffeklatsch?
Das ist prinzipiell nichts anderes als eine Klasse die Frame extended.
 
Ich weiß, was anonyme Klassen sind. Trotzdem danke!
Ok also wenn ich das richtig verstanden hab: die extends Klausel bewirkt, dass sich meine Klasse wie ein Frame verhält. So gesehen überschreibe ich also die paint()-Methode der Klasse FirstGame, nicht aber diejenige von Frame. Meine Variable ist aber vom "Typ" Frame, deshalb wird deren paint() aufgerufen.
Anstatt der anonymen Klasse könnte ich auch eine separate anlegen und window mit einer Instanz davon typisieren.

Wie Ihr seht, hab ich schon einiges gelesen, aber praktisch null Praxiserfahrung.^^

Nochmals danke!
 
Im großen und ganzen passt das schon was du jetzt geschreiben hast.

Natuerlich sind noch ein paar Fehler darin, aber das wichtigste ist das du es fuer dich verstanden hast.
 

Zurück
Oben