Vererbung Wann wird die Methode paint aufgerufen?

tyler1

Neues Mitglied
Hallo Leute,

habe im Laufe meines Studiums folgendes Programm entwickelt. Es läuft auch alle perfekt, nur habe ich einen Denkfehler und kann mir nicht so recht erklären, warum die ganzen Elemente überhaupt gezeichnet werden. Denn die Methode die dafür verantwortlich ist (paint) wird nämlich nirgends aufgerufen? Könnte mir das vielleicht einer erklären? Danke!

Hier die 3 Dateien:

CoolCircle.java

Java:
import java.awt.*;

public class CoolCircle {
	private int x; //– X-Koordinate (Typ int)
	private int y; //– Y-Koordinate (Typ int)
	private int radius; //– Radius (Typ int)
	public Color farbe; //– Farbe (Typ Color)
	private static int i=1;  //– Eine Zählvariable, die die Anzahl der insgesamt generierten Kreise 
					//beinhaltet. Sie wird inkrementiert, sobald ein neuer Kreis instanziert 
					//wird. Sie kann ebenfalls genutzt werden, um einen Kreis eindeutig 
					//zu identifizieren.
	
	private int id; //Eine ID, daher den Zustand der Zählvariable zum 
					//Erstellungszeitpunkt.
	
	private boolean filled = false; //Eine Variable filled, die angibt, ob der Kreis gefüllt oder ungefüllt 
									//dargestellt werden soll.
	
	
	 //– Entfernen Sie den Enum-Typen Color aus Ihrer Klasse.
	
	  /*public enum Color {
		  ROT, BLAU, GRUEN, GELB
	  }*/
	
	
	
	CoolCircle() {
		
		this.id=CoolCircle.i; //fest zugewiesene nummer für den kreis
		CoolCircle.i++; 
	}
	
	
	
	
	// Erstellen Sie einen weiteren Konstruktor, der die Koordinaten, den 
	//Radius und die Farbe als Parameter akzeptiert (Überladen des 
		//	Konstruktors)
	CoolCircle(int x, int y, Color farbe) {
		this.x = x;
		this.y = y;
		this.farbe = farbe;
		this.id=CoolCircle.i; //fest zugewiesene nummer für den kreis
		CoolCircle.i++; 
	}
	
	
	
	//getter und setter methoden ------------------------------------------------------------------------
	
	public void setX (int x) {
		this.x = x;
	}
	
	public int getX () {
		return this.x;
	}
	
	
	public void setY (int y) {
		this.y = y;
	}
	
	public int getY () {
		return this.y;
	}
	
	
	public void setRadius (int radius) {
		this.radius = radius;
	}
	
	public int getRadius () {
		return this.radius;
	}
	
	public void setFarbe (Color farbe) {
		this.farbe = farbe;
	}
	
	public Color getFarbe () {
		return this.farbe;
	}
	
	
	public void setFilled (boolean filled) {
		this.filled = filled;
	}
	
	public boolean getFilled () {
		return this.filled;
	}


	//------------------------------------------------------------------------------------


	//– Erstellen Sie eine Setter-Methode, die alle relevanten Werte auf einmal annimmt.

	public void setWerte (int x, int y, int radius, Color farbe, boolean filled){
		this.x = x;
		this.y = y;
		this.radius = radius;
		this.farbe = farbe;
		this.filled = filled;
	}


	//– Implementieren Sie eine Print-Methode, die den aktuellen Zustand des 
	//Kreises ausgibt.
	
	public void print() {
		System.out.println("Kreis ID: " + this.id);
		System.out.println("X-Koordinate: " + this.x);
		System.out.println("Y-Koordinate: " + this.y);
		System.out.println("Radius: " + this.radius);
		System.out.println("Farbe: " + this.farbe);
		System.out.println("Gefüllt?: " + this.filled);
		System.out.println("---------------------------");
	}

	
	//– Zusätzlich benötigen wir noch eine Methode getDistance, die uns 
	//den Abstand zwischen zwei Kreisen berechnet:

	
	public double getDistance(CoolCircle c) {
		
		//eigener kreis this.x und this.y und this.radius ---------- x1 , y1 und r1
		//fremder kreis über parameter c.x und c.y und c.radius ---------- x2 , y2 und r2
		
		
		
		double w = (Math.sqrt( (c.x-this.x)*(c.x-this.x) + (c.y-this.y)*(c.y-this.y)	) - this.radius - c.radius);
		return w;
		}


