2012-03-31

Ultimate Swing, Teil 21

Nach einer etwas längeren Pause mal wieder mein anderes Steckenpferd - Ultimate Swing. Wie Sie aus Folge 20 wissen, kennt Swing austauschbare Look and Feels. Diese können, wie Sie später noch sehen werden, recht einfach in eigenen Programmen verwendet werden. Setzt eine Anwendung das Look and Feel jedoch nicht explizit, bestimmt Swing, welches verwendet wird. Diese Regeln sind zumindest in Teilen plattformabhängig und haben sich im Laufe der Zeit auch leicht geändert. Schon immer hat es aber die Möglichkeit gegeben, das Standard-Look and Feel in eine Datei einzutragen, die dann von Swing ausgewertet wird (wenn das Programm das Look and Feel nicht setzt). Vor vielen Jahren habe ich ein Programm geschrieben, das diese Datei anlegt und editiert. TKPLAFUtility tut noch immer seinen Dienst:

Screenshot von TKPLAFUtility
Screenshot von TKPLAFUtility

TKPLAFUtility zeigt Ihnen, welche Look and Feels auf Ihrem Rechner installiert sind, und erlaubt Ihnen, zwischen diesen umzuschalten. Da es eine Web Start-Anwendung ist, können Sie sie mit einem einfachen Klick starten. Das Hauptfenster ist in der obigen Abbildung zu sehen. Falls Sie das Programm mit einer sehr aktuellen Java-Version aufrufen, haben Sie unter Umständen die Vermutung, die Liste der Look and Feels ist nicht vollständig. Sie haben Recht. Aus Gründen, die in die Nebel der Zeit entschwunden sind, frage ich nämlich nicht mit UIManager.getInstalledLookAndFeels() die vorhandenen Look and Feels ab, sondern baue die Liste selbst zusammen. Folglich ist Nimbus nicht zu sehen. Sie können das Problem aber leicht beheben, indem Sie Hinzufügen anklicken. Unter Java SE 6 (ab Update 10) tragen Sie com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel ein. Unter Java 7 javax.swing.plaf.nimbus.NimbusLookAndFeel.

Wenn Sie mit dem Programm etwas spielen möchten, können Sie sich Napkin herunterladen. Auch nach vielen Jahren (ich hatte schon 2006 in meinem Buch Java für Windows darauf hingewiesen!) ist dieses Look and Feel noch einen Schmunzler wert. Kopieren Sie vor dem Start von TKPLAFUtility das Look and Feel (napkinlaf-alpha001.jar) in das Verzeichnis lib\ext des Java-Installationsverzeichnisses. Auf meinem Rechner ist dies C:\Program Files\Java\jre6\lib\ext. Starten Sie nun TKPLAFUtility, klicken auf Hinzufügen, und geben dann napkin.NapkinLookAndFeel ein. Frühere Versionen des Look and Feels hatten übrigens einen anderen Paketnamen. Nach einem Doppelklick in der Liste der Look and Feels sieht das Hauptfenster so aus:

TKPLAFUtility mit dem Napkin Look and Feel
TKPLAFUtility mit dem Napkin Look and Feel

Mit jar Archiv kopieren können Sie Look and Feels übrigens auch mit TKPLAFUtility an den passenden Ort kopieren.

2012-03-30

Android-Quellen einbinden

Bei der Fehlersuche ist es manchmal wünschenswert, auch in Systemklassen “eintauchen” zu können. Erstaunlicherweise war das unter Android lange Zeit mit vergleichsweise großem Aufwand verbunden.

Mittlerweile genügt es aber, im Android SDK Manager für die gewünschte Plattform das Paket Sources for Android SDK herunterzuladen. Im Verzeichnis sources des Installationsverzeichnis befindet sich danach ein entsprechender Unterordner, zum Beispiel android-15 für Android 4.0.3. Dessen Pfad muss in Eclipse dem Archiv android.jar  als so genanntes Source attachment zugewiesen werden. Wählen Sie nach einem Rechtsklick auf die in der Sicht Package Explorer angezeigte Projektwurzel den Menüpunkt Build Path • Configure Build Path aus und tragen anschließend auf der Registerkarte Libraries des Dialogs Properties for … den Pfad ein. Öffnen Sie hierzu die Knoten für die gewünschte Plattform sowie android.jar.

2012-03-27

Android-Standard-Apps starten

Mit Android 4.0.3 (API-Level 15) wurden der Klasse Intent einige Konstanten hinzugefügt, mit denen sich Standard-Apps starten lassen, zum Beispiel CATEGORY_APP_CALENDAR, CATEGORY_APP_MAPS und CATEGORY_APP_MUSIC.

Im Folgenden zeigen ich Ihnen, wie Sie sie nutzen.

    Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
        Intent.CATEGORY_APP_MARKET);
    try {
      startActivity(intent);
    } catch (ActivityNotFoundException e) {
      // keine passende App
    }

