Wie lässt sich mit SWT (Standard Widget Toolkit) eine einfache Tabelle realisieren?

Die Klasse Table des Packages org.eclipse.swt.widgets stellt eine Tabelle bereit, deren Spalten umsortiert werden können.

Das Beispiel zeigt ein Fenster mit einer einfachen Tabelle, die diverse String-Einträge enthält, sowie einen Button. Die Spalten der Tabelle lassen sich durch Klicken und Ziehen des Spalten-Kopfes umsortieren und durch Betätigen des Buttons wieder in den Ausgangszustand zurückversetzen.

Die graphische Oberfläche des Programms wird in der Methode init() erzeugt. Nach der Initialisierung des Display-Objektes wird das Fenster als Shell erzeugt und mit einem Titel versehen. Das Layout wird durch ein GridLayout verwaltet, das in der hier verwendeten Grundform eine Spalte erzeugt. Sie nimmt untereinander liegend die Tabelle und den Button auf.

Die Tabelle wird bei ihrer Erzeugung der Shell übergeben und durch zwei Konstanten, sog. stylebits konfiguriert. Sie sind in SWT weit verbreitet und steuern sowohl das Aussehen, als auch das Verhalten eines Widgets. SWT.BORDER versieht die Tabelle mit einem leichten äußeren Rand, SWT.MULTI sorgt dafür, dass mehrere Zeilen selektiert werden können. Drei Methoden der Klasse Table bewirken dann noch eine zusätzliche Konfiguration, indem sie der Tabelle einen Tooltip hinzufügen, dafür sorgen, dass die Zeilen durch eine leicht unterschiedliche Färbung von einander abgegrenzt werden und dass der Tabellenkopf sichbar ist.

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

public class Tabelle {

    public static void main(String[] args) {
        new Tabelle().init();
    }

    private void init() {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Tabellenbeispiel");
        shell.setLayout(new GridLayout());

        Table table = new Table(shell, SWT.BORDER | SWT.MULTI);
        table.setToolTipText("Eine Tabelle");
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        String[] colNames = { "Spalte 1", "Spalte 2", "Spalte 3", "Spalte 4" };
        TableColumn[] cols = new TableColumn[colNames.length];
        int[] order = new int[colNames.length];
        for (int i = 0; i < colNames.length; i++) {
            TableColumn tc = new TableColumn(table, SWT.BORDER);
            tc.setText(colNames[i]);
            tc.pack();
            tc.setMoveable(true);
            cols[i] = tc;
            order[i] = i;
        }
        for (int k = 0; k < 15; k++) {
            TableItem item = new TableItem(table, SWT.BORDER);
            for (int i = 0; i < colNames.length; i++) {
                item.setText(i, new Integer(k + 1).toString() + "/"
                        + new Integer(i + 1).toString());
            }
        }

        Button button = new Button(shell, SWT.PUSH);
        button.setText("Zur\u00FCcksetzen");
        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                if (cols.length > 0) {
                    table.setColumnOrder(order);
                }
            }
        });
        shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

In der Folge werden dann drei Arrays gebildet. Das erste speichert die Spaltentitel, das zweite dient zur Speicherung von TableColumn-Objekten und das dritte ist ein int-Array, das zur Registrierung der Spaltenreihenfolge dient. Die hier gespeicherte 0-basierte Zahlenfolge legt später die Standard-Reihenfolge der Tabellenspalten fest.

In einer Schleife werden dann die Tabellenspalten selbst erzeugt und dem Tabellenobjekt übergeben. Die Methode setText() setzt den Spaltentitel und pack() skaliert die Spalte auf die notwendige Größe.
Das Umsortieren der Spalten wird durch Übergabe des Parameters true an die Methode setMovable() bewirkt. Zur Demonstration wird hier die Spalte mit dem Index 1 ausgenommen. Sie lässt sich selbst nicht durch Ziehen mit der Maus umlagern, kann jedoch durch geschicktes Umsortieren der anderen Spalten ebenfalls an eine andere Position innerhalb der Tabelle verbracht werden.
In einem letzten Ausdruck in diesem Schleifenkörper wird der Index des aktuellen Schleifendurchlaufs der zugehörigen Position des o.a. int-Array übergeben, sodass durch Betätigen des Buttons später die Ausgangsreihenfolge der Spalten wiederhergestellt werden kann.

Es folgen zwei ineinander geschachtelte Schleifen, in denen die Tabellenzellen als TableItem-Objekte erzeugt werden. Die Methode setText() füllt jede Zelle mit einem einfachen String, der ihre Position angibt.

In einem letzten Abschnitt wird ein Button erzeugt, durch das stylebit SWT.PUSH als einfacher Button definiert und der Shell übergeben. Er wird bei einem SelectionListener angemeldet, der dafür sorgt, dass beim Betätigen des Buttons die Ausgangsreihenfolge der Spalten wiederhergestellt wird. Dies wird durch die Methode setColumnOrder() erreicht, der das oben genannte int-Array als Parameter übergeben wird.

SWT-Tabelle