	/*
	
	//– Verpassen Sie Ihrer Klasse CoolCircle eine Main-Methode und testen Sie 
	//damit die Klasse (Erzeugen mehrerer Kreise, Abstand berechnen und 
		//	Zustand ausgeben).

	public static void main (String[] args) {
		
		CoolCircle kreis1 = new CoolCircle(); //standardkonstruktor
		CoolCircle kreis2 = new CoolCircle(); //normaler konstruktor wird aufgerufen (standardkonstruktor)
		CoolCircle kreis3 = new CoolCircle(3,4,Color.GRUEN); //erweiterter konstruktor wird aufgerufen (customkonstruktor)
		
		kreis1.setWerte(3,3,2,Color.ROT,true);		//(int x, int y, int radius, Color farbe, boolean filled)
		kreis2.setWerte(7,7,2,Color.ROT,true);		//(int x, int y, int radius, Color farbe, boolean filled)
		
		kreis1.print();
		kreis2.print();
		
		System.out.println("Abstand Kreis 1 und Kreis 2: " + kreis1.getDistance(kreis2));
		System.out.println("---------------------------");
		
		//System.out.println("Abstand der Mittelpunkte: " + (Math.sqrt( (7-3)*(7-3) + (7-3)*(7-3)	) ));
		//---------------------------------
		kreis1.setFarbe(Color.BLAU);
		kreis1.setRadius(15);
		kreis1.print();
		
		kreis3.setRadius(109);
		
		kreis3.print();
		
		}
		*/
		
	



}

CoolButton.java


Java:
import java.awt.*;
import javax.swing.*;

public class CoolButton extends JButton
{
	//Ihr CoolButton besitzt zwei zusätzliche Eigenschaften, nämlich zwei 
	//Kreise (Typ Circle) c1 und c2.
	private CoolCircle c1;
	private CoolCircle c2;
	
	
	
	CoolButton()
	{
		super();		
	}
	
	CoolButton(CoolCircle c1, CoolCircle c2)
	{
		super();
		this.c1 = c1;
		this.c2 = c2;
			
	}

	
	//Implementieren Sie die passenden Getter-Methoden.
	
	public CoolCircle getc1 () {
		return this.c1;
	}
	
	public CoolCircle getc2 () {
		return this.c2;
	}
	
	
	//Implementieren Sie einen Standardkonstruktor.
	//– Hinweis: Aus der Vorlesung wissen Sie, dass der Standardkonstruktor 
	//den Konstruktor der Basisklasse aufrufen sollte. Falls 
	//unvorhergesehene Dinge passieren, könnte dies an einem fehlenden 
	//Aufruf liegen.
	
	
	
	
	//– Programmieren Sie die Methode:
	
	public void paint(Graphics g) 
	{
		super.paint(g);
		
		
		if(c1.getDistance(c2)<=200)
		{
			g.setColor(c1.getFarbe());
		g.fillOval(c1.getX(), c1.getY(), 200, 200);
		
		
		g.setColor(c2.getFarbe());
		g.fillOval(c2.getX(), c1.getY(), 200, 200);
			
			
			
		}
		
		
		if(c1.getDistance(c2)>200)
		{
			g.setColor(c1.getFarbe());
		g.drawOval(c1.getX(), c1.getY(), 200, 200);
		
		
		g.setColor(c2.getFarbe());
		g.drawOval(c2.getX(), c1.getY(), 200, 200);
			
		}
		
		
		
	
		
	}
	
	

}

aufgabe.java


Java:
import java.awt.*;

import javax.swing.*;

