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
CoolButton.java
aufgabe.java
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
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