Java Getriebe

Java und NetBeans

SecondaryLoop – Der saubere SwingWorker

Der Herr Ullenboom hat mich durch seinen Java-Blog auf ein interessantes Feature in Java 7 aufmerksam gemacht: java.awt.SecondaryLoop. Im Blogeintrag Hidden Java 7 Features – SecondaryLoop von Augusto Sellhorn 1 wird nett beschrieben, wie man nebenläufige Tasks für eine UI schreiben kann ohne den EDT zu blockieren und trotzdem seinen Quelltext „sauber“ zu halten.

Anwendungsfälle fallen mir beim meinen Programmen auf Anhieb einige ein, bei denen ich mit dem SwingWorker ein paar Klimmzüge veranstaltet habe.

Notes:

  1. Die Seite ist leider nur noch im Web-Archiv verfügbar

Selbstaktualisierende Anwendungen

Bei heutige Software wird vom Anwender schon fast vorausgesetzt, dass die Anwendung automatisch „im Internet“ nachschaut ob eine neuere Version seiner Selbst vorhanden ist und im positiven Fall dann auch automatisch eine Aktualisierung von sich selbst auf dem lokalen Rechner vornimmt. Allerdings stellt sich diese „Selbstverständlichkeit“ in der Praxis oft als erst zu nehmendes Problem heraus: Wie bitte schön, soll ich eine Datei (also die Jar-Datei) mit neuem Inhalt befüllen, wenn sie gerade geöffnet und für Änderungen gesperrt ist? Schließlich werden die .class-Datei aus der Datei gerade von der Java-VM verwendet. Vielleicht ist dies auch ein Grund, warum es keine Standardlösung von Java selbst existiert um mit dieser Problematik umzugehen. Read More

Farbschemata in JList anzeigen

Für zwischendurch einmal eine kleine Swing-Spielerei. Ich habe in unserer Anwendung die Möglichkeit für verschiedene Darstellungen verschiedene Farbschemata auszuwählen. Meist sind in diese Darstellungen irgendwelche Verläufe darzustellen wie etwa in einer „Surface Map„. Damit der Anwender aus den gegebenen Schemata auswählen kann, werden alle bekannten Farblisten in einer Liste gemeinsam angezeigt Read More

Kleine Datenverwaltung mit ObservableProperties

Daten. Fluch und Segen der Softwareentwicklung. Ohne das eine würde es das andere nicht geben. Die Kunst ist, mit diesen Daten richtig umzugehen. Manch einer arbeitet daran ein Leben lang. Manche glauben sie gehören nicht zu dieser Gruppe.

Ein Problem, vor dem man immer wieder steht und ich merke, dass gerade Programmieranfänger in der Oberflächenprogrammierung sehr häufig vor der Frage stehen: „Wie bekomme ich es denn hin, dass das eine UI Element an die Daten des anderen UI Elements kommt?“ Vielleicht ohne es zu merken hat der Neuling die zentrale Frage 1 bei der Oberflächenprogrammierung gestellt. Denn genau das ist das Hauptproblem bei dieser Software: Daten von A nach B kopieren um dort weiter verarbeitet zu werden. Die Schwierigkeit besteht meist darin, dass A von B nicht unbedingt etwas weiß.

An dieser Stelle wird meistens das so genannte Model-View-Controller (MVC) Konzept angeführt. Also die Trennung in eine Datenschicht (Model), der Anzeige (View), und den Benutzereingaben (Controller). Häufig werden View und Controller aber nicht so deutlich getrennt, so dass man in der Praxis häufig eine Zweiteilung hat. Entscheidend ist vor allem, dass die Daten vollständig getrennt von dem Rest der Anwendung stehen.

In diesem Artikel möchte ich eine kleine Hilfsklasse zeigen, die gerade in kleineren Anwendungen unheimlich viel Arbeit ersparen kann und auf eine recht simple Art und Weise die Datentrennung bewerkstelligt: ObservableProperties Read More

Notes:

  1. in meinen Augen

Ant: Manifest Dateien korrekt als Properties einlesen

Der Ant Task <property> ist nicht nur in der Lage Java Properties Dateien einzulesen und somit die einzelnen Variablen verfügbar zu machen, sondern auch manifest.mf Dateien, die für Jar-Archivdateien benötigt werden. Das liegt aber nicht unbedingt am Task selbst, sondern viel mehr an der Klasse java.util.Properties und dessen Fähigkeit neben dem Gleichheitszeiche = auch den Doppelpunkt und ein Leerzeichen als Trenner zwischen Schlüssel und Wert erkennt :

The key contains all of the characters in the line starting with the first non-white space character and up to, but not including, the first unescaped ‚=‘, ‚:‘, or white space character other than a line terminator. All of these key termination characters may be included in the key by escaping them with a preceding backslash character;

