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!
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!