Über Draw2D und ArrayList

deLeet

Grünschnabel
Hallo Leute

Ich bin heute auf etwas gestoßen, dass mich völlig verrückt macht. Mein Leben lang habe ich mit java.util.ArrayList gearbeitet, doch jetzt beim debuggen fällt mir etwas auf, das mich ein wenig verstört. Ich erkläre aber kurz, wie es dazu kam:

Ich möchte etwas zeichnen lassen und dazu nutze ich die Methode getPreferredSize() von IFigure
Ich habe ein Figure-Objekt, das mit add() ein Label hinzufügt. Vor dieser Operation ist die children-Liste leer, danach aber bereits von der Größe 2 (das ist in Draw2D merkwürdigerweise so implementiert). Das ist deshalb blöd, weil Element 0 zwar seine Größe kennt, aber nicht Element 1, das nämlich null ist. Also stürzt er bei getPreferredSize ab, da man vom null Objekt nicht besonders viel erwarten kann :)
Dann habe ich einen Workaround probiert, indem ich versucht habe, das null-Objekt aus der children-Liste zu löschen mit remove(1);
Dabei stelle ich verwirrt fest, dass die RangeCheck Methode der ArrayList so aussieht:

Code:
    /**
     * Check if the given index is in range.  If not, throw an appropriate
     * runtime exception.  This method does *not* check if the index is
     * negative: It is always used immediately prior to an array access,
     * which throws an ArrayIndexOutOfBoundsException if index is negative.
     */
    private void RangeCheck(int index) {
	if (index >= size)
	    throw new IndexOutOfBoundsException(
		"Index: "+index+", Size: "+size);
    }

An der Stelle steht index >= size . Zusätzlich dazu, dass ich > verstehen würde, aber >= nicht, kommt, dass im Debugmodus index nicht resolved werden kann, aber unter den Variablen arg0 mit 1 belegt ist. OK.

Was zur Hölle? Das kann doch so nicht richtig sein! Dann habe ich probiert, nicht Element 1 zu entfernen (null), um die Größe auf 1 zu reduzieren, sondern Element 0. Das geht auch, aber die Liste bleibt von der Größe 2 und hat nun 2 null-Objekte. Aber er müsste doch aufschieben :confused:

Was mache ich falsch?

Übrigens könnte ich gute Online-Literatur zum Thema "kaskadierte Objekte unter SWT oder Draw2D zeichen lassen" gebrauchen. Ich versuche, einen bestimmten proprietären Typen aus XML zeichnen zu lassen, könnt euch ja vorstellen, wie das visualisiert etwa aussieht (ähnlich SpaceTree nur ohne großes Trara).
PSS: Wieso funktioniert die Abfrage auf einem org.eclipse.draw2d.Button auf einen einfachen Mausklick nicht? Ich habe folgendes implementiert
MouseListener blabla
public void mousePressed(MouseEvent me) { }
public void mouseReleased(MouseEvent me) { }
public void mouseDoubleClicked(MouseEvent me) { }

Unter Pressed und Released passiert aber nichts. Nur DoubleClicked funktioniert.

Mann Mann Mann, so viele Probleme auf einmal...

Vielen Dank :rolleyes:
 
Hallo,

also die Methode der ArrayList ist korrekt.

Wenn size = 1 ist der einzige gültige index = 0. Also index < size. Wenn jetzt index = 1 wäre also index = size, wäre der Index zu groß und es wird eine ArrayIndexOutOfBoundsException geworfen.

MFG

zEriX
 
Ja, irgendwie stimmt das.

Aber ich habe 2 Einträge in der Liste, das sehe ich ja im Debugger. Nun versuche ich, Element 1 (nicht 0) zu löschen, aber das funktioniert nicht. Wie kann denn das sein?
Ich kann gern einen Screenshot per Mail verschicken, anhängen habe ich hier nicht gefunden :)
Ist ja sowieso nur ein Workaround, würde es sowieso gern anders als über remove() lösen
 
OK das MouseListener-Problem ist gelöst, ich habe jetzt den SWT Button genommen, da funktioniert das.
2 Remaining ;)

falls das jetzt so aussah: das ursprüngliche Problem besteht weiterhin
 
Zuletzt bearbeitet:
So Leute, nochma Butter bei die Fische

PSS: Wieso funktioniert die Abfrage auf einem org.eclipse.draw2d.Button auf einen einfachen Mausklick nicht? Ich habe folgendes implementiert
MouseListener blabla
public void mousePressed(MouseEvent me) { }
public void mouseReleased(MouseEvent me) { }
public void mouseDoubleClicked(MouseEvent me) { }

Unter Pressed und Released passiert aber nichts. Nur DoubleClicked funktioniert.
 
Hallo

Ich habe gestern das erste mal festgestellt, dass mousePressed auf die rechte Maustaste reagiert, nicht aber auf die linke. Warum auch immer

Und:
Wieso ist es während des Konstruktors der rootFigure nicht möglich, die Methode getPreferredSize() auf bereits fertig erstellten Unterelementen aufzurufen? Das geht bei mir erst, nachdem ich dem lws gesagt habe setContents und dann eine Methode aufrufe. Erst dann kann ich getPreferredSize() nutzen. Warum das so ist, ist mir allerdings nicht ganz klar
 
Zuletzt bearbeitet:
Zurück