Leider gibt es in der Spezifikation der Manifestdatei einen kleinen Passus:

Line length: No line may be longer than 72 bytes (not characters), in its UTF8-encoded form. If a value would make the initial line longer than this, it should be continued on extra lines (each starting with a single SPACE).

Diese Einschränkung steht im Gegensatz zur Properties Spezifikation in der Folgezeilen durch einen Backslash \ am Ende der vorherigen Zeile gekennzeichnet werden. Der <property> kann also nicht einfach so jede Manifestdatei einlesen, ohne dass es zu Problemen führen würde. Read More

Dateiüberwachung in Java 7

Die meisten modernen Dateisysteme bieten die Möglichkeit Änderungen an Dateien oder das Erstellen bzw. Löschen von Dateien als „Event“ an die Anwendungsprogramme zu senden. Für die Anwendung bietet dies den Vorteil, dass sie nicht ständig selber auf der Platte nachsehen muss ob sich etwas geändert hat („polling“). Dies erzeugt eigentlich nur unnötige Zugriffe auf die Festplatte und kann je nach Anzahl der „überwachten“ Dateien bzw. Verzeichnissen auch schon mal das System blockieren (wenns ganz blöd läuft).

Diese hardwarenahe Funktion waren bis zur Version 6 von Java nicht direkt verfügbar. Es mussten schon mit irgendwelchen JNI/JNA Schnittstellen gearbeitet werden. Ab Java 7 gibt es ein neues Paket java.nio.file in dem Zugriffsklasse auf die lokalen Dateisysteme ermöglicht werden. Read More

Erweiterbare Java-Anwendungen programmieren » Elmars Notizen

Elmar Baumann hat einen sehr interessanten Artikel in seinem Blog veröffentlicht, wie man auch ohne RCP Framework eine erweiterbare Java Anwendung erstellen kann. Ich zitiere einfach mal den Anfang des Artikels:

Hier beschreibe ich, wie Java-Programme implementiert werden können, die leicht zu erweitern sind. In diesem Artikel ist ein ZIP-Archiv mit vollständigem Java-Quellcode, nach einem Build + Run erscheint ein GUI.

Leicht zu erweitern

Unter leicht zu erweitern verstehe ich:

  • Die Anwendung besteht aus verschiedenen Modulen. Jedes Modul erledigt Aufgaben einer bestimmten Kategorie.
  • Die Module hängen so wenig wie möglich voneinander ab. Abhängigkeit bedeutet: Wird ein Modul benutzt, sind ebenso alle anderen Module erforderlich, die das benutzte Modul benötigt, unabhängig davon, ob der Nutzer des Moduls diese auch verwendet.
  • Ein Modul definiert nur zu jenen Modulen Abhängigkeiten, die es benötigt, je weniger das sind, desto unabhängiger/eigenständiger ist es
  • Module hängen nicht gegenseitig voneinander ab
  • Die Module benutzen bevorzugen Schnittstellen (Interfaces) anstelle Implementierungen. So lässt sich eine Implementierung austauschen, ohne dass Code an anderen Stellen anzupassen ist und bis aufwändig zu implementierende Objekte fertiggestellt sind, können an deren Stelle Mock-Objekte (“Dummys”) benutzt werden.

Zum weiterlesen:

Erweiterbare Java-Anwendungen programmieren

via Erweiterbare Java-Anwendungen programmieren » Elmars Notizen.

Externe Prozesse sicher starten

Wer von Java aus ein anderes Programm starten möchte kann dies recht einfach über den Befehl Runtime.exec erledigen. Seit Java 1.5 gibt es die Klasse [javadoc]java.lang.ProcessBuilder[/javadoc] mit der die Manipulation der Parameter für den externen Prozess noch einfacher von der Hand geht. Da auch Runtime.exec den ProcessBuilder intern verwendet sollte dieser im eigenen Quelltext immer bevorzugt werden.

Interessant wird diese Funktionalität aber erst, wenn man von Java aus andere Konsolenanwendungen starten möchte. Also Programme die keine graphische Benutzeroberfläche haben und ihre Ausgaben in die so genannte „Konsole“ schreiben. Unter Windows werden hier oft die Batchdateien verwendet, unter Linux sind es die Shellskripte. Read More

Annotations – geheimnisvolle Markierungen im Quelltext

This entry is part 1 of 1 in the series Annotation Processor

Seit der Version 1.5 kennt Java die so genannten Annotations. Die meisten Java Entwickler werden dieses Sprachkonstrukt nur als „Nutzer“ erfahren. Jeder wird schon mal eine @[javadoc]java.lang.Deprecated[/javadoc] oder @[javadoc]java.lang.SuppressWarnings[/javadoc] Annotation genutzt oder zumindest gesehen haben. Unter bestimmten Voraussetzungen kann es aber durchaus interessant sein eigene Annotations zu schreiben. Read More