2008-12-26

Java ME-Entwicklung unter Mac OS X

Das Gespann NetBeans 6.5 und MicroEmulator geben eine sehr schöne Plattform für das Entwickeln von Java ME-Anwendungen unter Mac OS X ab. Um den MicroEmulator in NetBeans einzubinden, benötigen Sie (neben den üblichen Mobility-Add ons) nur noch das Plugin Netbeans Mobility Microemulator Support.

2008-12-05

JavaFX 1.0 SDK

Nein, in diesem Eintrag werde ich nicht schreiben, dass JavaFX 1.0 endlich verfügbar ist. Viele Leute haben dies vor mir getan, viele werden es sicher auch jetzt noch. Ich möchte lieber etwas über das JavaFX 1.0 SDK erzählen. Dessen Installationsdatei können Sie hier herunterladen. Die Windows-Variante bringt knappe 34 MB auf die Waage. Das Einrichten der Software ist sehr einfach und nach wenigen Schritten erledigt.

Startseite des JavaFX 1.0 SDK-Installers
Startseite des JavaFX 1.0 SDK-Installers

Der so genannte Prerequisites Wizard prüft, ob alle Voraussetzungen für die Installation des JavaFX 1.0 SDKs erfüllt sind.

Der Installer möchte JDK 6u11 (oder neuer) nachladen
Der Installer möchte JDK 6u11 (oder neuer) nachladen

Auf meinem Rechner war das JDK in der Version 1.6.0 (6.0) Update 10 installiert. Der Prerequisites Wizard möchte aber eine neuere herunterladen.

Download des Java Development Kits 
Download des Java Development Kits

Der übliche JDK-Installationsassistent
Der übliche JDK-Installationsassistent

Nach den Herunterladen wird das Java Development Kit installiert. Im Anschluss daran geht es mit dem Einrichten des JavaFX 1.0 SDK weiter.

Der eigentliche Installationsassistent
Der eigentliche Installationsassistent

Festlegen des Basisverzeichnisses
Festlegen des Basisverzeichnisses

Die eigentliche Installation 
Die eigentliche Installation

Nach der Installation füllen etwa 60 MB das JavaFX 1.0 SDK-Basisverzeichnis.

Die Verzeichnisstruktur
Die Verzeichnisstruktur

Die Verzeichnisstruktur orientiert sich an der des Java Development Kits. Das bin-Verzeichnis enthält übersichtliche vier Programme: javafx.exe, javafxc.exe, javafxdoc.exe und javafxpackager.exe.

Im Vergleich zum üblichen Javadoc wirken JavaFX-Dokumentdateien etwas weniger dröge:

Die JavaFX-Dokumentation
Die JavaFX-Dokumentation

Aber was beinhaltet das JavaFX 1.0 SDK denn nun? Es besteht aus der JavaFX Desktop-Laufzeitumgebung, Betaversionen von JavaFX Mobile sowie einem entsprechenden Emulator (beides derzeit nur für Windows), dem JavaFX Script-Compiler, Dokumentation sowie Beispiele.

Wie man diese Beispiele ausführt, ist in der Datei README.html beschrieben. Letztlich reduziert sich das Procedere auf die üblichen Schritte:

  1. Setzen von Umgebungsvariablen
  2. Übersetzen der Quelltexte (mit javafxc)
  3. Ausführen (mit javafx)

Offen gestanden interessiert mich persönlich JavaFX Script aber nicht so sehr. Deshalb möchte ich in der nächsten Zeit ausloten, was JavaFX für den Java-Entwickler bietet. Ich denke, es gibt eine ganze Menge zu entdecken.

2008-11-28

Bildergalerie