public class aufgabe5 
{
	public static void main (String[] args)
	{
		
		//in der main die werte verändern...und die paint ändert sie dann in der zeichnung
		CoolCircle kreis1 = new CoolCircle(0,150, Color.green);
		CoolCircle kreis2 = new CoolCircle(600,150, Color.red);
		
		//code
		//– Erstellen Sie eine Klasse Main, in der Ihr CoolButton dargestellt wird.
		//– Verwenden Sie die gleichen Imports wie in CoolButton.
		//– In der Main-Methode muss zuerst ein neues Fenster erstellt werden:
		
		JFrame p = new JFrame();
		
		//– Die Größe des Fensters wird so definiert:
		
		p.setSize(800, 600);
		
		// Die Anordnung der Elemente im Fenster übernimmt ein sogenannter 
		//LayoutManager. Der hier verwendete LayoutManager ordnet die 
		//Elemente in einer Reihe an:
		
		p.setLayout(new GridLayout());
		
		// Fügen Sie nun nach Belieben einige Knöpfe nach folgendem Schema 
		//zum Fenster hinzu:
		
		CoolButton cb = new CoolButton(kreis1, kreis2); //sobald jButton implementiert wird
		cb.setText("Servus");
		
		
		//Setzen Sie die Farben der Kreise z.B. so
		
		//cb.getc1().setFarbe(Color.BLACK);
		//cb.getc2().setFarbe(Color.RED);
		
		//Setzen Sie die Radien und Positionen
		
		p.add(cb);
		
		
		//	– Wenn alle Einstellungen erledigt sind, muss Ihr Fenster angezeigt 
		//werden:
		
		p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		p.setVisible(true);
		
	
		
		String richtung1 = "right";
		
		String richtung2 = "left";
	   
		//endlosschleife zum immer wieder neu zeichnen
		
		try {
            while(true) {
            
            	//bewegung kreis 1
            	
            	if (richtung1=="right")
            	cb.getc1().setX((cb.getc1().getX())+10);
            	
            	if (richtung1=="left")
                cb.getc1().setX((cb.getc1().getX())-10);
            	
            	
            	if (cb.getc1().getX()>=600 && richtung1=="right")
            		richtung1 = "left";
            	
            	
            	if (cb.getc1().getX()<=0 && richtung1=="left")
            		richtung1 = "right";
            	
            	
	//bewegung kreis 2
            	
            	if (richtung2=="right")
            	cb.getc2().setX((cb.getc2().getX())+10);
            	
            	if (richtung2=="left")
                cb.getc2().setX((cb.getc2().getX())-10);
            	
            	
            	if (cb.getc2().getX()>=600 && richtung2=="right")
            		richtung2 = "left";
            	
            	
            	if (cb.getc2().getX()<=0 && richtung2=="left")
            		richtung2 = "right";
            	
            	
            	
            
                
        
                cb.repaint();
                Thread.sleep(20);
            }
        }
        catch (Exception e)
        {
            System.out.println("ERROR: "+e);
        }
        
		
		
		
		
	
		
		
		
		
		
		
		
		
		
		
		
	}

}


Die Zeile in der Datei aufgabe.java:
p.add(cb)
Zeichnet die Elemente, aber ruft diese Methode denn wiederrum die Methode paint aus JButton auf?

Vielen Dank
Gruß
tyler1
 
G

Gast2

Gast
Die paint- (bzw. bei Swing eher paintComponent-) Methode wird automatisch aufgerufen, das musst du nicht explizit machen.
Aufgerufen wird die immer dann wenn ein Neuzeichnen erforderlich ist, beispielsweise wenn du das Fenster sichtbar machst, mit der Maus verschiebst oder ähnliches.
Mit repaint() kann man selbst ein Neuzeichnen einleiten.
 

Kevin94

Top Contributor
Nicht direkt durch add(). paint() bzw. paintComponent() sind Methoden die von Java automatisch aufgerufen werden, immer wenn es der Meinung ist, das ein bestimmter Bereich der Oberfläche inaktuell ist. Dies ist z.B. der Fall wenn dieser Bereich vorher durch ein anderes Fenster verdeckt wurde, eine neue Komponente hinzugefügt wurde (durch add()) oder sich der Zustand dieser Komponente geändert hat und deshalb irgendwo repaint() aufgerufen wurde. Das Neuzeichnen erfolgt dabei allerdings nicht direkt, sondern asynchron auf dem EDT. Diese Auslöser erzeugen alle ein Event und der RepaintManager entscheidet dann, wann was gezeichnet wird. Das kann unteranderem dazu führen, das mehrer kurzaufeinanderfolgende Events zu einem einzelnen Repaint zusammengefasst werden.
 

piu58

