Entwurfsmodus für java.awt.Graphics2D

vorhergehende Artikel in: Java Komponenten
04.03.2023

Es ist jetzt bereits einige Zeit vergangen seitdem ich über Versuche berichtet habe, den "Servietten-Look" wie bei SketchViz oder Rough.js auch in Java-Programmen zu erreichen. Letztes Mal berichtete ich über komplexe Strokes, mit denen sich so etwas realisieren ließe.

Ich habe dieses Projekt also jetzt im Urlaub nochmals hervorgeholt und versucht, eine Art Abschluss dafür zu finden. Das Ziel für dieses Mal war, einen transparenten Graphic-Context zu schaffen, in den man einfach zeichnen könnte wie in normalen Java-Programmen und der aus sich heraus den "handgemachten" Look erzeugen würde.

Dafür habe ich den Code aus einem der im letzten Versuch vorgestellten Strokes extrahiert und in eine Klasse gepackt, die von java.awt.Graphics2D abgeleitet wurde. Darin sind alle Methoden zum Zeichnen vom primitiven Graphikobjekten, die sich als Vektoren oder java.awt.Shape beschreiben lassen entsprechend überschrieben. Der Graphic-Context selbst ist so beschaffen, dass man die "Sloppiness" - also den Grad um den die Zeichnung von der jeweiligen präzisen Form abweicht - konfigurieren kann. Die einzigen Primitiven, die bisher nicht unterstützt werden sind 3D-Rechtecke.

Sowohl die Umrandung wie auch gefüllte Versionen der Primitiven werden unterstützt.

Außerdem ist noch anpassbar, ob die Form einmal oder - wie in manuellen Skizzen hin und wieder - leicht voneinander abweichend mehrfach gezeichnet werden soll. Ich zeige hier zwei Demonstrationen des Ergebnisses - rot sind die jeweiligen präzisen Darstellungen und überlagernd in schwarz die "sloppy" Versionen dargestellt. Bei gefüllten Versionen wurde die Deckkraft auf 50% abgesenkt um beide Versionen einfacher vergleichen zu können. Unten links sieht man, dass auch andere Strokes benutzt werden können - einmal ist ein dickerer Strich zu sehen, einmal ein unterbrochener.

Zunächst eine Version mit geringerer Sloppiness - also ein, deren Ergebnis näher am präzisen Original ist:

Screenshot Verschiedene graphische Primitiven präzise (rot) und mit geringer Sloppiness (schwarz)

Im Gegensatz dazu eine Version mit deutlich erhöhter Sloppiness:

Screenshot Verschiedene graphische Primitiven präzise (rot) und mit höherer Sloppiness (schwarz)

Man könnte jetzt fragen, ob sich dieser Graphics-Context auch für normale GUIs von Anwendungen einsetzen ließe (wer würde so etwas tun wollen?) - und man muss antworten: nein. Wie man im folgenden Screenshot sehen kann, sind die normalen Swing-Controls darauf ausgelegt, dass ihre Grundform Rechtecke mit geraden Kanten sind - sobald man diese in einem entsprechenden Canvas darstellt, was dazu führt, dass ihre Konturen eben keine solchen Rechtecke mehr sind werden die Kanten gnadenlos vom jeweiligen UI überzeichnet und verschwinden, so dass der visuelle Eindruck des Ergebnisses iom besten Falle fragwürdig erscheint:

Screenshot Eine JTable mit dem neuen Graphic-Context dargestellt

Die aktuelle Version dieses Experiments kann auf Gitlab eingesehen werden. Die wichtige Klasse ist dabei RoughGraphics.

Derzeit ist das eine Software im Status "final pre-alpha" - also auf gar keinen Fall zum Produktiveinsatz vorgesehen und selbst bei Einsatz im experimentellen Umfeld ist noch Vorsicht geboten!

Zur Illustration meiner Beweggründe der Implementierung des Verfahrens als transparenten java.awt.Graphics2D hier noch eine SVG-Graphik, die ich aus der oben gezeigten Demo erzeugt habe, indem ich den Inhalt des neuen RoughGraphics in einen SVG-Canvas aus dem Apache Batik Projekt ausgegeben habe:

Screenshot Verschiedene graphische Primitiven direkt aus dem neuen RoughGraphics als SVG

Artikel, die hierher verlinken

Konstruktive Geometrie mit dem Computer

25.03.2024

Ich habe in einem vorhergehenden Artikel beschrieben, dass ich eine weitere neue Graphik-Primitive erstellt habe. Dabei musste ich mir meine verschütteten Trigonometrie-Kenntnisse wieder vor Augen führen - mit Bleistift und Papier. Das müsste doch auch anders gehen dachte ich mir und begann...

Gleichseitige Dreiecke mit abgerundeten Ecken für Java

09.03.2024

Ich habe - nach einer Inspiration aus dem Internet - wieder einmal eine neue Graphic-Primitive für Javas Graphics2D erstellt

Neue Graphik-Primitiven für java.awt.Graphics2D

18.03.2023

Ich wollte eine Methode schaffen, neue Graphik-Primitiven, die zumindest in java.awt.Graphics2D - in Java noch fehlen, zu ergänzen.

Schraffuren für java.awt.Graphics2D

12.03.2023

Ich wollte eine Methode schaffen, unterschiedlichste Schraffuren in beliebigen Shapes zu erzeugen. diese Möglichkeit fehlt - zumindest in java.awt.Graphics2D - in Java noch.

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Certstream, InfluxDB, Grafana und Netflix

    16.04.2019

    Nachdem ich vor kurzem über mein erstes Spielen mit dem certstream berichtete, habe ich weitere Experimente gemacht und die Daten zur besseren Auswertung in eine InfluxDB gepackt, um sie mit Grafana untersuchen zu können.

    Weiterlesen...

Neueste Artikel

  • Die sQLshell ist nun cloudnative!

    Die sQLshell hat eine weitere Integration erfahren - obwohl ich eigentlich selber nicht viel dazu tun musste: Es existiert ein Projekt/Produkt namens steampipe, dessen Slogan ist select * from cloud; - Im Prinzip eine Wrapperschicht um diverse (laut Eigenwerbung mehr als 140) (cloud) data sources.

    Weiterlesen...
  • LinkCollections 2024 III

    Nach der letzten losen Zusammenstellung (für mich) interessanter Links aus den Tiefen des Internet von 2024 folgt hier gleich die nächste:

    Weiterlesen...
  • Funktionen mit mehreren Rückgabewerten in Java

    Da ich seit nunmehr einem Jahr bei meinem neeun Arbeitgeber beschäftigt und damit seit ungefähr derselben Zeit für Geld mit Python arbeite, haben sich gewisse Antipathien gegenüber Python vertieft (ich kann mit typlosen Sprachen einfach nicht umgehen) - aber auch einige meiner Gründe, Python zu lieben sind ebenso stärker geworden. Einer davon ist der Fakt, dass eine Methode in Python mehr als einen Wert zurückgeben kann.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.