Microsoft hat mit Office 2007 und den dort verwendeten Ribbons neue Wege in der Gestaltung von Bedienoberflächen gesucht. Derzeit wird viel darüber spekuliert, wie viel davon im Nachfolger von Windows Vista zu sehen sein wird. Für mich ist das genau der richtige Moment, um einen Schnappschuss der aktuell vorhandenen Ausprägungen zu machen. Zunächst also ein Blick auf Programme, die zu Vista gehören.
Windows Media Player 
Windows Media Player
Der große schwarze Balken wirkt dominierend, allerdings ästhetisch durchaus ansprechend. Auffällig ist die fehlende Menüleiste.
Windows Movie Maker
Windows Movie Maker
Der Movie Maker erinnert an den Media Player, hat aber eine, ebenfalls in schwarz gehauchte, Menüleiste. Optisch bildet sie mit der Toolbar-ähnlichen Leiste eine Einheit, die allerdings sehr füllig wirkt.
Windows Fotogalerie
Windows Fotogalerie
Die Fotogalerie ähnelt wieder stärker dem Media Player, eine Menüleiste fehlt.
Windows DVD Maker
Windows DVD Maker
Auch der DVD Maker hat einen schwarzen Balken am oberen Rand, weicht durch den großen Fensterrahmen aber stark vom bisher gezeigten ab.
Zum Schluss der Windows Kalender:
Windows Kalender
Windows Kalender
Er zeigt eine Menüleiste mit einem Toolbar-ähnlichemn Element darunter, das aber nicht in schwarz gehalten ist, sondern in blau.
Hier nun ein Blick auf die Produkte der Windows Live-Reihe, zunächst der Klassiker Windows Live Messenger:
Windows Live Messenger
Wndows Live Messenger
Optisch sicher sehr ansprechend...
Windows Live OneCare
Windows Live OneCare
Windows Live Writer
Windows Live Writer
Der Weblog-Editor Windows Live Writer grieft aus meiner Sicht nur wenige Stil-Elemente der bisher gezeigten Live-Produkte auf.
Windows Live Mail
Windows Live Mail
Und Windows Live Mail wirkt irgendwie ähnlich, und doch im Detail unterschiedlich.
Wenn tatsächlich, wie derzeit zu lesen ist, Windows Live-Produkte bestimmte Programme aus Vista ablösen, stellt sich die Frage, ob Microsoft die Optik bis zum Erscheinen des Vista-Nachfolgers nochmals ändert, ggf. vereinheitlicht. Derzeit bietet sich dem Anwender jedenfalls ein bunter Strauß an Gestaltung. Davon ausgehend das Aussehen eines typischen Windows-Desktops in 3 oder 5 Jahren ableiten zu wollen, entspräche sicher dem Lösen einer Gleichung mit sehr vielen Variablen...

2008-11-26

Be-Swing-t den Fokus wechseln

Traditionell wechselt man mit Tab den Fokus. Der Anwender ist dieses Verhalten gewohnt, und deshalb sollte man sich sehr genau überlegen, ob man davon abweicht. Wenn es hierfür zwingende Gründe gibt, ist einem Swing zumindest bei der Realisierung sehr behilflich:

package com.thomaskuenneth;

import java.awt.AWTKeyStroke;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Set;
import javax.swing.FocusManager;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TabEnterTest {

  public static void main(String[] args) {
    JFrame f = new JFrame(TabEnterTest.class.getName());
    f.setBounds(100, 50, 600, 300);
    JPanel p = new JPanel();
    for (int i = 0; i < 3; i++) {
      p.add(new JButton("Button#" + Integer.toString(i + 1)));
    }
    f.setContentPane(p);
    f.validate();
    KeyboardFocusManager keyboardFocusManager = FocusManager
               .getCurrentKeyboardFocusManager();
    Set keystrokes = keyboardFocusManager
        .getDefaultFocusTraversalKeys(
            KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
    HashSet hashSet = new HashSet(keystrokes);
    hashSet.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
    keyboardFocusManager.setDefaultFocusTraversalKeys(
    KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, hashSet);
    f.setVisible(true);
  }
}

Dieses kleine Progrämmchen öffnet ein Fenster und versieht es mit drei Schaltflächen. Der Fokuswechsel erfolgt wie gewohnt mit Tab oder aber mit Enter.

Screenshot von TabEnterTest

Schlüssel zum Erfolg ist die Klasse KeyboardFocusManager. Der Ausdruck FocusManager.getCurrentKeyboardFocusManager() liefert eine solche Instanz. Deren Methode getDefaultFocusTraversalKeys() liefert ein (leider nicht veränderbares) Set. Damit wir diesem einen Wert hinzufügen können, instantiieren wir einfach ein HashSet. add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0)) fügt ihm ein Element hinzu, das die Enter-Taste repräsentiert. In einem abschließenden Schritt wird das neue Set dem aktuellen KeyboardFocusManager übergeben. Das wars.

