Swing Shapes in der richtien reihen folge ?

poku17

Mitglied
Hallo, ich schreibe zurzeit an einem kleinen mal programm und habe mal wieder ein kleines problem...
habe es nun endlich hinbekommen, dass die shapes die in zwei LinkedList<Object[]> aufgeteilt sind (nach fuellen oder nur außenlinie zeichnen) in ein array getan wird um die richtige farbe noch zu zuweisen.

Nur leider, liegen jetzt die nicht gefuellten immer unter den gefuellten shapes weil ich mit for each nach einander durch beide iteriere. Aszug des Probs aus der paintCommponent() - Methode :

[Java]
Object[] obj = {g2d.getColor(), rect};

if(DrawOrFill == 0){
g2d.draw(rect);
drawed.add(obj);
}
if(DrawOrFill == 1){
g2d.fill(rect);
filled.add(obj);
}

for(Object[] obj : drawed){
Color clr = (Color) obj[0];
Shape s = (Shape) obj[1];
g2d.setColor(clr);
Rectangle2D.Float rec = (Rectangle2D.Float) s;
g2d.draw(rec);
}
for(Object[] obj : filled){
Color clr = (Color) obj[0];
Shape s = (Shape) obj[1];
g2d.setColor(clr);
Rectangle2D.Float rec = (Rectangle2D.Float) s;
g2d.fill(rec);
}
[/Java]


Wie koennte ich das besser und ueberhaupt richtig machen ?^^

Noch nen drittes objekt in das array, welches den index des Shape-Objects speichert ??


[Java]
Object[] obj = {g2d.getColor(), rect, count};

if(DrawOrFill == 0){
g2d.draw(rect);
drawed.add(obj);
}
if(DrawOrFill == 1){
g2d.fill(rect);
filled.add(obj);
}

count++;

for(int i = 0; i < (drawed.size() + filled.size()); i++){

if(drawed.get(i)[2] == i){ // Beim Fuellen, IndexOutOfBound 3; Außenlinien gehen
if(drawed.get(i) != null){
Object obj[] = drawed.get(i);
Color clr = (Color) obj[0];
Shape s = (Shape) obj[1];
g2d.setColor(clr);
Rectangle2D.Float rec = (Rectangle2D.Float) s;
g2d.draw(rec);
}
}
else if(filled.get(i)[2] == i){
if(filled.get(i) != null){
Object obj[] = filled.get(i);
Color clr = (Color) obj[0];
Shape s = (Shape) obj[1];
g2d.setColor(clr);
Rectangle2D.Float rec = (Rectangle2D.Float) s;
g2d.fill(rec);
}
}
}
[/Java]

Bekomme es gerade iwie echt nicht hin...
hab einen fehler beim 2. eben erkannt, klar ist i zu groß, wenn ich dann von drawed auf filled wechsele... gerade echt ka mehr zu viel den kopf heute an dem prog zerbrochen ^^

wie wuerdet ihr vorgehen/es lösen ?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das mit dem Array sieht an sich erstmal sehr hakelig aus. Vielleicht solltest du dir dafür lieber eine Klasse erstellen, wie z.B.
Java:
interface PaintedObject
{
    Shape getShape();
    Paint getPaint();
    ... was man sonst noch braucht, z.B. einen index....
}

Das vorderdründige Problem könnte man natürlich lösen, indem man die beiden for-Schleifen vertauscht
Java:
for(Object[] obj : filled){ ... }
// Danach:
for(Object[] obj : drawed){ ... }
Aber spätestens bei den gefüllten wirst du dir ggf. auch IN einer dieser Mengen über die Reihenfolge Gedanken machen müssen - dann könnte "PaintedObject" ggf. einen Index haben, und man fügt neue Elemente ihrem Index entsprechend ein. (Kein Index in der Liste, sondern nur ein beliebiger int, der besagt, in welcher Reihenfolge die Shapes gefüllt werden - also z.B. auch eins mit Index "-8" VOR einem mit Index "-2" oder so...). Muss man sich aber noch genauer überlegen....
 

poku17

Mitglied
Hatte nur an Collections gedacht und welche die geignetste ist, und vllt noch wie ich 2 objekt plus index in einem Feld hinterlegen kann, aber dass ich nicht dran gedacht habe mir dafuer einfach ne kleine klasse zu kreieren... naja, thx ^^
 

poku17

Mitglied
hier noch wie ich den abschnitt, dank Marco13, schnell gelöst habe:

[Java]
if(shape.equals("rect")){
if(DrawOrFill == 0){
PaintObject po = new PaintObject(rect, g2d.getColor(), count, false);
g2d.draw(rect);
pObjects.add(po);
}
if(DrawOrFill == 1){
PaintObject po = new PaintObject(rect, g2d.getColor(), count, true);
g2d.fill(rect);
pObjects.add(po);
}
count++;
}

for(PaintObject po : pObjects){
Color clr = po.getColor();
Shape s = po.getShape();
g2d.setColor(clr);
Rectangle2D.Float rec = (Rectangle2D.Float) s;
if(po.isFilled()){
g2d.fill(rec);
}
else{
g2d.draw(rec);
}
}
[/Java]

und die Klasse PaintObject:

[Java]
class PaintObject{
private int index;
private Shape shape;
private Color color;
private boolean fill;

PaintObject(Shape s, Color c, int idx, boolean b){
index = idx;
color = c;
shape = s;
fill = b;
}

public int getIndex(){
return index;
}
public Shape getShape(){
return shape;
}
public Color getColor(){
return color;
}
public boolean isFilled(){
return fill;
}

}
[/Java]

Wenn sie alle in einer Liste sind, sind sie auch gleich richtig angeordnet auch wenn sie jetzt trotzdem nen index haben^^ So hat sich das Problem zumindest schon einmal erübrigt :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
M Java FX größe der shapes anpassen AWT, Swing, JavaFX & SWT 0
J JavaFX Shapes (Line) erweitern AWT, Swing, JavaFX & SWT 11
J JavaFX Intersect Problem mit Shapes AWT, Swing, JavaFX & SWT 10
S Irgendwie verstehe ich die Winding-Rules bei Shapes nicht :( AWT, Swing, JavaFX & SWT 4
M Swing Shapes setzen AWT, Swing, JavaFX & SWT 4
M 3D-Grafik Denkfehler bei Verschieben von Shapes AWT, Swing, JavaFX & SWT 0
P Swing Dynamisch zeichnen mit Shapes wie Rectangle2D.Float ? AWT, Swing, JavaFX & SWT 6
4 Shapes Informationen wie Breite usw. mitgeben AWT, Swing, JavaFX & SWT 5
N Zusammenfügen von Shapes AWT, Swing, JavaFX & SWT 8
S 2D-Grafik Shapes auf Zeichenfläche gleichmäßig verschieben AWT, Swing, JavaFX & SWT 5
S Wie detektiere ich am schnellsten ob sich 2 Shapes ueberlappen oder nicht? AWT, Swing, JavaFX & SWT 3
L JFreeChart - Line Shapes AWT, Swing, JavaFX & SWT 15
F [Java 1.5] Shapes auf einem JPanel zoomen AWT, Swing, JavaFX & SWT 11
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
B Swing JTable mit Daten - Reihen-Größe anpassen AWT, Swing, JavaFX & SWT 0
M Problem mit Festsetzen der Anzahl ein reihen in einer JTable AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen


Oben