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