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-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

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.

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.