2008-11-25

Neues von jasconn

Diesmal gibt es Neuigkeiten zu jasconn, meinem Java-AppleScript-Connector. Ich habe eine neue Version in das CVS-Repository eingecheckt und eine fertige Version des Jars hochgeladen, die bei Langläufer-Scripts nicht mehr blockiert.
tell application "iTunes"
get {id, name} of every track of playlist 1
end tell

Ein solches Script kann bei einer umfangreichen Bibliothek schon etwas länger dauern. Da Apple die Java-Cocoa-Bridge schon vor längerer Zeit für deprecated erklärt hat, greift jasconn auf das Kommando osascript zurück. Die Ausgaben des Scripts, sowie etwaige Fehler, werden aus dem Standardausgabe- bzw. Standardfehlerstrom gelesen. An dieser Stelle konnte es bei früheren Versionen passieren, dass jasconn blockiert wurde. Dies ist nun behoben.

2008-11-16

Pfad von javaws.exe ermitteln (nur Windows)

Manchmal kann es notwendig sein, den Pfad von javaws.exe zu kennen. Das folgende Rezept beschreibt keine "offizielle" Vorgehensweise, sondern basiert auf der Erkenntnis, dass es bisher immer so war.
In der Registry findet sich unter HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft der Zweig Java Web Start. Dieser Schlüssel (HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Web Start) hat den Wert CurrentVersion und ist vom Typ REG_SZ. Dessen Inhalt ist der Name eines Unterschlüssels, beispielsweise 1.5.0_10. Es gibt also einen Zweig HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Web Start\1.5.0_10, der wiederum den Eintrag Home (REG_SZ) hat. Sein Inhalt ist zum Beispiel C:\Programme\Java\jre1.5.0\bin. Man muss also nur noch \javaws.exe anhängen. Also...:
  1. den Schlüssel HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Web Start öffnen
  2. dessen Wert CurrentVersion  auslesen
  3. versuchen, einen Unterschlüssel zu öffnen, der so heißt, wie der ausgelesene Inhalt
  4. dessen Wert Home auslesen
  5. prüfen, ob er auf \ endet, falls nein, anfügen
  6. javaws.exe anfügen
  7. prüfen, ob der so zusammen gebaute Pfad gültig ist

2008-11-08

Kein Schwung mehr?

Offen gesagt hat es mich gewundert, wie lange es gedauert hat, bis die Nachricht von Jeanette Winzenburg bzgl. Suns "Ausstieg" aus dem SwingX-Projekt so richtig Wellen schlug. Die Swing-Szene hat eben nur wenige prominente Köpfe. Einer davon ist Kirill Grouchnikov, der mit seinem Weblog-Eintrag den "global panic"-Knopf gedrückt hat. Logsich, dass Chris Adamson sogar im Editor's Daily Blog auf java.net darauf Bezug nimmt.
Dabei ist es doch zumindest für jeden, der sich etwas intensiver mit Swing befasst, ein alter Hut, dass clientseitiges Java schon sehr lange vor sich hin dümpelt. Die so wichtigen JSRs 295 und 296 halten Winterschlaf. Alte Haudegen wie Scott Violet, Chet Haase und Hans Muller haben Sun verlassen. Und alle, die geblieben sind, schuften für JavaFX. Sie versuchen im Moment natürlich, die Wellen zu glätten. Die Bekenntnisse zu Swing und die Weiterentwicklung der Klassenbibliothek wirken für mich aber zur Zeit blass. Die Roadmap für JavaFX und das erste Vierteljahr nach Veröffentlichung des SDKs werden wohl erst Klarheit schaffen.

2008-11-05

Eine gute Frage

