Codeoptimierung: Verschieben von Symbolen

antimon

Mitglied
Hallo zusammen,

ich würde gern mal einen Ansatz vorstellen den ich mir überlegt habe und Eure Meinung dazu hören, was verbessert und optimiert werden könnte:

Folgendes Szenario:
Auf einem Panel sind verschiedene Symbole (Item) untergebracht, die von JPanel abgeleitet sind und auf denen ich zeichne. Jedes Item hat ein ItemModel, das Informationen über Position, Größe, etc. enthält. Diese Informationen werden in internen Einheiten gespeichert und dann auf Bildschirmpixel umgerechnet, beispielsweise kann ein Symbol 1x1 cm groß sein und je nach Zoom auf der Arbeitsfläche 16x16 Pixel oder 20x20 Pixel betragen.

Änderungen am Model werden dem Item über ein ChangeEvent mitgeteilt, das daraufhin per setLocation() und setSize() die Abmessungen und den Ort setzt und sich neu zeichnet.

Um ein oder mehrere Items verschieben zu können, werden diese beim Anklicken einem ItemSelectionModel hinzugefügt, das damit also alle markierten Items enthält.

Zum Verschieben wird dem ItemSelectionModel eine Positionsänderung des Mauszeigers mitgeteilt, also beispielsweise zwei Pixel nach rechts, ein Pixel nach oben, dieses berechnet anhand des aktuellen Zoomfaktors die relativen Koordinaten im internen Koordinatensystem und setzt dann nacheinander für alle seine Items die Koordinaten neu.

Damit läuft dann eine Verschiebung nach folgendem Schema ab:
1. Ein Item empfängt ein MouseEvent und ermittelt die relative Verschiebung in Pixeln
2. Die Daten werden an das ItemSelectionModel gesendet, das daraufhin die relativen internen Koordinaten berechnet und an die einzelnen ItemModels sendet.
3. Die ItemModels teilen dem Item (also dem eigentlichen grafischen Symbol auf der Oberfläche) mit, dass sich die Daten geändert haben
4. Die Items zeichnen sich anhand der geänderten Daten neu

An sich läuft das Szenario, wie oben beschrieben. Allerdings läuft die Bewegung nicht sehr flüssig. Bei einem Symbol gehts noch, bei zweien wirds schon unangenehmer...

Ohne jetzt detailliert auf Code eingehen zu wollen, erst mal prinzipiell: Ist oben genanntes Konzept einigermaßen vernünftig? Oder gibt es bessere Ansätze, die effizienter ablaufen?

Wenn das geklärt ist, poste ich auch gerne Code, anhand dessen man vielleicht sehen kann, was optimiert werden dürfte. Ich will euch nur nicht gleich zu Anfang mit zu vielen Informationen erschlagen. Interessant wäre beispielsweise ob es viel bringen würde, generell in Pixeln zu verschieben und erst bei Beendigung des Vorgangs die internen Koordinaten zu berechnen - oder ob man statt die Symbole einzeln neu zu positionieren vielleicht besser eine Zwischengrafik aus den Sybolen berechnet, die als ein Stück verschoben wird. Und wenn der Vorgang beendet ist, berechnet man erst die Koordinaten der einzelnen Symbole neu und setzt diese an die entsprechende Stelle...

Für alle konstruktiven Hinweise und Tips bin ich sehr dankbar!
 
hi antimon,
mal eine Frage, habe ich Dich richtig verstanden, dass Du zur Darstellung eines jeden Deiner Symbole ein JPanel bzw. eine Ableitung davon verwendest?
Wenn ja, welche Notwendigkeit hat zu dieser Strategie geführt?
Ich würde eher dazu übergehen ein JPanel zum Zeichen mittels überschriebener paintComponent()-Routine zu implementieren, da ich bei JPanel pro Symbol einen zu großen Overhead befürchten würde.
Stattdessen würde ich die Symbole in einem entsprechenden "Editier"-Modus direkt auf dem Darstellungspanel vom User zeichnen lassen (z.B. durch angabe von Punkten wenn es reicht die Symbole mittels Polygone darzustellen).

Falls Du mehr Infos dazu brauchst, sag bescheid.

Takidoso
 
Welche Strategie... hmm ich würd sagen die der Faulheit und Unwissenheit. Verschieben geht halt einfach per setLocation() und gezeichnet werden kann einfach durch Überlagern der paintComponent()-Methode... aber du hast Recht, mittlerweile habe ich nach einigen Versuchen gemerkt, dass das nicht das optimalste is...

Also Infos dazu hätte ich natürlich immer gerne ;) Ich hab mich bisher nämlich noch nicht so viel mit Zeichnen und Java2D beschäftigt, das möchte ich aber auf jeden Fall nachholen... über alle Infos bin ich dir dankbar.
 
Zurück