Hi
Wie einige vielleicht wissen arbeite ich zur Zeit (wieder mal) an Swogl . Damit kann man Swing-Components auf 3D-Flächen pappen und die dann frei im Raum anordnen. Im speziellen geht es jetzt darum, wie man den möglichen Benutzern der Bibliothek die Möglichkeit geben kann, die Interaktion mit Swogl bequem und trotzdem flexibel zu konfigurieren.
In der ersten alpha-Version gab es einige Möglichkeiten zur Interaktion, aber die waren durch die Implementierung festgelegt: Standardmäßig gingen alle Mouse Events an die Swing-Componenten. Mit CTRL+MouseDrags konnte man die Kamera bewegen. Mit ALT+MouseDrags konnte man das Layout der 3D-Komponenten im Raum verändern - abhängig davon, welcher 3D-LayoutManager gerade aktiv war.
So hat z.B. das "WheelLayout3D", das die Komponenten wie in einem Rad angeordnet hat, dieses Rad naheliegenderweise entsprechend der Rotation des Mausrades gedreht. Jemand anderes würde das Rad aber vielleicht gerne durch Ziehen mit der Linken Maustaste drehen. Und vielleicht nur wenn gleichzeitig noch CTRL und SHIFT gedrückt sind :autsch: Deswegen habe ich als erstes das "Verhalten" der LayoutManager, Kamerasteuerung und sonstigen Interaktionsmöglichkeiten von der Eventverarbeitung getrennt.
Trotzdem gibt es für jedes mögliche Interaktionsmuster verschiedene Listener, die benötigt werden: Manche Interaktionen brauchen MouseListener, andere MouseWheelListener, andere KeyListener bzw. InputMaps, oder auch beliebige Kombinationen davon. Je nachdem, wie viele "Aspekte" die Interaktion umfasst. Bei der Kamera kann man schon Drehen+Bewegen+Zoomen, und das jeweils mit dem Mausrad oder Mausbewegungen oder Mausdrags...
Dass es einen gewissen Trade-off zwischen einfacher Anwendbarkeit und feingranularer Konfigurierbarkeit gibt ist wohl klar. Inzwischen habe ich einen ganzen Haufen mehr oder weniger ausgearbeiteter Ansätze, aber die kann ich schwer alle hier posten. Insgesamt habe ich aber das Gefühl, dass alles, was "genug" Konfigurierbarkeit bietet, mindestens genauso kompliziert ist, wie die Listener alle per Hand zu implementieren und zu verdrahten.
Deswegen wollte ich mal fragen, ob jemand eine Idee hat, wie man das Problem angehen könnte (oder ... ob die einhellige Meinung ist, dass das ohnehin vollkommen egal ist, und der Benutzer das selbst implementieren sollte )
bye
Marco
Wie einige vielleicht wissen arbeite ich zur Zeit (wieder mal) an Swogl . Damit kann man Swing-Components auf 3D-Flächen pappen und die dann frei im Raum anordnen. Im speziellen geht es jetzt darum, wie man den möglichen Benutzern der Bibliothek die Möglichkeit geben kann, die Interaktion mit Swogl bequem und trotzdem flexibel zu konfigurieren.
In der ersten alpha-Version gab es einige Möglichkeiten zur Interaktion, aber die waren durch die Implementierung festgelegt: Standardmäßig gingen alle Mouse Events an die Swing-Componenten. Mit CTRL+MouseDrags konnte man die Kamera bewegen. Mit ALT+MouseDrags konnte man das Layout der 3D-Komponenten im Raum verändern - abhängig davon, welcher 3D-LayoutManager gerade aktiv war.
So hat z.B. das "WheelLayout3D", das die Komponenten wie in einem Rad angeordnet hat, dieses Rad naheliegenderweise entsprechend der Rotation des Mausrades gedreht. Jemand anderes würde das Rad aber vielleicht gerne durch Ziehen mit der Linken Maustaste drehen. Und vielleicht nur wenn gleichzeitig noch CTRL und SHIFT gedrückt sind :autsch: Deswegen habe ich als erstes das "Verhalten" der LayoutManager, Kamerasteuerung und sonstigen Interaktionsmöglichkeiten von der Eventverarbeitung getrennt.
Trotzdem gibt es für jedes mögliche Interaktionsmuster verschiedene Listener, die benötigt werden: Manche Interaktionen brauchen MouseListener, andere MouseWheelListener, andere KeyListener bzw. InputMaps, oder auch beliebige Kombinationen davon. Je nachdem, wie viele "Aspekte" die Interaktion umfasst. Bei der Kamera kann man schon Drehen+Bewegen+Zoomen, und das jeweils mit dem Mausrad oder Mausbewegungen oder Mausdrags...
Dass es einen gewissen Trade-off zwischen einfacher Anwendbarkeit und feingranularer Konfigurierbarkeit gibt ist wohl klar. Inzwischen habe ich einen ganzen Haufen mehr oder weniger ausgearbeiteter Ansätze, aber die kann ich schwer alle hier posten. Insgesamt habe ich aber das Gefühl, dass alles, was "genug" Konfigurierbarkeit bietet, mindestens genauso kompliziert ist, wie die Listener alle per Hand zu implementieren und zu verdrahten.
Deswegen wollte ich mal fragen, ob jemand eine Idee hat, wie man das Problem angehen könnte (oder ... ob die einhellige Meinung ist, dass das ohnehin vollkommen egal ist, und der Benutzer das selbst implementieren sollte )
bye
Marco
Zuletzt bearbeitet von einem Moderator: