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

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

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.


This is a (slightly updated) repost of a piece I published on my blog Tommi’s Blog. I deleted the blog in the wake of the GDPR, so the original version is no longer available, or only through the WayBack Machine of the Internet Archive. Please note: code usually has not been updated, so language feature reflect the time the original post was written.