Viewer - ein JPanel zum Zoomen, Verschieben und Rotieren

Man wünscht es sich immer wieder mal, und wenn man es „mal schnell bräuchte“ macht man es meistens „mal schnell“ (und schmeißt es dann weg…), deswegen habe ich mal versucht, es so zu machen, dass man es wiederverwenden kann: Ein Panel, mit dem man das gezeichnete verschieben, rotieren und skalieren kann.

Das geht an sich erstmal recht einfach (und tatsächlich ist das jetzt ziemlich genau das, was ich vor 3 Jahren mal woanders als Foren-Antwort geschrieben hatte), aber der Teufel steckt im Detail und den ganzen Freiheitsgraden, die es da gibt, und die man erstmal nicht unbedingt bedenkt.

Auch das aktuelle ist noch nicht so weit konfigurierbar, wie man es sich (nahe liegender Weise) wünschen würde. Aber spätestens, wenn man den Wunsch hat, über die API zu bestimmen, wie schnell sich das gezeichnete bei einem Mouse-Drag denn dreht, könnte man auch sagen: Schreib dir deinen eigenen MouseMotionListener dafür. Im Moment gibt es einige „Standard-MouseControls“, die so weit ihren Zweck erfüllen sollten.

Das ganze liegt unter GitHub - javagl/Viewer: A Java Swing viewer that allows rotation, translation and zooming , und ist auch früher oder später als


<dependency>
  <groupId>de.javagl</groupId>
  <artifactId>viewer</artifactId>
  <version>0.0.1</version>
</dependency>

in der Maven Central.

(Wenn Sonatype wieder aufwacht - ist es normal, dass es eine Weile dauert, bis etwas releastes in der Staging-Area auftaucht? :confused:
→ EDIT: Ha, da isses - war als falscher Benutzer eingeloggt :o )

Die ViewerFunctions und ViewerCells sind nun Teil dieses Projektes. Die Projekte sind auch bald (in Version 0.1.0) in der Maven Central zu finden:

<dependency>
  <groupId>de.javagl</groupId>
  <artifactId>viewer-core</artifactId>
  <version>0.1.0</version>
</dependency>

<dependency>
  <groupId>de.javagl</groupId>
  <artifactId>viewer-cells</artifactId>
  <version>0.1.0</version>
</dependency>

<dependency>
  <groupId>de.javagl</groupId>
  <artifactId>viewer-functions</artifactId>
  <version>0.1.0</version>
</dependency>