Zellen einer JTable unterschiedlich formatieren

Nachtfalke

Aktives Mitglied
Hallo zusammen,

ich habe noch ein paar Schwierigkeiten mit JTables und habe folgende Frage:

Wie kann ich die Zellen einer JTable unterschiedlich formatieren (Hintergrundfarbe, Font, Ausrichtung, etc.). Kann ich jeder Zelle einen eigenen CellRenderer zuweisen (wenn ja, wie?) oder muss ich allen Zellen den gleichen Renderer zuweisen und im Renderer dann für jede Zelle die Formatierungen codieren?
 

Runtime

Top Contributor
Der TableCellRenderer erstellt die Zellen, d. h. du kannst den Zellen den Renderer nicht zuweisen. Wenn du innerhalb der Zelle verschiedene Formatierungen haben willst, dann musst du ein CellRenderer implementieren, der JEditorPanes oder JTextPanes zurückgibt.
 

André Uhres

Top Contributor
Hallo Nachtfalke,

gewöhnlich wird ein einziger Cellrenderer verwendet, um alle Zellen zu zeichnen, die die gleiche Art von Daten enthalten (oder alle Zellen einer Spalte).

Wir können uns den Renderer als konfigurierbaren Stempel denken, den die Tabelle verwendet, um passend formatierte Daten auf jede Zelle zu stempeln. Da dieser "Stempel" konfigurierbar ist, sind auch zellenabhängige Unterschiede möglich:

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class TestTable1 extends JPanel {

    private JTable table;

    public TestTable1() {
        setLayout(new BorderLayout());
        table = new JTable(10, 10);
        add(new JScrollPane(table));
        table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                int rowM = table.convertRowIndexToModel(row);
                int columnM = table.convertColumnIndexToModel(column);
                if (rowM == 1 && columnM == 2) {
                    c.setBackground(Color.red);
                } else if (rowM == 4 && columnM == 2) {
                    c.setBackground(Color.green);
                } else {
                    c.setBackground(Color.white);
                }
                return c;
            }
        });
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        TestTable1 newContentPane = new TestTable1();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);
        frame.setVisible(true);
    }
}

Wichtig ist, dass die "Konfiguration" immer auch einen "else"-Fall hat, wodurch gleichermaßen die Eigenschaften der "normalen" Zellen gesetzt werden.

Da wir die Eigenschaften gewöhnlich auf das Model beziehen, ist eine entsprechende Konversion der Zellkoordinaten erforderlich (convertXXXIndexToModel).

Die if-Bedingungen müssen natürlich nicht explizite Zeilen- und Spaltennummern sein, sondern können sich z.B. auch auf die Daten der darzustellenden Zelle oder benachbarter Zellen beziehen.

Die Werte der Eigenschaften (wie hier die "Background" Eigenschaft) müssen ebenfalls nicht unbedingt explizit angegeben werden, sondern können selbstverständlich auch von Collections oder anderen Objekten geholt werden.

Gruß,
André
 
Zuletzt bearbeitet:

Nachtfalke

Aktives Mitglied
Erstmal danke für die ausführliche Erklärung. Wenn ich das richtig verstanden habe, muss ich also ein Speicherobjekt (z.B. einen Vector) anlegen, in dem ich die Formatierungen speichere, wenn ich die Formatierung einzelner Zellen zur Laufzeit ändern möchte, und dann in der Methode getTableCellRendererComponent diesen Vector auslesen, um die Formatierungen entsprechend zu setzen?

@Runtime: Es geht nicht um verschiedene Formatierungen innerhalb einer Zelle, sondern um unterschiedlich formatierte Zellen innerhalb einer Tabelle.
 

André Uhres

Top Contributor
Wenn ich das richtig verstanden habe, muss ich also ein Speicherobjekt (z.B. einen Vector) anlegen, in dem ich die Formatierungen speichere, wenn ich die Formatierung einzelner Zellen zur Laufzeit ändern möchte, und dann in der Methode getTableCellRendererComponent diesen Vector auslesen, um die Formatierungen entsprechend zu setzen?

Das geht in die richtige Richtung. Allerdings würde ich "Vector" vermeiden, weil diese Klasse veraltet ist. Aber es stehen ja genug andere Collection und Map Klassen zur Verfügung, wo wir eine geeignete auswählen können.