Easy, oder?

Hinweis: CATEGORY_APP_MARKET wurde bereits mit API-Level 11 (Honeycomb) eingeführt. Aber damit lässt sich sehr schön zeigen, warum ActivityNotFoundException gefangen werden sollte. Probieren Sie das Ganze doch einmal ohne try-catch-Block im Emulator aus…
Zwinkerndes Smiley

2012-03-03

Ultimate Swing, Teil 20

Sicher erinnern Sie sich noch, dass eines der Ziele meiner losen Folge von Artikeln zu Swing eine “sexy” aussehende Anwendung war. Obwohl wir noch nicht einmal ansatzweise alle technischen Aspekte der Swing-Programmierung hinter uns haben, möchte ich doch ab sofort den einen oder anderen Post zur Gestaltung einfließen lassen.

Warum muss ein Programm eigentlich “sexy” aussehen. Oder, anders formuliert, warum wirken manche Programme optisch ansprechend, andere hingegen nicht? Vor allem aber: warum sehen Programme eigentlich überhaupt unterschiedlich aus? Kaum ein Benutzer wird sich Gedanken darüber machen, dass die Bedienelemente einer Anwendung baumartige Strukturen darstellen. Er nimmt sehr wohl zusammengehörende Bereiche war – Menüleiste, Toolbar, Paletten. Dass sie in einen Rahmen (das Hauptfenster) eingebettet sind, interessiert ihn aber nicht. Wichtig ist, dass die Elemente an Stellen sind, an denen er sie vermutet oder erwartet. Aktuelle Betriebssysteme und GUI-Toolkits bilden die Hierarchiebeziehungen zwischen Bedienelementen zur Laufzeit als Baumstrukturen in Form von Objektgraphen ab. Das bedeutet aber nicht, dass Objektorientierung eine zwingende Voraussetzung für grafische Benutzeroberflächen ist. Ältere Systeme (als ein Beispiel von vielen sei GEM, der Graphics Environment Manager von Digital Research genannt) nutzen hierfür zu Bäumen verbundene Datenstrukturen.

Zurück zur Erwartungshaltung der Anwender: Es mag zunächst wie eine Binsenweisheit klingen, dass man mit vertrauten Dingen sicherer und schneller zurecht kommt, als mit Neuem und Ungewohnten. Gerade beim Bau von Benutzeroberflächen hat aber kaum ein System dies von Beginn an so konsequent umgesetzt, wie der Mac. Die Human Interface Guidelines legen seit mehreren Jahrzenten detailliert fest, wie Programme für den Mac auszusehen haben, wann wofür welche Bezeichnung verwendet wird und was wie zu funktionieren hat. Der Lohn der Mühe ist: einheitliches Aussehen, einheitliche Bedienung, schnelle Einarbeitungszeiten, hohe Konsistenz.

Diesen Grad an Uniformität konnte oder wollte die Windws-Welt bis heute nicht erreichen. Das mag daran liegen, dass Microsoft selbst im Laufe der Zeit einen Zoo an GUI-Klassenbibliotheken geschaffen hat, ohne umfassend aufzuräumen. Da gibt es die klassischen Win32-Controls, dann kamen die “common controls” dazu, später (mit .NET) Windows Forms und Windows Presentation Foundation. Zahlreiche Drittanbieter trugen zu weiterer Vielfalt bei. Als ein Beispiel von Vielen sei die VCL (Visual Component Library) von Borland genannt. Es hätte einen Aufschrei gegeben, wäre Microsoft Apples Vorbild gefolgt und hätte versucht, den Entwicklern das eigene GUI-Toolkit aufzuzwingen.

Jetzt zu Java… Die erste GUI-Komponentenbibliothek (AWT, Abstract Window Toolkit) nutzte native Komponenten. Was zunächst wie ein Vorteil klingt, entpuppte sich schnell als Problem. Da AWT nur Funktionen anbot, die auf allen Mitte der Neunziger verfügbaren Systemen (auf denen Java lief) vorhanden waren, erschienen AWT-basierte Bedienoberflächen spartanisch. Die Schnittmenge von Windows, MacOS und Motif ist einfach nicht sehr groß. Man schuf deshalb mit Swing eine Komponentenbibliothek, die aus so genannten leichtgewichtigen Komponenten bestand. Für das Zeichnen war Swing selbst verantwortlich. Leider hat auch dieser Ansatz Nachteile:

  • um wie native Komponenten auszusehen, muss man diese imitieren – heute wissen wir, dass das nie funktioniert hat
  • damalige Systeme waren langsam – und so hat sich Swing zunächst auch angefühlt

Das Aussehen und (in Grenzen) das Verhalten von Swing-Komponenten wird durch das so genannte Look and Fell bestimmt. Die Architektur von Swing sieht vor, dass nach Belieben Look and Feels hinzugefügt werden können. Sun hat im Laufe der zeit selbst rege Gebrauch davon gemacht.