Es gibt viele Möglichkeiten, Ja oder Nein zu sagen. Ein paar davon möchte ich Ihnen in diesem Eintrag vorstellen. Hier die Vista-Rückfrage beim Löschen von Dateien.
image
Um keinen falschen Eindruck zu erwecken... mir geht es nicht um den Inhalt, sondern nur um die äussere Form, also die Gestaltung des Dialogs. Nun ein Dialog aus den Windows Live Writer.
image
Dieser Dialog ist dem ersten recht ähnlich, hat aber einen weißen Hintergrund im Inhaltsbereich. Eine Variation dieses Musters sehen Sie nun (Internet Explorer 7):
image
Auch sehr hübsch, jetzt aber mit dezenter Trennlinie zwischen Inhalts- und Schaltflächenbereich. Um keine Langeweile aufkommen zu lassen, hat der Internet Explorer auch die klassische Version parat:
image
Hier nochmals der Internet Explorer, nur ein anderer Dialog:
image
Sehen Sie den Unterschied?
Zum Schluss nochmals ein Beispiel aus der Windows Live-Reihe:
image
Die Grundform des Dialogs kennen wir schon, nur hat sich diesmal die Schaltfläche Abbrechen hinzu gesellt.
Nun liegt es mir, das möchte ich in aller Deutlichkeit klarstellen, fern, andere zu kritisieren. Das ist nicht mein Job. Was ich hier beispielhaft zeigen möchte ist: Vorgaben in Bezug auf die Ausgestaltung von Benutzeroberflächen zu machen ist ein erster, wichtiger Schritt. Ein zweiter, meiner Meinung nach genauso wichtiger Schritt ist, das Einhalten dieser Vorgaben zu überprüfen und ggf. einzufordern.

Reduzierung auf das Wesentliche

Oft sind die einfachsten Ideen die besten. Schon seit geraumer Zeit gibt es für den Mac das Programm WriteRoom, das die Eingabe von Text auf das Nötigste reduziert: die Eingabe von Text. Der Anwender sieht seine bereits geschriebenen Wörter und Sätze. Sonst nichts.
Wer selbst ab und an auf dem Computer schreibt, kann wahrscheinlich nachvollziehen, wie ablenkend das "Drumherum" sein kann. Wer keinen Mac hat, kann auf das mit Hilfe des .Net-Frameworks geschriebene (und ebenfalls seit geraumer Zeit verfügbare) Dark Room zurückgreifen.

Ich kann Jedem nur raten, diese Schlichtheit auszuprobieren.

Update 25.12.14: Screenshot entfernt

2008-10-16

Java SE 6 Update 10

Ehrlich gesagt weiß ich nicht, ob ich das große Tamtam überhört habe, oder ob es keins gab. :-) Jedenfalls gibt es die erste Nicht-Beta und Nicht-RC von Java SE 6 Update 10. Damit gibt es innerhalb eines laufenden Release haufenweise Neuerungen und Verbesserungen. Ob Sun nicht besser daran getan hätte, dem neuen Kind auch einen neuen Namen zu geben, wird sich zeigen. Jedenfalls freue ich mich sehr, dass viele spannende Dinge Einzug in Java-Anwendungen halten können.

Coding for fun

Für junge Leute wird es zunehmend unvorstellbar, dass es eine Welt ohne Internet, ohne E-Mails, ohne Notebook, Handy und SMS gegeben haben kann. Und doch war es 1970 nur wenigen Menschen auf der Erde bekannt, dass eine Maus nicht nur ein Säugetier ist.

Die späten Siebziger sahen dann die ersten Telespiele und Heimcomputer, die interessierte Teenager und jung gebliebene Erwachsene mit aus heutiger Sicht primitiven Mitteln in ihren Bann zogen. Und doch wurden diese Geräte zu einer Keimzelle, die auf breiter Front Faszination und Begeisterung für eine neue Technologie weckte.

Gottfried Wolmeringer möchte mit seinem Buch Coding for Fun diese frühe Zeit der Informatik auch jüngeren Leuten zugänglich machen und ihr Interesse an eigenen Experimenten wecken. Wie gut mir das Buch gefallen hat, können Sie in der (wie bisher kostenlosen) Ausgabe 10/2008 des KaffeeKlatsch lesen.

2008-10-14

Onlinehilfe im Vista-Stil

Auf den Seiten von Impressive Artworx finden sich einige Tipps bzw. Tutorials, die helfen, Java-Programme Vista-ähnlicher zu machen. Ein schönes Beispiel ist eine Klassenbibliothek, die das Erstellen von Vista-ähnlichen Onlinehilfen ermöglicht. Kernstück ist ein entsprechender Hilfeviewer. Bevor ich auf diese Bibliothek eingehe: wie sieht die Vista-Onlinehilfe eigentlich aus?
image
Der obere Fensterbereich enthält mehrere Symbole und Schaltflächen, die den Zugriff auf die Funktionen des Vista-Hilfeviewers ermöglichen. Zwei Navigationspfeile erlauben das Blättern durch die bereits angezeigten Seiten.
Nun zum Onlineviewer. Nach dem Herunterladen der Bibliothek (VistaHelp11.zip) sind folgende Schritte nötig:
  1. Hinzufügen zum Klassenpfad
  2. Erstellen der eigentlichen Hilfeseiten
  3. Einbetten der Bibliothek in das Programm.
Da die Bibliothek HTML-Dateien anzeigt, ist der erste Schritt schnell erledigt. Hier ein Beispiel:
image
Um diese Datei anzuzeigen, sind nur ganz wenige Zeilen Quelltext nötig:
image
Nach dem Start sieht das Ergebnis so aus:
image
Neben index.html müssen zwei weitere Dateien vorhanden sein: ein Inhaltsverzeichnis (toc.html) und eine Seite mit Fragen (ask.html).

2008-09-29

Mac Widgets for Java

...eine kleine Applet-Pause. :-)
macwidgets ist ein Projekt auf code.google.com, das typische Mac OS X-Bedienelemente unter Swing zur Verfügung stellt. Die unter der GNU Lesser General Public License veröffentlichte Klassenbibliothek ist sehr einfach einsetzbar. Laden Sie hierzu die aktuellste Version (beispielsweise mac_widgets-0.9.1.zip) herunter und fügen die enthaltenen .jar-Archive mac_widgets.jar, forms-1.0.7.jar  und swingx-0.9.2.jar dem Klassenpfad hinzu. Wie Sie sehen, setzt macwidgets auf JGoodies Forms und SwingX. Die Dokumentation ist online verfügbar.
Da alle Komponenten selbst gezeichnet werden, ist die Klassenbibliothek nicht nur unter Mac OS X lauffähig:
image
Das zugehörige Listing finden Sie hier.

2008-09-27

Technische Infos zu den draggable applets

Nachdem ich Ihnen in meinem letzten Eintrag nur das fertige Applet zum Ausprobieren präsentiert habe, wird es Zeit, sich mit den technischen Details zu beschäftigen. Glücklicherweise gibt es hierzu gar nicht viel vorzubereiten. Die Hauptarbeit liegt im Hinzufügen eines <param>-Tags:

image 

Das war's. ...zumindest für den Anfang. Denn Java SE 6 Update 10 gestattet auch, das Aussehen des Schließen-Knopfes anzupassen. Wie das funktioniert, zeige ich Ihnen im nächsten Eintrag. Natürlich auch wieder mit einer kleinen Demo. Bleiben Sie also dran. :-)

2008-09-23

Aus dem Browser ziehbare Applets (2. Versuch)

Aufmerksamen Blog-Lesern ist nicht entgangen, dass ich kurzzeitig einen Eintrag zu aus dem Browserfenster ziehbaren Applets online hatte. Hier der dazu gehörende Screenshot:

image

Das Problem mit diesem Eintrag war, dass das Einbetten von signierten Applets in das Blog zu Sicherheitswarnungen führen kann, weil der Browser die Herkunft des verwendeten Zertifikats nicht überprüfen kann. Da das Applet mit Hilfe der Preferences API die Seiten schreibt, ist das Signieren aber leider nötig.