Mitglied
Das ist ein Vorteil von Java - du brauchst dich darum nicht zu kümmern. Bei /C++ oder C# z.B. musst du deinen Paint-Zweig in denjenigen des Hintergrundprozessen explizit einhängen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
-horn- Wann wird alles NaN erzeugt? Java Basics - Anfänger-Themen 22
S Wann wird eine Klasse geladen? Java Basics - Anfänger-Themen 17
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
I Logik Zahlungsprozess - Wann Bestellobjekt anlegen? Java Basics - Anfänger-Themen 2
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
berserkerdq2 Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams? Java Basics - Anfänger-Themen 5
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
W Wann Rückgabewerte 0, 1, -1? Java Basics - Anfänger-Themen 27
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
F Wann ist es eine Instanz und wann nicht? Java Basics - Anfänger-Themen 1
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
S Wann Methode abstract? Java Basics - Anfänger-Themen 10
S Wann buffer löschen? Java Basics - Anfänger-Themen 5
R Wie überprüfen wann der User online oder offline ist? Java Basics - Anfänger-Themen 5
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
I Wann ist Client plattformunabhängig? Java Basics - Anfänger-Themen 22
M Best Practice Wann eine Methode schreiben ? Java Basics - Anfänger-Themen 14
K Warum funktioniert das und wann erden die Objektmethoden nun ausgeführt? Java Basics - Anfänger-Themen 7
IngoF Welches Event kommt wann? Java Basics - Anfänger-Themen 8
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
O Wann nutzt man static? Java Basics - Anfänger-Themen 19
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
M Wann final verwenden? Java Basics - Anfänger-Themen 5
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
D Ab wann getter und setter Java Basics - Anfänger-Themen 2
B Erkennen, wann static oder nicht? Java Basics - Anfänger-Themen 7
E wann welche Konstanten verwenden? Java Basics - Anfänger-Themen 7
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
vandread Java Wildcards - Wann super wann extends? Java Basics - Anfänger-Themen 2
K Wann Vererbung und wann Interface verwenden? Java Basics - Anfänger-Themen 12
D Wann genau nutze ich ein solches Interface? Java Basics - Anfänger-Themen 3
K Wann genau brauche ich die Anweisung gleich null? Java Basics - Anfänger-Themen 10
B Wann toString() überschreiben? Java Basics - Anfänger-Themen 21
S OOP Wann Proxies und Interfaces? Java Basics - Anfänger-Themen 3
P Threads Wann läuft es parallel ab ? Java Basics - Anfänger-Themen 4
C Variablen Wann werden Instanzvariablen initalisiert? Java Basics - Anfänger-Themen 10
P Java Stream, wann welche Stream verwenden? Java Basics - Anfänger-Themen 3
T Ab wann ist es ein großes Projekt? Java Basics - Anfänger-Themen 35
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
W Wann nutze ich "import"? Java Basics - Anfänger-Themen 12
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
H Wann ein Objekt der Programmklasse in main anlegen Java Basics - Anfänger-Themen 2
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
T Wann for und wann while?? Java Basics - Anfänger-Themen 35
C this - wann verwende ich das? Java Basics - Anfänger-Themen 10
T Threads - Ab wann wirds Kritisch?! Java Basics - Anfänger-Themen 7
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
G field public/private wann Java Basics - Anfänger-Themen 11
GambaJo Ab wann neue Klasse erzeugen? Java Basics - Anfänger-Themen 2
G Wann Arrays, wann Collections? Java Basics - Anfänger-Themen 36
GambaJo Wann try.catch nutzen? Java Basics - Anfänger-Themen 11
B objekt wann als final deklarieren? Java Basics - Anfänger-Themen 2
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
Y Wann / Wozu inner class Java Basics - Anfänger-Themen 3
K StringBuilder notwendig ab wann? Java Basics - Anfänger-Themen 42
S wann static Funktionen wann nicht Java Basics - Anfänger-Themen 6
N Wann und wie oft finalize Methode verwenden( überschreiben ) Java Basics - Anfänger-Themen 6
Bernasconi Programmierstil / Wann eine neue Datei? Java Basics - Anfänger-Themen 5
M wann, welche schleife Java Basics - Anfänger-Themen 3
M Ab wann ist die Datei sichtbar? Java Basics - Anfänger-Themen 3
G Herausfinden, wann mehrere Threads abgeschlossen sind Java Basics - Anfänger-Themen 3
G Überprüfen wann ein Dokument abläuft? Java Basics - Anfänger-Themen 3
N SAX, StAX, JDOM oder DOM , ab wann welches für XML Java Basics - Anfänger-Themen 14
M Wann ist ein Programm beendet? Java Basics - Anfänger-Themen 6
G Wann am besten getSize() aufrufen? Java Basics - Anfänger-Themen 6
I Festellen wann Methode in anderer Klasse fertig ist Java Basics - Anfänger-Themen 5
M wann statische klassen? Java Basics - Anfänger-Themen 14
M Wann ist initialisieren sinnvoll? Java Basics - Anfänger-Themen 4
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
R Wann benutzt man << oder >> ? Java Basics - Anfänger-Themen 2
G Klassen: Wann initialisiere ich wo meine Variabeln Java Basics - Anfänger-Themen 6
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
Oneixee5 Maven Plugin wird 2 mal ausgeführt Java Basics - Anfänger-Themen 10
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben