Objektdaten sinnvoll in Array Speichern

Status
Nicht offen für weitere Antworten.

Tomes J.

Mitglied
Hi,
mal folgender Beispielcode:

Code:
import java.applet.Applet;
import java.awt.*;
public class MyApplet extends Applet {
	Kreis k1, k2, k3;
	Viereck v;

	public void start() {
		k1 = new Kreis(10, 10, 30, 30, Color.RED);
		k2 = new Kreis(45, 10, 30, 30, Color.BLUE);
		k3 = new Kreis(80, 10, 30, 30, Color.ORANGE);
		v = new Viereck(10, 50, 20, 40, Color.GRAY);
	}

	public void paint(Graphics g) {
		k1.paint(g);
		k2.paint(g);
		k3.paint(g);
		v.paint(g);
	}
}

Code:
public class Kreis {
	private int x = 0;
	private int y = 0;
	private int breite = 0;
	private int hoehe = 0;
	private java.awt.Color farbe;

	public Kreis(int x, int y, int breite, int hoehe, java.awt.Color farbe) {
		this.x = x;
		this.y = y;
		this.breite = breite;
		this.hoehe = hoehe;
		this.farbe = farbe;
	}

	public void paint(java.awt.Graphics g) {
		g.setColor(this.farbe);
		g.fillOval(this.x, this.y, this.breite, this.hoehe);
	}
}

Code:
public class Viereck {
		private int x = 0;
		private int y = 0;
		private int breite = 0;
		private int hoehe = 0;
		private java.awt.Color farbe;

		public Viereck(int x, int y, int breite, int hoehe, java.awt.Color farbe) {
			this.x = x;
			this.y = y;
			this.breite = breite;
			this.hoehe = hoehe;
			this.farbe = farbe;
		}

		public void paint(java.awt.Graphics g) {
			g.setColor(this.farbe);
			g.fillRect(this.x, this.y, this.breite, this.hoehe);
		}
}

Ich möchte die Daten von k1, k2 und k3 in einem Array Speichern (muss später noch feststellen können ob ein Mausklick in einem der Kreise lag und wenn ja in welchem Kreis)
und mit dem Array möchte ich die 3 Objekte auf erstellen(for-Schleife oder so).

hat Jemand eine Idee wie man das elegant lösen kann?
 
Hi,
wenn du die Objekte mit verschiedenen Werten initialisierst, dann kannst du das mit der Schleife vergessen (außer die Werte lassen sich in Abhängigkeit der Zählvariable angeben).
Für deine Test benötigst du allerdings noch Getter für die internen Variablen oder eine Methode, die die Überprüfung vornimmt.

Code:
Kreis[] kreise = new Kreis[3];
kreise[0] = new Kreis(10, 10, 30, 30, Color.RED); 
kreise[1] = new Kreis(45, 10, 30, 30, Color.BLUE); 
kreise[2] = new Kreis(80, 10, 30, 30, Color.ORANGE);
 
> Ich möchte die Daten von k1, k2 und k3 in einem Array Speicher

na dann immer rein damit
array[0] = k1;
usw.
bzw. direkt:
array[0] = new Kreis(..);

> und mit dem Array möchte ich die 3 Objekte auf erstellen(for-Schleife oder so).

was ist 'auf erstellen' ? 'auch erstellen'?
ein Array erzeugt keine anderen Objekte,
aber mit einem Array und einer for-Schleife läßt sich einiges vereinfachen, richtig erkannt,
mit Kreisen und Vierecken wird schwierig,
nur bei Kreisen z.B.
Code:
for (i..) {
  array[i] = new Kreis (i*40, 20, .., farbe[i]);
}
da braucht es natürlich ein schlüssiges Konzept,
z.B. müssen die Farben vorher in einem Array vorliegen oder ähnliche Fragen geklärt sein
 
Code:
Kreis[] kreise = new Kreis[3];
kreise[0] = new Kreis(10, 10, 30, 30, Color.RED);
kreise[1] = new Kreis(45, 10, 30, 30, Color.BLUE);
kreise[2] = new Kreis(80, 10, 30, 30, Color.ORANGE);
[/code]

da macht Eclipse alles rot 🙁

Ich will später noch überprüfen ob ein MouseEvent in einem Kreis lag und wenn ja in welchem,
dazu brauch ich doch die Koordinaten.
Wie komm ich denn da wieder ran wenn ich die Daten so abspeicher?
 
erstaunlich, wie lauten denn die Fehlermeldungen?
geht folgendes?

k1 = new Kreis(10, 10, 30, 30, Color.RED);
Kreis[] kreise = new Kreis[3];
kreise[0] = k1;


------------

an die Daten kommst du wieder ran mit
Kreis kreis = kreise[0];
// do something with kreis

ein Array ist also keine Wundertüte sondern nur ein Transportmittel 😉
 
tja, liegt vielleicht am Code drumherum, poste bisschen mehr,
ist so zunächst nicht zu erkennen, oder ich bin blind

die alten Befehlr gehen noch?
bei mir geht folgendes:

Code:
import java.awt.Color;

public class Test {

	public static void main(String[] args) throws Exception {
		Kreis[] kreise = new Kreis[3];
		kreise[0] = new Kreis(10, 10, 30, 30, Color.RED);
		kreise[1] = new Kreis(45, 10, 30, 30, Color.BLUE);
		kreise[2] = new Kreis(80, 10, 30, 30, Color.ORANGE);
	}

}

class Kreis {

	public Kreis(int i, int j, int k, int l, Color color) {
	}

}
 
so hatte ich es:

Code:
import java.applet.Applet;
import java.awt.*;
public class MyApplet extends Applet {
	
    Kreis[] kreise = new Kreis[3];
    kreise[0] = new Kreis(10, 10, 30, 30, Color.RED);
    kreise[1] = new Kreis(45, 10, 30, 30, Color.BLUE);
    kreise[2] = new Kreis(80, 10, 30, 30, Color.ORANGE); 
	
	Kreis k1, k2, k3;
	Viereck v;

	public void start() {
		k1 = new Kreis(10, 10, 30, 30, Color.RED);
		k2 = new Kreis(45, 10, 30, 30, Color.BLUE);
		k3 = new Kreis(80, 10, 30, 30, Color.ORANGE);
		v = new Viereck(10, 50, 20, 40, Color.GRAY);
	}

	public void paint(Graphics g) {
		k1.paint(g);
		k2.paint(g);
		k3.paint(g);
		v.paint(g);
	}
}

public class Kreis {
	private int x = 0;
	private int y = 0;
	private int breite = 0;
	private int hoehe = 0;
	private java.awt.Color farbe;

	public Kreis(int x, int y, int breite, int hoehe, java.awt.Color farbe) {
		this.x = x;
		this.y = y;
		this.breite = breite;
		this.hoehe = hoehe;
		this.farbe = farbe;
	}

	public void paint(java.awt.Graphics g) {
		g.setColor(this.farbe);
		g.fillOval(this.x, this.y, this.breite, this.hoehe);
	}
}

public class Viereck {
		private int x = 0;
		private int y = 0;
		private int breite = 0;
		private int hoehe = 0;
		private java.awt.Color farbe;

		public Viereck(int x, int y, int breite, int hoehe, java.awt.Color farbe) {
			this.x = x;
			this.y = y;
			this.breite = breite;
			this.hoehe = hoehe;
			this.farbe = farbe;
		}

		public void paint(java.awt.Graphics g) {
			g.setColor(this.farbe);
			g.fillRect(this.x, this.y, this.breite, this.hoehe);
		}
}
 
dann dürfte aber

Code:
public class MyApplet extends Applet {
   
    k1 = new Kreis(10, 10, 30, 30, Color.RED);
   
   Kreis k1, k2, k3;
   Viereck v; 
...

genausowenig funktioniern, immer erst die alten Sachen probieren

nun ja, also einmal muss man das lernen dann weiß man es hoffentlich:
man darf normale Befehle nicht einfach so in die Klasse schreiben,
die gehören in einen Konstruktor oder in eine Operation,
z.B. da wo früher
k1 = new Kreis(10, 10, 30, 30, Color.RED);
stand, in der start()-Operation,
das ist selbstverständlich der richtige Platz auch weiterhin,
wieso wolltest du woanders hin? 😉
 
Code:
import java.applet.Applet;
import java.awt.*;
public class MyApplet extends Applet {
	Kreis k1, k2, k3;
	Viereck v;

	public void start() {
		
	    Kreis[] kreise = new Kreis[3];
	    kreise[0] = new Kreis(10, 10, 30, 30, Color.RED);
	    kreise[1] = new Kreis(45, 10, 30, 30, Color.BLUE);
	    kreise[2] = new Kreis(80, 10, 30, 30, Color.ORANGE); 
	    
	    k1 = kreise[0];
	    k2 = kreise[1];
	    k3 = kreise[2];
		v = new Viereck(10, 50, 20, 40, Color.GRAY);
	}

