java-forum.org
JBoss Seam
Alter Preis: 39,95 €
Jetzt: 0,00 €

zzgl. Versandkosten

Zurück   java-forum.org > Java-Forum FAQs > FAQ - Übersicht > Java-FAQ Beiträge

Java-FAQ Beiträge Archiv von häufig gestellten Fragen, unsortierte Auflistung

Thema geschlossen
Themen-Optionen Thema durchsuchen Ansicht
Alt 04.06.2004, 21:36   #1 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von Beni
 
Registriert seit: 07.02.2004
Beiträge: 7.644
Abgegebene Danke: 0
Erhielt 13 Danke für 10 Beiträge
Standard JTable - Teil 6 - JTableHeader,TableColumn,TableColumnModel

Zitat: Roar
JTable - Teil 6 - JTableHeader, TableColumn und das TableColumnModel

JTableHeader
Der JTableHeader ist ein Component, der die Darstellung der Tabellenspalten einer JTable übernimmt. Meistens braucht an diesen Component nicht, da JTable ihn standardmäßig mitinstantiiert. Die beiden Methoden getTableHeader() und setTableHeader() in JTable bieten an mit dem JTableHeader zu arbeiten. JTableHeader ist nicht dazu da um Spalten hinzuzufügen oder zu entfernen, sondern nur für die Darstellung zuständig. Für die Daten der Spalten ist das TableColumnModel zuständig, welches man wahlweise der JTable oder dem JTableHeader übergeben kann.

JTableHeader, in javax.swing.table, bietet einige interessante Methode an um die Spalten zu manipulieren. Die gebräuchlichsten beiden Methoden sind, finde ich, setReorderingAllowed(boolean reorderingAllowed) und setResizingAllowed(boolean resizingAllowed). Sie sollten selbsterklärend sein. Hier ein kleiens Beispielprogramm:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableColumn;
 
 
 
class TableHeaderTest {
    