Aus diesem Grund habe ich das Applet auf einer eigenen Seite abgelegt. Die Warnung kommt dann zwar (logischerweise) immer noch, stört so aber nicht mehr den Lesefluss der eigentlichen Blog-Seite.

Technische Hintergrundinfos folgen demnächst...

2008-08-27

Usage Data Collector

Kennen Sie diesen Eclipse-Dialog?

image

Eigentlich wollte ich nur an einem Beispiel für einen neuen Artikel arbeiten, als mich obiger Dialog begrüßte. Usage Data Collector? Hm. In meiner mehrwöchigen intensiven Arbeit mit Ganymede hat sich dieser Dialog nie gezeigt. Der einzige Unterschied ist, dass ich für das Buch ein Eclipse Classic (aka Eclipse SDK) installiert hatte, wohingegen nun Eclipse IDE for Java Developers werkelt.

Jedenfalls soll dieses Tool laut Bedienungsanleitung für den Anwender kaum spürbar sein und nur ganz wenige Ressourcen verbrauchen. Ich werde das nicht nachprüfen, sondern den Datensammler deaktivieren. Das geht übrigens auch über den Dialog Preferences.

Tippen Sie in seiner Filterzeile einfach coll und entfernen auf der Seite Usage Data Collector das Häkchen vor Enable capture.

image

2008-07-29

Mal wieder JSR 296

Diesmal ein paar erfreuliche Zeilen über das Swing Application Framework... Nachdem Alexander Potochkin die Rolle des Speficication Lead übernommen hat, purzeln die ersten Fehlerkorrekturen. Das macht Hoffnung. Nicht begeistert bin ich hingegen über die aufflammende Diskussion, Resource Dependency Injection herauszunehmen. Diese äußerst elegante Art, Eigenschaften von Komponenten zu setzen, würde vielen Entwicklern das Leben erleichtern und zudem den Quelltext entzerren. Naja, wir werden sehen. :-) Ich jedenfalls freue mich, nach der Arbeit am Buch wieder mehr über den Tellerrand gucken zu dürfen.

2008-07-13

Ein Blick in die Zukunft

Dass ich derzeit an der zweiten Auflage meines Eclipse-Buches arbeite, habe ich ja bereits geschrieben. Was in ein paar Monaten im Buchhandel erhältlich sein wird, können Sie sich hier schon mal ansehen...

2008-06-07

Fehler in Swing

Diesmal gibt's nur einen sehr kurzen Eintrag, dafür aber einen sehr interessanten. :-) Es handelt sich um die Folien zu einer JavaOne-Veranstaltung, Workaround Swing Bugs. Der Speaker war David Qiao.

2008-06-05

Swing Explorer aus Eclipse starten

In meinem letzten Eintrag habe ich versprochen, Ihnen zu zeigen, wie Sie den Swing Explorer aus Eclipse heraus starten können.

Öffnen Sie hierzu das Kontextmenü des zu untersuchenden Projekts und wählen Build Path, Configure Build Path. Sie sehen den Dialog Properties for .... Wechseln Sie auf die Registerkarte Libraries und klicken auf Add External JARs. In der nun erscheinenden Dateiauswahl navigieren Sie in das Verzeichnis, in das Sie den Swing Explorer, also die Datei swexpl.jar, kopiert haben. Wählen Sie sie aus und schließen dann die Dateiauswahl.

image

Sie können den Projekteigenschaften-Dialog nun ebenfalls schließen. Jetzt gilt es, eine neue launch configuration anzulegen. Öffnen Sie hierzu erneut das Projekt-Kontextmenü und wählen diesmal Run As, Open Run Dialog.

image

Im linken Bereich des Dialogs sehen Sie den Knoten Java Application. Mit der rechten Maustaste öffnen Sie dessen Kontextmenü. Mit New legen Sie eine neue launch configuration an.

image

Auf der Registerkarte Main tragen Sie unter Name am besten Swing Explorer ein. Die Main class ist org.swingexplorer.Launcher.

image