Gruß,
André
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
B Swing Drag&Drop einzelner Zellen in einer JTable AWT, Swing, JavaFX & SWT 12
R JTable: Zellen einer Spalte unterschiedlich befüllen AWT, Swing, JavaFX & SWT 2
R JTable: Zellen einer Zeile zusammenfassen? AWT, Swing, JavaFX & SWT 3
H JTable Text aus mehreren Zellen in einer Spalte kopieren? AWT, Swing, JavaFX & SWT 3
R JTable, automatischer resize der Zellen nach einer Eingabe AWT, Swing, JavaFX & SWT 4
B einzelne Zellen scrollbar machen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 3
S Mehrere Tabellen Zellen gleichzeitig färben AWT, Swing, JavaFX & SWT 5
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
I JavaFX Zellen in Tableview editieren AWT, Swing, JavaFX & SWT 0
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
B JavaFX TableView-Zellen sollen automatisch so groß wie der größte Inhalt sein AWT, Swing, JavaFX & SWT 6
J Tableview - kann man mit Enter die Zellen wechseln AWT, Swing, JavaFX & SWT 1
S JavaFX GridPane Zellen Seitenverhätnis passend ändern mit der Stage AWT, Swing, JavaFX & SWT 0
E JavaFX TableView mit Zeilenumbruch in Zellen AWT, Swing, JavaFX & SWT 5
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
J Zellen in JavaFx einfärben funktioniert nicht AWT, Swing, JavaFX & SWT 1
A Swing JTable Umgang mit Zellen AWT, Swing, JavaFX & SWT 2
S Swing Zeilenumbruch in JTable Zellen AWT, Swing, JavaFX & SWT 3
D Swing Mit TableCellRenderer einzelne Zellen markieren AWT, Swing, JavaFX & SWT 3
M Swing Jtable zellen zentrieren AWT, Swing, JavaFX & SWT 4
J CellEditorListener wird für ALLE Zellen ausgeführt AWT, Swing, JavaFX & SWT 2
V JTable: Zugriff auf einzelne Zellen AWT, Swing, JavaFX & SWT 4
M JTable Zeilen und Zellen einfärben AWT, Swing, JavaFX & SWT 11
GUI-Programmer JTable - zentrierte Zellen AWT, Swing, JavaFX & SWT 2
K Swing CellEditor für einzelne Zellen AWT, Swing, JavaFX & SWT 2
B JTable Selektion von Zellen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing JTable Zellen intelligenter Zeilenumbruch AWT, Swing, JavaFX & SWT 4
K Swing JTable Editierfunktion für einzelne Zellen ausschalten AWT, Swing, JavaFX & SWT 3
E Swing zellen fixen AWT, Swing, JavaFX & SWT 7
X JTable Zellen nicht editierbar AWT, Swing, JavaFX & SWT 5
S Swing JTable - Editierung von Zellen abfangen AWT, Swing, JavaFX & SWT 3
C [SWT] Widget Table verliert nach Sortierung farbige / eingefärbter Background / Zellen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable (bestimmte Zellen umrahmen) AWT, Swing, JavaFX & SWT 8
T JTable Zellen Farbe AWT, Swing, JavaFX & SWT 13
N Swing JTable: Zellen verbinden AWT, Swing, JavaFX & SWT 11
D Swing JTable, Zellen-Farbe über Koordinaten ändern AWT, Swing, JavaFX & SWT 9
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
D Swing JTable Problem bei automatischem update von Zellen AWT, Swing, JavaFX & SWT 3
G JTable Multiple Row Header Example - Probleme mit der Höhe der Zellen AWT, Swing, JavaFX & SWT 4
C Swing JTable: Horizontale Linie bei einzelnen Zellen ausblenden AWT, Swing, JavaFX & SWT 5
C JTable: Alle selektierten Zellen abfangen AWT, Swing, JavaFX & SWT 13
C GridBagLayout Zellen verbinden AWT, Swing, JavaFX & SWT 13
V Nur zulässige Zeichen in JTable-Zellen eintragen können AWT, Swing, JavaFX & SWT 2
C Spielfeld Gitter - Einzelne Zellen verändern AWT, Swing, JavaFX & SWT 18
J CellRenderer einzelne zellen Hintergrund AWT, Swing, JavaFX & SWT 9
F Text Vertical in Zellen von JTable AWT, Swing, JavaFX & SWT 3
S Swing JTable Auswahl mehrerer Zellen mit STRG+Maus AWT, Swing, JavaFX & SWT 3
A Flexible JTable mit editierbaren Zellen,abhängig von Data AWT, Swing, JavaFX & SWT 2
C JTable und farbige Zellen AWT, Swing, JavaFX & SWT 5
S Übernehmen von Inhalten aus Zellen in JTables ohne Return AWT, Swing, JavaFX & SWT 7
R JTable darstellen von leeren Zellen AWT, Swing, JavaFX & SWT 12
E Drag&Drop JTable; Renderer füllt alle Zellen AWT, Swing, JavaFX & SWT 10
R JTable updatePaint() angabe der geänderten Zellen AWT, Swing, JavaFX & SWT 3
R JTable mehrere Zellen mit Shift selektieren AWT, Swing, JavaFX & SWT 2
R JTable einzelne Zellen selektieren AWT, Swing, JavaFX & SWT 7
R JTable - Rendern der einzelnen Zellen AWT, Swing, JavaFX & SWT 3
G nicht editierbare Zellen AWT, Swing, JavaFX & SWT 15
X in JTable nur einige Zellen editierbar machen AWT, Swing, JavaFX & SWT 2
T Zellen editierbar oder nicht AWT, Swing, JavaFX & SWT 6
T JTree: Beschriftung der Zellen AWT, Swing, JavaFX & SWT 3
G JTable: Spalten & Zellen fixieren wie in Excel AWT, Swing, JavaFX & SWT 4
G JTable Zellen makieren AWT, Swing, JavaFX & SWT 2
M JTable Zelle ändern -> andere Zellen mit ändern AWT, Swing, JavaFX & SWT 5
J JTable Zellen und Header AWT, Swing, JavaFX & SWT 2
W Zellen Inhalt beim editieren markieren AWT, Swing, JavaFX & SWT 2
C Zellen editieren AWT, Swing, JavaFX & SWT 4
A Zellen in JTable auf Klick kurz markieren auf Klick AWT, Swing, JavaFX & SWT 2
J JTabel: TableHeader und Zellen Problem AWT, Swing, JavaFX & SWT 2
E JTable; DefaultTableCellRenderer. Zellen farbig befüllen. AWT, Swing, JavaFX & SWT 5
E JTable-während der Einfügezeit der Zellen in die Table AWT, Swing, JavaFX & SWT 2
F Zellen über eine Grafik legen AWT, Swing, JavaFX & SWT 7
M [Swing] Kalender mit JTable / Einfärben von Zellen AWT, Swing, JavaFX & SWT 10
A JTable, mehrere Zellen markieren AWT, Swing, JavaFX & SWT 3
J [SWT] alle Zellen in einem Tree einzeln selektieren AWT, Swing, JavaFX & SWT 2
L Again: In JTable bestimmte Zellen färben AWT, Swing, JavaFX & SWT 12
M CellEditor für individuelle Zellen in JTable AWT, Swing, JavaFX & SWT 3
G JTable(Zellen) und JPanel AWT, Swing, JavaFX & SWT 2
D Im JTable bei einzelnen Zellen die Farbe ändern AWT, Swing, JavaFX & SWT 3
G Rowspan (Zellen verbinden) in JTable? AWT, Swing, JavaFX & SWT 3
R JTable Zellen markieren AWT, Swing, JavaFX & SWT 3
T JTable, Zeilenumbruch in Zellen AWT, Swing, JavaFX & SWT 23
I einzelne Zellen bei JTable markieren AWT, Swing, JavaFX & SWT 3
M JTable und Farbe von Zellen AWT, Swing, JavaFX & SWT 2
J Zellen editieren ausschalten AWT, Swing, JavaFX & SWT 2
G Zellen in JTable alphabetisch sortieren AWT, Swing, JavaFX & SWT 13
N JTable - Problem mit markieren von Zellen AWT, Swing, JavaFX & SWT 3
B JTable-Zellen einfärben AWT, Swing, JavaFX & SWT 6
W JTable Zellen verbinden AWT, Swing, JavaFX & SWT 2
D JTree - Größe der Zellen anpassen AWT, Swing, JavaFX & SWT 8
S JTable Zellen ändern AWT, Swing, JavaFX & SWT 3
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben