2011-11-25

Ultimate Swing, Teil 2

Zu Beginn möchte ich mich bei allen, die einen Kommentar hinterlassen haben, herzlich bedanken. Ich freue mich, dass mein Projekt Zuspruch findet und Interesse weckt.
Screenshot TKNotesAndTasks
Screenshot TKNotesAndTasks
Ziel des heutigen Posts ist, Ihnen alle Quelltexte an die Hand zu geben, die Sie benötigen, um das oben gezeigte Fenster zu erzeugen. Die Verteilung der Sourcen wird immer in Gestalt eines .zip-Archivs erfolgen, das das Verzeichnis “src” enthält. Da die meisten IDEs die Quelltexte eines Projekts in Ordnern mit diesem Namen ablegen, ist es am einfachsten, einmal ein neues Projekt anzulegen und später einfach mit jeder “Lieferung” das src-Verzeichnis zu überschreiben. Anschließend ein Clean und Build All. Schon haben Sie eine ablauffähige Anwendung. Lassen Sie uns nun einen Blick auf den Package Explorer (ich verwende Eclipse) werfen.
Screenshot Package Explorer
Screenshot Package Explorer
Ist Ihnen die grundsätzliche Aufteilung in die beiden Pakete com.thomaskuenneth.shoebox und com.thomaskuenneth.notesandtasks aufgefallen? Ich möchte Ihnen kein weiteres Swing-Framework vorschlagen – es gibt einfach schon zu viele. Dennoch ist Wiederverwendung im Sinne der Arbeitserleichterung selbstverständlich ein wichtiges Ziel für jeden Entwickler. Aus diesem Grund lagere ich Kandidaten für die Nutzung in anderen Programmen in das shoebox-Paket aus. Meine Schuhschachtel enthält allerlei Krimskrams, das ich mir bei Bedarf einfach nehme. Eine solche Vorgehensweise möchte ich auch Ihnen ans Herz legen. Aber widerstehen Sie der Versuchung, Bibliotheken zu bauen. Die Zeit, die Sie in die Ausgestaltung einer API stecken, ist besser in Tests investiert - glauben Sie mir.
Lassen Sie uns nun einen Blick auf die Hauptklasse der Anwendung werfen.

package com.thomaskuenneth.notesandtasks;

import com.thomaskuenneth.notesandtasks.controller.MainController;
import com.thomaskuenneth.shoebox.app.Application;

public class Main {

  public static void main(String[] args) {
    Application.boot(args, "com.thomaskuenneth.notesandtasks.messages",
        new MainController());
  }
}
Das riecht – ich sehe Ihren verwunderten Blick – nach Framework. Ich habe Teile des Start- und Beendigungsvorgangs in die Klasse Application ausgelagert, weil ich diese Stück für Stück erweitern kann. Was passiert hier? Ein Objekt des Typs MainController wird, neben den Kommandozeilenargumenten und einem (scheinbaren) Paketnamen, an die statische Methode boot der Klasse Application übergeben.

public class MainController implements ActionListener, ApplicationCallback {
Die Implementierung muss uns an dieser Stelle nicht interessieren – wichtig ist, dass die Klasse das Interface ApplicationCallback implementiert. Das ist (derzeit noch) sehr überschaubar:

package com.thomaskuenneth.shoebox.app;

import javax.swing.JComponent;

public interface ApplicationCallback {

  public JComponent createGUI();
 
  public boolean canShutdown();
}
Die Klasse Application öffnet ein Fenster und stellt einen Komponentenbaum dar, den eine Implementierung der Methode createGUI() liefert. Damit möchte ich diesen Teil meiner losen Serie beschließen. Bitte sehen Sie sich die Klasse Application genauer an. Wenn Sie Fragen oder Anregungen haben, freue ich mich sehr über Ihre Nachricht.
Quelltexte zu TKNotesAndTasks vom 25.11.2011

1 comment:

  1. Eine indirekte Frage zur Schuhschachtel: Kann ich diese in einem zentralen Verzeichnis verwalten und diese transparent in mehrere Eclipse-Projekte einbinden, ohne diese mehrfach kopieren zu müssen? Also immer aktuell in allen Projekten? Hardlinks möchte ich ausschließen; Eclipse hat doch sicherlich dafür einen Trick? Leider bin ich noch nicht dahinter gekommen, liegt aber wohl dran, dass ich zu selten Eclipse/Java verwende :( Danke für deine Antwort/Ergänzung!

    ReplyDelete