    public static void main(String[] args) {
        // JTable initialisieren und mit Inhalt füllen; siehe dazu Teil 2
        JTable table = new JTable(new String[][]{{"1", "2", "3"},{"4", "5", "6"}}, new String[]{"A", "B", "C"});
        
        // JTableHeader holen
        JTableHeader header = table.getTableHeader();
        
        // ColumnModel holen:
        TableColumnModel columnModel = header.getColumnModel();
        
        // TableColumn erstellen
        TableColumn aColumn = new TableColumn();
        // setHeaderValue() setzt den Titel
        aColumn.setHeaderValue("D");
        // modelIndex zeigt an von welcher Spalte im DatenModel die neue Spalte ihre Werte holen soll
        aColumn.setModelIndex(1); // Index 1 im Model sind also "2" und "5"
        columnModel.addColumn(aColumn);
        
        // eine spalte verschieben
        columnModel.moveColumn(0, 2); // Spalte 0 (mit Titel "A") verschieben an Position 2 im Model
        
        // Spalten nicht resizable machen, nicht zulassen dass die Spaltenreihenfolge geändert werden kann
        header.setResizingAllowed(false);
        header.setReorderingAllowed(false);
        
        // JFrame konstruieren
        JFrame frame = new JFrame("JTableHeader test");
        // Table in JScrollPane einfügen und dem Frame hinzufügen
        frame.getContentPane().add(new JScrollPane(table));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

Ausgabe:



Erklärung:
Zuerst wird die Tabelle ganz normal angelegt, dann holt sich das Programm den JTableHeader der Tabelle. Vom TableHeader das DolumnModel, was aber auch direkt über die JTable gehen würde. Dann wird eine Spalte hinzugefügt, mit dem Model Index 1 (Das TableModel ist in Teil 2 erklärt). Danach wird die Spalte an position 0 ("A") vershcoben an position 2. Man muss immer daran denken dass das Zählen bei 0 anfängt, also sind mit den Zahlen immer die Positionen im Model gemeint. Letztendlich wird noch verboten die Spaltengröße, und die Spaltenreihenfolge zu ändern.

Header selber zeichnen

Eine weitere Möglichkeit von JTableHeader und TableColumn ist, wie auch bei JTable möglich, den Renderer für die Spalte zu setzen.
Es wird das gleiche Renderer Interface benutzt wie bei der JTable: javax.swing.table.TableCellRenderer. Zugewiesen wird der Renderer mit setDefaultRenderer(TableCellRenderer defaultRenderer);

Beispiel:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 
import java.awt.Component;
import java.awt.Color;
import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableCellRenderer;
 
 
 
class TableHeaderTest {
    
    public static void main(String[] args) {
        // JTable initialisieren und mit Inhalt füllen; siehe dazu Teil 2
        JTable table = new JTable(new String[][]{{"1", "2", "3"},{"4", "5", "6"}}, new String[]{"A", "B", "C"});
        
        // JTableHeader holen
        JTableHeader header = table.getTableHeader();
        
        // ColumnModel holen:
        TableColumnModel columnModel = header.getColumnModel();
        
        // TableColumn erstellen
        TableColumn aColumn = new TableColumn();
        // setHeaderValue() setzt den Titel
        aColumn.setHeaderValue("D");
        // modelIndex zeigt an von welcher Spalte im DatenModel die neue Spalte ihre Werte holen soll
        aColumn.setModelIndex(1); // Index 1 im Model sind also "2" und "5"
        columnModel.addColumn(aColumn);
        
        // eine spalte verschieben
        columnModel.moveColumn(0, 2); // spalte 0 (mit Tiel "A") verschieben an position 2 im model
        
        // spalten nicht resizable machen, nicht zulassen dass die spaltenreihenfolge geändert werden kann
        header.setResizingAllowed(false);
        header.setReorderingAllowed(false);
        
        // Renderer zuweisen
        header.setDefaultRenderer(new MyHeaderCellRenderer());
        
        // JFrame konstruieren
        JFrame frame = new JFrame("JTableHeader test");
        // Table in JScrollPane einfügen und dem Frame hinzufügen
        frame.getContentPane().add(new JScrollPane(table));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}
 
 
// Eigener CellRenderer für die spaltenköpfe. Liefert immer ein 
// JLabel zurück, und implementiert TableCellRenderer
class MyHeaderCellRenderer extends JLabel implements TableCellRenderer {
    
    // einzig wichtige methode
    public Component getTableCellRendererComponent(JTable table, Object value, 
            boolean isSelected, boolean hasFocus, int row, int column) {
        // text
        setText(value.toString());
        // normale schriftart
        setFont(table.getFont());
        // der standard rahmen für spaltenköpfe
        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        // text zentiriert darstellen
        setHorizontalAlignment(SwingConstants.CENTER);
        // tooltip
        setToolTipText("Colum No. "+(column+1));
        // undurchsichtig damit man die hintergrundfarbe sieht.
        setOpaque(true);
        // je nach spalte die hintergrundfarbe setzen
        switch(column) {
            case 0:  setBackground(Color.GREEN); break;
            case 1:  setBackground(Color.BLUE); break;
            case 2:  setBackground(Color.YELLOW); break;
            case 3:  setBackground(Color.RED); break;
            default: setBackground(Color.LIGHT_GRAY);
        }
        return this;
    }
}

Ausgabe:



Hier wird zwar nur die Hintergrundfarbe geändert, Aber es gibt noch sehr viel mehr Möglichkeiten Die Spaltenköpfe zu manipulieren mithilfe des CellRenderers. Genau wie in Teil 3 beschrieben kann man auch andere komponenten die Darstellung der Header übernehmen lassen. Dazu muss man allerdings den CellRenderer anpassen (siehe auch Teil:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
class MyHeaderCellRenderer implements TableCellRenderer {
    
    // einzig wichtige methode
    public Component getTableCellRendererComponent(JTable table, Object value, 
            boolean isSelected, boolean hasFocus, int row, int column) {
        JComponent c = null;
        if(value instanceof String ) {
            c = new JLabel((String)value);
            ((JLabel)c).setHorizontalAlignment(SwingConstants.CENTER);
        } else if(value instanceof JCheckBox) {
            c = (JCheckBox) value;
        } else if(value instanceof JComboBox) {
            c = (JComboBox) value;
        } else {
            c = new JLabel(value.toString());
            ((JLabel)c).setHorizontalAlignment(SwingConstants.CENTER);
        }
        c.setEnabled(true);
        // normale schriftart
        c.setFont(table.getFont());
        // der standard rahmen für spaltenköpfe
        c.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        // text zentiriert darstellen
        c.setToolTipText("Colum No. "+(column+1));
        // undurchsichtig damit man die hintergrundfarbe sieht.
        c.setOpaque(true);
        // je nach spalte die hintergrundfarbe setzen
        switch(column) {
            case 0:  c.setBackground(Color.GREEN); break;
            case 1:  c.setBackground(Color.BLUE); break;
            case 2:  c.setBackground(Color.YELLOW); break;
            case 3:  c.setBackground(Color.RED); break;
            default: c.setBackground(Color.LIGHT_GRAY);
        }
        return c;
    }

Jetzt gibt es aber das Problem dass man die Komponenten nicht ändern kann. Das ist auch etwas komplizierter, aber gute Tutorials,
die sich damit eingehender beschäftigen findet man z.B. hier:
New site launched | objects, hosting, tutoring | objects
Dort sind auch andere mehrere tiefergehende Beispiele zu JTableHeader und TableColumn.
© August 2004
Dieses Tutorial unterliegt dem Copyright, Kopien (auch nur von Teilen) sind nur für nicht-komerzielle Zwecke gestattet; Detailfragen (insbesondere bei Unsicherheiten), bitte direkt an die Autoren.
__________________
dock.javaforge.com

Byte-Welt
Beni ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen

Lesezeichen

Latex Maths & Physics Editor ...

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
JTable - TableColumnModel - TableModel diggaa1984 AWT, Swing & SWT 3 23.02.2009 13:40
JProgressBar in TableColumn von JTable setzen/abfragen Henry(ette) AWT, Swing & SWT 5 22.08.2008 17:47
JTable / JTableHeader / TableCellRenderer Dravere AWT, Swing & SWT 0 09.01.2008 01:20
JTable/DefaultTableModel/TableColumn gr33b Java Basics - Anfänger-Themen 1 31.01.2006 09:36


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:56 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de