Auf der Registerkarte Arguments tragen Sie unter Program arguments die Startklasse Ihrer Anwendung ein. Mit Apply übernehmen Sie Ihre Einstellungen und mit Run starten Sie den Swing Debugger.

2008-06-02

Swing Explorer

Mit dem Swing Explorer können Sie Swing-Anwendungen sozusagen auf die Finger schauen. In der derzeit verfügbaren Version ist das Starten des zu untersuchenden Programms insofern etwas fummelig, als Sie eigentlich auf der Kommandozeile arbeiten müssen.

Eine Alternative ist, die beiden .jars als zusätzliche Bibliotheken einzubinden und anstelle Ihrer Anwendung den Swing Explorer aufzurufen und ihm die eigentliche Startklasse zu übergeben. Wie dies unter Eclipse funktioniert, zeige ich Ihnen im nächsten Eintrag.


2008-05-27

Binding Beans

Nach einer längeren Pause habe ich mal wieder einen englischsprachigen Artikel für java.net geschrieben. Er vergleicht die beiden Binding Frameworks JGoodies Binding und die Referenzimplementierung des JSR 295: Beans Binding. Beide Bibliotheken werden eingesetzt, um die Minianwendung VolumeControl zu implementieren.

Das Programm zeigt, wie Swing-Komponenten an die Properties einer JavaBean gebunden werden. Um zu verdeutlichen, wie viel man durch den Einsatz eines Binding Frameworks gewinnt, habe ich zusätzlich eine klassische Implementierung ohne Bibliotheksunterstützung realisiert.

2008-05-20

Kennen Sie VisualVM?

VisualVM ist ein unter der GNU General Public Licence veröffentlichtes Analyse- und Profiling-Tool für Java-Anwendungen. Es liefert eine Oberfläche für Standard-JDK-Bestandteile, bietet aber auch eigene, also neue Module. Lassen Sie uns einen Blick auf das Programm werfen.
image
Nach dem ersten Start wird eine Kalibrierung des JDK durchgeführt. Was es damit auf sich hat, verrät ein Blick auf den folgenden Dialog:
image
Das sich nun öffnende Hauptfenster weist das Programm als NetBeans RCP-Anwendung aus.
image
Gefreut hat mich, dass VisualVM eine bereits laufende Anwendung, nämlich mein Tool Clip4Moni, automatisch gefunden hat. Der folgende Screenshot zeigt grundlegende Daten zu diesem Programm.
image
Hier noch ein Screenshot, diesmal die Registerkarte Heapdump:
image
Die ersten zehn Minuten Probefahrt lassen auf ein sehr nützliches Werkzeug hoffen. Ich kann jedenfalls nur jedem raten, sich damit auseinanderzusetzen.

2008-05-15

Konstanten in Java

In diesem Weblog-Eintrag möchte ich mich mit einem nur scheinbar banalen Thema befassen. Auf die Frage, wie man in Java Konstanten definiert, wird mancher schnell mit einem public static final int ANTWORT = 42; antworten.
In der Tat scheitert jeder Versuch, ANTWORT einen Wert zuzuweisen, schon zur Compilezeit.
Weiter. Sehen Sie sich den folgenden Ausdruck an:
public static final String SEPARATOR = System.getProperty("file.separator");
Der Ausdruck ist, um auf die schon länger zurück liegende Frage eines Kollegen zu antworten, in einem Klassenrumpf übrigens zulässig. Auch in diesem Fall scheitert ein Zuweisungsversuch schon zur Compilezeit.
...noch ein Versuch...
public static final Date NOW = new Date();
...und im Anschluss...:
NOW.setTime(0l);
Hoppla...!
Dass sich dieser Ausdruck nicht nur klaglos übersetzen lässt, sondern auch zur Laufzeit keinen Fehler provoziert, mag zunächst verwundern. Wenn man sich etwas ausführlicher mit dem, was da passiert, auseinandersetzt, wird das Verhalten aber sehr schnell klar.
Lassen Sie uns zunächst vergegenwärtigen, was der Modifier final eigentlich tut. Auf Klassen- und Methodenebene schützt final also vor dem Überschreiben. Variablen werden unveränderlich. Ihr kann nur einmal ein Wert zugewiesen werden. Wichtig bei Referenztypen ist allerdings, dass sich diese Unveränderbarkeit nur auf die Referenz bezieht, nicht aber auf das referenzierte Objekt.
Der Variable NOW kann also keine neue Instanz der Klasse Date zugewiesen werden, wohl aber können Klassen- oder Instanzvariablen der bereits erzeugten und zugewiesenen Instanz verändert werden.

