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

Entwurfsmodus für beliebige SVG Graphiken

01.06.2024

Nachdem ich in der Vergangenheit immer wieder Weiterentwicklungen der Idee vorgestellt habe, Graphiken mit dem Computer so zu ezeugen dass sie eine gewisse "handgemachte" Anmutung haben, habe ich nunmehr die durchschlagende Idee gehabt:

Graphics2D Implementierung für Java mit verlegtem Koordinatenursprung

01.05.2024

Es gibt seit vielen Jahren immer mal wieder Leute, die im Internet fragen, ob man in Javas diversen Methoden zum Zeichnen von Graphiken das Koordinatensystem so ändern könnte, dass sich der Koordinatenursprung links unten befindet und die positive y-Achse nach oben weist. Meist sind die Antworten dann, dass eine Affine Transformation eingeschaltet werden solle, die das Bild spiegelt.

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

  • Aviator + Websockets

    15.06.2019

    Nachdem ich in den letzten Wochen und Monaten meine Zeit und Energie in die sQLshell gesteckt habe - was sowohl Bugfixing als auch neue Features betraf - habe ich nun endlich die Zeit gefunden, ein bereits lange überfälliges Feature an dWb+ und speziell am aviator zu implementieren.

    Weiterlesen...

Neueste Artikel

  • Neue Version plantumlinterfaceproxy napkin look

    Es gibt eine neue Version des Projektes plantumlinterfaceproxy - Codename napkin look.

    Weiterlesen...
  • Apache HTTPCore5 funktioniert nicht mit Docker

    Ich habe neulich drei Stunden meines Lebens verschwendet weil ich unbedingt die neueste Version der HTTPCore5 Library von Apache einsetzen wollte.

    Weiterlesen...
  • Entwurfsmodus für beliebige SVG Graphiken

    Nachdem ich in der Vergangenheit immer wieder Weiterentwicklungen der Idee vorgestellt habe, Graphiken mit dem Computer so zu ezeugen dass sie eine gewisse "handgemachte" Anmutung haben, habe ich nunmehr die durchschlagende Idee gehabt:

    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.