Java selbst bietet keine Gui-Komponente zur Auswahl einer Schriftart an. Daher hatte ich vor einigen Jahren - wie so viele andere auch - eine eigene Komponente dafür erstellt. Ich wollte sie etwas aktualisieren und aufpeppen und lernte dabei eine interessante Lektion...
Bisher sah meine Komponente so aus:
FontChooser alt
Eher langweilig und auch nicht das Layout, das man standardmäßig erwarten würde. Daher wurde die Komponente neu strukturiert und bei der Gelegenheit auch gleich internationalisiert - danach sah sie dann so aus:
FontChooser neuer
Aus meiner Sicht bereits eine klare Verbesserung.
Allerdings hatte ich an dieser Stelle einen schweren anfall von Featuritis - ich wollte, dass man bereits in der Liste mit Schriftnamen einen ersten Eindruck von der visuellen Erscheinung der jeweiligen Schriftart erhalten kann, wie das heutzutage viele andere Anwendungen auch bieten. Bei Googles Bildersuche findet man dazu zum Beispiel folgende Illustration dazu:
Angestrebtes Feature
Als ich einen entsprechenden Renderer dafür entwarf stellte ich fest, dass das Öffnen des Dialogs ewig dauerte. Die Ursache dafür war, dass für alle Zeilen der Liste der Renderer instantiiert wurde, was eine gewisse Zeit in Anspruch nahm, da dafür ja jetzt jedesmal eine neue Schrift geladen und aufbereitet werden musste. Ich hatte natürlich angenommen, dass das nur für die Zeilen geschehen würde, die im sichtbaren Ausschnitt lagen.
Daher machte ich mich nun daran, den Renderer so umzuschreiben, dass er nur dann eine Schriftart laden würde, wenn er für eine der im sichtbaren Bereich liegenden Zeilen der Liste aufgerufen werden würde. Dabei lernte ich Interessantes: Ich wollte den Check erledigen, indem ich nachsah, ob der Punkt (indexToLocation) der darzustellenden Zeile im sichtbaren Rechteck lag. Ergebnis dieser Idee war eine StackOverflowException, da zur Berechnung der Location der Renderer benutzt wird. Letztlich scheiterten alle Versuche, die Information zu erlangen, aus genau diesem Grund - ich musste tatsächlich diese Informationen von Hand errechnen - aus der festen Zeilenhöhe (die ich auch schon vor den StackOverflow-Versuchen festgelegt hatte) und dem sichtbaren Rechteck errechnete ich die erste und letzte sichtbare Zeile und setzte den Font nur dann am Renderer, wenn der aktuelle Index zwischen diesen beiden errechneten werten lag. Dadurch war der Dialog jetzt nicht nur so schnell, wie ich es erwarten würde, sondern er sah auch so aus, wie ich es mir gewünscht hatte:
FontChooser neu
Daraus ergab sich für mich eine wichtige Information zum Thema Renderer, die ich so formuliert bisher noch nirgends gefunden habe: zeitkritische Operationen gehören nicht in die getXXXRenderer-Methoden hinein (da die für jedes Item in der Komponente aufgerufen wird - unabhängig von ihrer Sichtbarkeit), sondern in die paint-Methode - die wird nämlich tatsächlich nur aufgerufen, wenn der Renderer für ein Item im sichtbaren Ausschnitt der Komponente verantwortlich ist.
Alte Rechner zukunftsfähig (?)
01.05.2019
Ich mache immer wieder gerne Experimente mit Terminalsessions - meistens wegen der zentral möglichen Administration. Nunhabe ich das Thema von neuem angepackt: wegen einem alten(sehr alten) Laptop, der bei mir schon so lange im Schrank lag, dass sogar die BIOS-Batterie inzwischen leer war...
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Git(lab|hub) Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
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.
Weiterlesen...Ich bin an die Grenzen meiner Storagelösung gestoßen - es musste mehr Platz her...
Weiterlesen...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...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.