2008-05-08

Was wird aus dem Swing Application Framework?

Hans Muller hat in einem Posting in der users-Mailingliste des Swing Application Frameworks seinen Wechsel von Sun zu Adobe bekannt gegeben.
Welche Auswirkungen dies auf den JSR 296 hat, bleibt abzuwarten. Hans hat zwar angekündigt, bei der Suche nach einem neuen Fackelträger zu helfen. Wann jedoch eine neue Version des Prototyps erscheint, steht derzeit in den Sternen.

2008-03-06

Charts erzeugen

Kennen Sie eigentlich die Google Chart API? Mit ihr können Sie dynamisch Charts generieren, also Balken-, Linien- oder Tortendiagramme. Das Ganze funktioniert, ich möchte schon fast sagen wie üblich, indem Sie eine bestimmte URL zusammen bauen.
Hier ein Beispiel: http://chart.apis.google.com/chart?chs=400x300&cht=p3&chd=t:12.3,20.7,33.3

Wie diese URL aufgebaut ist, können Sie der weiter oben verlinkten Doku entnehmen. Letztlich reduziert sich die Arbeit auf
  • Festlegen der Größe
  • Auswählen eines Chart-Typs
  • Übergeben der Chart-Daten
Der letzte Punkt erfordert insofern etwas Arbeit, als Google drei feste Kodierungen vorgesehen hat, die wahrscheinlich nicht immer zu Ihrem Datenmaterial passen. Ist dies der Fall, müssen Sie die Daten in eines der drei Formate konvertieren. Wie das aussehen kann, zeige ich ein andermal.

2008-03-02

Einen Geburtstagskalender basteln

Schon in meinem Buch Java für Windows hatte ich die äußerst nützliche Klassenbibliothek Java Outlook Connector vorgestellt. Mit ihr ist es auf sehr bequeme Weise möglich, auf Outlook-Daten zuzugreifen. In einem kleinen Hack nutze ich dies zum Bau eines Geburtstagskalenders, den sich meine Frau gewünscht hat.
Er besteht aus 12 Spalten mit jeweils 31 Zeilen. Wie Sie unschwer erraten, trägt er von links nach rechts die Monate an, sowie von oben nach unten die Tage eines Monats. Eine Zelle enthält somit den oder die Namen von Personen, die an diesem Tag geboren wurden.
Die Klasse OutlookBirthdayExporter ist bewusst simpel gehalten. Sie schreibt die Tabelle im klassischen CSV-Format (allerdings mit der Pipe als Zelltrenner) in den Standard-Ausgabestrom. Ich finde es immer wieder nett, wie wenig Aufwand manchmal nötig ist.

2008-01-11

Neues von MD5

Ich habe vor kurzem einen Eintrag über MD5 geschrieben und in diesem Zusammenhang ein Programm vorgestellt, das auf Basis der Standard-Klasse MessageDigest Prüfsummen von Dateien ermittelt. Dass sich solche Message Digests gut eignen, um nach Dubletten zu suchen, wissen Sie bereits. Wie Sie meine Klasse TKJMD5 hierzu einsetzen können, zeige ich Ihnen im Folgenden. Werfen Sie bitte einen Blick auf das Listing TKDupeFinder.java.
Die Idee des Programms ist, einer MD5-Checksumme eine Liste von Dateien zuzuordnen. Jedes Element dieser Liste hat also dieselbe Prüfsumme. Die Klasse nimmt die Prüfsumme als Schlüssel einer Hashtable. Der Wert dieser Hashtable ist ein Vector, dessen Elemente wiederum File-Objekte sind. Ein Aufruf der Methode scanDir() startet die Suche nach Dubletten.