~Java4Beginners~
~Java4Beginners~

JTable

Als eines der komplexesten und umfangreichstes Bedienelement ist in Swing die JTable. Mit Ihr können wir Daten 2 dimensional darstellen. Vom Aufbau könnte man fast sagen, dass JTable einem Excel-Sheet sehr ähnlich sieht, zumindest von der Optik.

Benötigte Imports


import javax.swing.JTable;

Konstruktoren

JTable stellt uns eine Vielzahl von Konstruktoren zur Verfügung.
Konstruktor Beschreibung
JTable() Standardkonstruktor, erstellt eine leere Tabelle ohne Zeilen und Spalten
JTable(int numRows, int numColumns) Dieser Konstruktor benutzt das DefaultTableModel mit der angegebenen Anzahl von Zeilen und Spalten
JTable(Object[][] rowData, Object[] columnNames) Dieser Konstruktor benötigt ein 2 dimensionales Objekt-Array (im Normalfall String[][]) mit den Daten für die Tabelle, sowie ein Objekt-Array (String[]) für die Spaltenüberschriften.
JTable(TableModel dm) Erstellt eine Tabelle mit den Datenmodell dm, dem Standardspaltenmodell und dem Standard-Selection-Modell
JTable(TableModel dm, TableColumnModel cm) Erstellt eine Tabelle mit dem Datenmodell dm, dem Spaltenmodell cm und dem Standard-Selection-Modell
JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) Erstellt eine Tabelle mit dem Datenmodell dm, dm Spaltenmodell cm und dem Selection-Modell sm
JTable(Vector rowData, Vector columnNames) Erstellt eine Tabelle mit der Vektorenliste für die Daten und der Vektorenliste für die Spalten
Vectoren ist eine Klasse für Listen. Ein Vector ist vergleichbar mit einem dynamischen Array: Die Größe kann sich zur Laufzeit ändern.

Tabellen-Modell

Die Komplexität der JTable liegt auch darin, dass eine strikte Trennung zwischen Daten und Anzeige erfolgt. Die Klasse JTabel übernimmt die View und die Control, während wir für die Daten ein eigenes Tabellenmodell benötigen.


      Servicedealer_tableModel model;
      model = new Servicedealer_tableModel(database
              .getMitarbeiterData(),
              mitarbeiterUebersicht_spaltennamen);
      jt_mitarbeiterUebersicht = new JTable(model);
Servicedealer_tableModel ist unser Tabellenmodell für die Daten. Wir füllen das Tabellenmodell mit Daten aus einer Datenbankabfrage und den Spaltenüberschriften, bevor wir eine neue JTabel erstellen, welchem wir das Tabellenmodell (Datenmodell) übergeben.



Sehen wir uns die Klasse Servicedealer_tableModel mal an.

package servicedealer;

import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;

/**
 * Servicedealer Tabellenmodell für Sortierung
 * @author Markus Badzura
 * @version 0.0.019
 */
public class Servicedealer_tableModel extends DefaultTableModel
{
  /**
   * Konstruktor für Tabellen
   * @param rowData String[][] Tabellendaten
   * @param header String Spaltenbezeichnungen
   * @throws NullPointerException 
   * @author Markus Badzura
   * @since 0.0.019
   */
  Servicedealer_tableModel (String[][] rowData, String[] header) 
          throws NullPointerException
  {
    super(rowData, header);
  }
  /**
   * Sortieren der Mitarbeiterübersicht
   .........
 
}
Es handelt sich um eine abgeleitete Klasse von DefaultTableModel, mit einem Konstruktor für ein zweidimensionales Datenarray und einem Array für die Spaltenüberschriften.

JTable und JScrollPane

Wir setzen die Tabelle in eine JScrollPane aus dem Grund, dass dann erst die JTable die Spaltenköpfe anzeigt. Beim Scrollen in der Tabelle bleiben die Spaltenköpfe immer stehen.

      jsp_mitarbeiterUebersicht = new JScrollPane
          (jt_mitarbeiterUebersicht, ScrollPaneConstants
                  .VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants
                          .HORIZONTAL_SCROLLBAR_AS_NEEDED);
    jt_mitarbeiterUebersicht.setFillsViewportHeight(true);
jt_mitarbeiterUebersicht.setFillsViewportHeight(true); sorgt dafür, dass die Tabelle den gesamten Viewport einnimmt.

Tabelle per Mausklick auf Spaltenkopf sortieren

Um eine Tabelle per Mausklick auf den Spaltenkopf zu sortieren, müssen wir als erstes unser Tabellenmodell um den Algorithmus zum Sortieren erweitern.

  /**
   * Sortieren der Mitarbeiterübersicht
   * @param column angeklickte Spalte
   * @author Markus Badzura
   * @since 0.0.019
   */
  @SuppressWarnings("Convert2Lambda")
  public void sortTableMitarbeiteruebersicht(final int column)
  {
    Collections.sort(this.dataVector, new Comparator() 
    {
      @Override
      public int compare (Object o1, Object o2) {
        Vector v1 = (Vector) o1;
        Vector v2 = (Vector) o2;
        String s1 = (String) v1.get(column);
        String s2 = (String) v2.get(column);
        return s1.compareTo(s2);
      }
    });
  }
Die Methode erwartet als Parameter die Spaltennummer, welche als Basis für die Sortierung dient.

Der Aufruf erfolgt über ein MouseEvent, in welchem ermittelt wird, auf welchen Spaltenkopf geklickt wurde.

      jt_mitarbeiterUebersicht.getTableHeader().addMouseListener
        (new MouseAdapter() {
         @Override
        public void mousePressed(MouseEvent evt) {
          try
          {
          model.sortTableMitarbeiteruebersicht(
                  jt_mitarbeiterUebersicht.columnAtPoint(evt
                          .getPoint()));
          }
          catch(NullPointerException e)
          {
          }
        }
      });
nach oben Java4Beginners -- Seitenversion 1.0 -- Stand: 2017-07-18