Java-Tipp 116: Legen Sie Ihre Tabellenoptionen fest - zur Laufzeit!

Java Foundation Classes (JFC) bieten eine umfangreiche Auswahl an Komponenten zum Erstellen intelligenter und interaktiver grafischer Benutzeroberflächen (GUIs). Mit der javax.swing.JTableKlasse können Sie tabellarische Daten anzeigen . In diesem Java-Tipp untersuchen wir, wie einige häufig auftretende JTableProbleme gelöst werden können .

Lassen Sie uns zunächst unsere ersten, grundlegenden definieren JTableKlasse MyTable:

import javax.swing.table. *; import javax.swing. *; import java.awt. *; öffentliche Klasse MyTable erweitert JTable {// Standardkonstruktor public MyTable () {super (); } // Konstruktor zum Erstellen einer Tabelle mit der angegebenen Anzahl von Zeilen und Spalten public MyTable (int row, int col) {super (row, col); }}

Ziemlich einfach! Unsere erste MyTableImplementierung ist nur eine Aktie JTable.

In den folgenden Abschnitten werden wir mit verschiedenen JTableAnzeigeoptionen arbeiten, z. B. Bildlaufleisten, Spaltenbreiten, Auswahl und anderen Attributen. Wir werden MyTableverschiedene Methoden erweitern und integrieren, die die Anzeigefunktionen unterstützen, die wir ändern möchten. Jeder Abschnitt fügt der MyTableKlasse eine neue Methode hinzu , sodass wir am Ende eine vollständig wiederverwendbare haben JTable.

Scrollen Sie durch Ihre Tabellen

Verwenden wir JTablezunächst unsere , um einige tabellarische Daten anzuzeigen. Ich habe die TableColumnTestKlasse erstellt, um JTabledie Fähigkeiten zu demonstrieren :

import javax.swing.table. *; import javax.swing. *; import java.awt.event. *; import java.awt. *; / ** Autor Sonal Goyal, [email protected] * / öffentliche Klasse TableColumnTest {protected JFrame frame; geschützter JScrollPane-Bildlaufbereich; geschützte MyTable-Tabelle; public TableColumnTest () {// (1) Erstellen Sie das Tabellenmodell. DefaultTableModel dm = new DefaultTableModel (); // Namen für jede der Spalten. String [] columnNames = {"Dies wird ein sehr langer Spaltenkopf", "Spalte B", "Spalte C", "Spalte D", "Spalte E", "Spalte F", "Spalte G", " Spalte H "," Spalte I "," Spalte J "}; // Die tatsächlichen Datenwerte. Integer [] [] data = new Integer [8] [10]; // Fülle die Datenmatrix. für (int row = 0; row <8; row ++) {for (int col = 0; col <10;++ col) {data [row] [col] = neue Ganzzahl (1000000); }} // Konfigurieren Sie das Modell mit den Daten- und Spaltenüberschriften. dm.setDataVector (Daten, Spaltennamen); // (2) Erstellen Sie die Tabelle. table = new MyTable (); // (3) Verbinde das Modell mit der Tabelle. table.setModel (dm); // (4) Erstellen Sie einen Bildlaufbereich für die Tabelle. scrollpane = neues JScrollPane (Tabelle); // (5) Machen Sie die Tabelle sichtbar. frame = neuer JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }}scrollpane = neues JScrollPane (Tabelle); // (5) Machen Sie die Tabelle sichtbar. frame = neuer JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }}scrollpane = neues JScrollPane (Tabelle); // (5) Machen Sie die Tabelle sichtbar. frame = neuer JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }}

Die Demonstrationsanwendung ist ziemlich einfach. Wir konstruieren eine einfache, JTableindem wir Folgendes tun:

  • Erstellen und konfigurieren Sie die TableModel, die Informationen zu Zeilen, Spalten, Spaltenüberschriften und den tatsächlichen Daten enthält

  • Erstellen und konfigurieren Sie die JTable, die die Daten aus dem Modell anzeigt

  • Verbinden Sie das JTablemit dem im ersten Schritt erstellten Modell

Diese erste Codeliste enthält jedoch eine Wendung: In Schritt 4 wird ein Bildlaufbereich hinzugefügt. Wir zeigen die erstellte und konfigurierte Tabelle in a an JFrame. Die Bildlaufergebnisse finden Sie in Abbildung 1.

Wie in Abbildung 1 dargestellt, ist es schwierig, Spaltenüberschriften oder Tabellendaten zu erkennen. Obwohl wir eine Bildlaufleiste hinzugefügt haben, wird die horizontale Bildlaufleiste nicht angezeigt. Ein genauer Blick auf die JTableKlasse zeigt, warum. Die JTableKlasse verfügt über ein Attribut für den automatischen Größenänderungsmodus, das bestimmt, ob die Größe der Spaltenbreite der Tabelle automatisch geändert wird (um die gesamte Breite der Tabelle abzudecken) und wie diese Größenänderung durchgeführt wird. Dies kann einen der folgenden Werte annehmen:

  • AUTO_RESIZE_OFF: Passen Sie die Spaltenbreiten nicht automatisch an. Verwenden Sie eine Bildlaufleiste
  • AUTO_RESIZE_NEXT_COLUMN: Wenn eine Spalte in der Benutzeroberfläche angepasst wird, passen Sie die nächste Spalte in umgekehrter Richtung an
  • AUTO_RESIZE_SUBSEQUENT_COLUMNS: Ändern Sie während der Anpassung der Benutzeroberfläche nachfolgende Spalten, um die Gesamtbreite beizubehalten
  • AUTO_RESIZE_LAST_COLUMN: Wenden Sie während aller Größenänderungsvorgänge Anpassungen nur auf die letzte Spalte an
  • AUTO_RESIZE_ALL_COLUMNS: Ändern Sie bei allen Größenänderungsvorgängen die Größe aller Spalten proportional

Standardmäßig werden die JTableGrößen der anderen Spalten geändert , um das Gesamterscheinungsbild beizubehalten. Dies erklärt Abbildung 1. Wenn wir also die Spalten mit einer horizontalen Bildlaufleiste anzeigen möchten, fügen wir MyTableden Konstruktoren eine Methode hinzu und rufen sie von den Konstruktoren auf:

/ ** Diese Methode zeigt bei Bedarf die horizontale Bildlaufleiste an. * Es wird in den beiden hier bereitgestellten Konstruktoren aufgerufen. * / public void showHorScroll (boolesche Show) {if (show) {setAutoResizeMode (JTable.AUTO_RESIZE_OFF); } else {setAutoResizeMode (JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); }}

Abbildung 2 zeigt die Anzeige mit der sichtbaren horizontalen Bildlaufleiste:

Steuern von JTable-Spalten

Sie können die Breite Ihrer Spalten steuern und die Größe nicht ändern. Dieser Abschnitt zeigt Ihnen, wie.

Breitere Säulen

Oft möchten Sie eine Spalte breiter oder schmaler als eine andere. Um die Breite einer Spalte zu ändern, verwenden Sie Folgendes TableColumnModel:

/ ** Diese Methode sollte aufgerufen werden, um die Spalte * am pColumn-Index auf eine Breite von pWidth festzulegen. * / public void setColumnWidth (int pColumn, int pWidth) {// Das Spaltenmodell abrufen. TableColumnModel colModel = getColumnModel (); // Hole die Spalte am Index pColumn und setze ihre bevorzugte Breite. colModel.getColumn (pColumn) .setPreferredWidth (pWidth); }}

Sie können dem auch eine Schaltfläche und ihren Aktionslistener hinzufügen JFrame, sodass durch Klicken auf die Schaltfläche die Breite der Tabelle geändert wird:

JButton resizeButton = neuer JButton ("Resize Third Column"); setResizeButton.addActionListener (this); public void actionPerformed (ActionEvent e) {// Überprüfen Sie, auf welche Schaltfläche geklickt wurde. if (e.getActionCommand (). equals ("Größe der dritten Spalte ändern")) {System.out.println ("Größe ändern aufgerufen - Größe der dritten Spalte auf 300 ändern"); table.setColumnWidth (2, 300); // GUI-Update erzwingen. table.invalidate (); frame.invalidate (); frame.validate (); frame.repaint (); }}

In diesem Fall pColumnist dies der Spaltenindex und pWidthdie neue Breite. Das Vorher und Nachher des Klickens auf die Schaltfläche Größe ändern ist in den Abbildungen 3 und 4 dargestellt.

Nicht veränderbare Spalten

Für den allgemeinen Gebrauch können Sie die Größe von Spalten ändern, indem Sie die Überschriften ziehen. Der folgende Code entfernt die Möglichkeit, die Größe basierend auf zu ändern pIsResize. Wenn dies der pIsResizeFall ist, kann die Größe der Spalte geändert werden. Andernfalls kann die Größe nicht geändert werden:

public void setResizable (int pColumn, boolean pIsResize) {// Das Spaltenmodell abrufen. TableColumnModel colModel = getColumnModel (); // Größe ändern oder nicht. colModel.getColumn (pColumn) .setResizable (pIsResize); }}

In diesem Fall pColumnist der Index der nicht veränderbaren Spalte. Sie müssen nur die Spalte ( getColumn(..)) abrufen und eine einfache Eigenschaft ( setResizable(..)) festlegen.

Spaltenauswahl

Warum nicht eine ganze Spalte mit einem Klick auf eine Schaltfläche auswählen und nicht eine einzelne Zelle? Das JTablezeigt ausgewählte / abgewählte Zellen durch Aufrufen der isCellSelected(int row, int col)Methode einer Zelle an . Wenn Sie diese Methode überschreiben, erhalten Sie die gewünschten Ergebnisse, die von der booleschen Auswahl abhängen und als Parameter an die setSelect()Methode übergeben werden. Wenn true, wird die Spalte ausgewählt. Wenn false, wird es nicht ausgewählt. Der Schlüssel besteht darin, die Spalte als zu speichern colSelect(), wobei ein "Auswählen" -Flag angibt, ob diese Spalte ausgewählt oder abgewählt werden soll:

int colSelect; Boolesche Auswahl; / ** Setzt die Spalte am Index col auf ausgewählt oder abgewählt * - basierend auf dem Wert von select. * / public void setSelect (int col, boolean select) {colSelect = col; this.select = select; } / ** Diese Methode gibt zurück, ob eine bestimmte Zelle ausgewählt ist oder nicht. * / public boolean isCellSelected (int row, int column) löst IllegalArgumentException aus {// überschreibe die Methode für die in setSelect () festgelegte Spalte if (colSelect == column) {if (select) return true; sonst return false; } else {return super.isCellSelected (Zeile, Spalte); }}

Abbildung 5 zeigt das Ergebnis, bei dem Spalte D ausgewählt wurde.

Steuerungsheader

Wie Sie vielleicht bemerkt haben, ist die Spaltenüberschrift in der ersten Spalte länger als die Breite dieser Spalte. Wir beheben dies durch Zurücksetzen der Spaltenbreite:

/ ** Legt die Kopf- und Spaltengröße gemäß dem Kopfzeilentext fest * / public void setHeaderSize (int pColumn) {// Liefert den Spaltennamen der angegebenen Spalte. String value = getColumnName (pColumn); // Berechnen Sie die für die Spalte erforderliche Breite. FontMetrics-Metriken = getGraphics (). GetFontMetrics (); int width = metrik.stringWidth (Wert) + (2 * getColumnModel (). getColumnMargin ()); // Breite einstellen. setColumnWidth (pColumn, width); }}

Wenn der obige Code ausgeführt wird, zeigt Abbildung 6 das Ergebnis des Spaltenkopfs mit geänderter Größe.

Eine funktionsreiche JTable

In diesem Tipp haben wir verschiedene Anzeigeoptionen auf einfache Weise ausprobiert JTableund diese Optionen geändert, nachdem die Tabelle angezeigt wurde. Dabei haben wir eine Tabelle entwickelt, die umfassendere Benutzerinteraktionsfunktionen bietet. Entdecken Sie den Rest der JTableFunktionen und finden Sie heraus, welche interessanten Sie erstellen können!

Sonal Goyal arbeitet seit drei Jahren mit Java. Sie ist eine in Indien ansässige Ingenieurin und hat intensiv am Entwurf und der Implementierung objektorientierter Systeme mit Java IO, JFC, CORBA, i18n und Reflection gearbeitet. John D. Mitchell ist der Java Tips-Koordinator für JavaWorld.

Erfahren Sie mehr über dieses Thema

  • Der Quellcode für den abgeschlossenen TableColumnTest

    //images.techhive.com/downloads/idge/imported/article/jvw/2001/09/tablecolumntest.java

  • Der Quellcode für die ausgefüllte MyTable

    //images.techhive.com/downloads/idge/imported/article/jvw/2001/09/mytable.java

  • Zeigen Sie die JTable-API-Dokumentation an

    //java.sun.com/j2se/1.3/docs/api/javax/swing/JTable.html

  • Durchsuchen Sie das Swing JTable-Tutorial unter

    //www.java.sun.com/docs/books/tutorial/uiswing/components/table.html

  • "Java-Tipp 102 Fügen Sie mehrere JTable-Zelleneditoren pro Spalte hinzu", Tony Colston ( JavaWorld )

    //www.javaworld.com/javaworld/javatips/jw-javatip102.html

  • "Java-Tipp 77Eine Funktion zum Kopieren und Einfügen zwischen JTables und Excel von Swing aktivieren", Ashok Banerjee und Jignesh Mehta ( JavaWorld )

    //www.javaworld.com/javaworld/javatips/jw-javatip77.html

  • Weitere Informationen zu AWT / Swing finden Sie im aktuellen Index von JavaWorld

    //www.javaworld.com/channel_content/jw-awt-index.shtml

  • Weitere Informationen zu Foundation-Klassen finden Sie im aktuellen Index von JavaWorld

    //www.javaworld.com/channel_content/jw-foundation-index.shtml

  • Weitere Informationen zum Design von Benutzeroberflächen finden Sie im aktuellen Index von JavaWorld

    //www.javaworld.com/channel_content/jw-ui-index.shtml

  • Zeigen Sie alle vorherigen Java-Tipps an und senden Sie Ihre eigenen

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Lernen Sie Java von Grund auf in Javaworld‘ s Java 101 Säule

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Java - Experten beantworten Ihre härtesten Java Fragen in Javaworld‘ s Java Q & A - Säule

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Melden Sie sich für den kostenlosen wöchentlichen E-Mail-Newsletter von JavaWorld an

    //www.idg.net/jw-subscribe

  • Unter .net finden Sie eine Fülle von IT-Artikeln aus unseren Schwesterpublikationen

Diese Geschichte, "Java-Tipp 116: Legen Sie Ihre Tabellenoptionen fest - zur Laufzeit!" wurde ursprünglich von JavaWorld veröffentlicht.