	public void paint(Graphics g) {
		k1.paint(g);
		k2.paint(g);
		k3.paint(g);
		v.paint(g);
	}
}

Ok, das geht soweit 🙂

danke
 
Code:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MyApplet extends Applet implements MouseListener {
	Kreis k1, k2, k3;
	Viereck v;
        public void init() {
	    addMouseListener(this);
        }
	public void start() {
		
	    Kreis[] kreise = new Kreis[3];
	    kreise[0] = new Kreis(10, 10, 30, 30, Color.RED);
	    kreise[1] = new Kreis(45, 10, 30, 30, Color.BLUE);
	    kreise[2] = new Kreis(80, 10, 30, 30, Color.ORANGE); 
	    
	    k1 = kreise[0];
	    k2 = kreise[1];
	    k3 = kreise[2];
		v = new Viereck(10, 50, 20, 40, Color.GRAY);
	}
	public void mouseClicked(MouseEvent event){
		int xClick, yClick;
		
		xClick = event.getX();
		yClick = event.getY();
		
		k1.setColor();

		repaint();
	}
	public void mouseEntered(MouseEvent event){ }
	public void mouseExited(MouseEvent event){ }
	public void mousePressed(MouseEvent event){ }
	public void mouseReleased(MouseEvent event){ }
	
	public void paint(Graphics g) {
		k1.paint(g);
		k2.paint(g);
		k3.paint(g);
		v.paint(g);
	}
}

public class Kreis {
	private int x = 0;
	private int y = 0;
	private int breite = 0;
	private int hoehe = 0;
	private java.awt.Color farbe;

	public Kreis(int x, int y, int breite, int hoehe, java.awt.Color farbe) {
		this.x = x;
		this.y = y;
		this.breite = breite;
		this.hoehe = hoehe;
		this.farbe = farbe;
	}

	public void setColor() {
		this.farbe = java.awt.Color.BLUE;
	}
	public void paint(java.awt.Graphics g) {
		g.setColor(this.farbe);
		g.fillOval(this.x, this.y, this.breite, this.hoehe);
	}
}

public class Viereck {
		private int x = 0;
		private int y = 0;
		private int breite = 0;
		private int hoehe = 0;
		private java.awt.Color farbe;

		public Viereck(int x, int y, int breite, int hoehe, java.awt.Color farbe) {
			this.x = x;
			this.y = y;
			this.breite = breite;
			this.hoehe = hoehe;
			this.farbe = farbe;
		}

		public void paint(java.awt.Graphics g) {
			g.setColor(this.farbe);
			g.fillRect(this.x, this.y, this.breite, this.hoehe);
		}
}


sooo 🙂

wie bekomm ich denn nun raus, auf welchen Kreis geklickt wurde?
 
die Liste der Kreise duchgehen (Schleife) und für jeden prüfen ob die Mauskoordinaten da drin sind,
am bestem in einer Operation in der Klasse Kreis,

bisschen Mathematik 😉
 
Ok,

ich geh mein Array keise durch und stelle fest das im array
kreise[1](eigentlich ja kreis2) der Kreis geklickt wurde...

kreise[1].setColor();
geht nicht
 
Moin,
mir fällt gerade auf das ich die geklickten Koordinaten garnicht mit den der Objekte vergleichen kann weil ich die
nicht ansprechen kann....
kreise[1].x geht ja nicht.

Wie könnte man das jetzt machen?
 
Ich zitiere mich ja nur ungern selbst, aber
Redfrettchen hat gesagt.:
Für deine Test benötigst du allerdings noch Getter für die internen Variablen oder eine Methode, die die Überprüfung vornimmt.

Also zum Beispiel:
Code:
public class Kreis {
    // ...
    public boolean contains(int x, int y) {
        return (Math.sqrt((x-this.x)*(x-this.x)+(y-this.y)*(y-this.y))<=breite/2);
    }
}
btw, ein Kreis sollte besser über seinen Radius als über Breite und Höhe definiert werden.
 
Hi,
ja das habe ich auch nicht vergessen
aber wie soll ich diese Methode in meiner for-Schleife aufrufen?
Code:
for (int i = 0; i <= 2 ; i++) {
kreise[i].contains ..
}
 
Code:
   public void mouseClicked(MouseEvent event){ 
      int xClick, yClick; 
       
      xClick = event.getX(); 
      yClick = event.getY(); 
      
      for (int i=0; i<3; i++) {
          if (kreise[i].contains(xClick,yClick)) {
              // mach was
          }
      }
      // ...
   }
 
bevor du sowas kompliziertes wie contains ausprobierst,
vergewissere dich doch erst, dass das Array kreise überhaupt da ist?!

durchlaufe es einmal, gib die Länge aus, gibt die Objekte einmal aus..,

Kreis[] kreise = new Kreis[3];
ist nur lokal in der Operation start definiert,
dass muss in der Klasse stehen!
(aber nicht die anderen Befehle aus start)
 
Tomes J. hat gesagt.:
Eclipse Fehlermeldung:
kreise connot be resolved
>.>
Natürlich muss die gesamte Klasse auf das Array zugreifen können. Sonst hat es wenig Sinn... Am besten ersetzt du die einzelnen Variablen k1, k2 und k3 durch das Array (alles was vorher auf die Variablen zugegriffen hat, muss jetzt natürlich mit dem Array arbeiten).
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben