Jtable defaultRenderer wohin damit ?

student86

Mitglied
Hallo Leute,

mein Ziel ist es Daten die aus einer Datenbank stammen in einem Viewer (Jtable) anzuzeigen (bis hier läuft alles) aber wenn in Spalte 10 eine "1" eingetragen ist soll die Zeile "grün" darzustellen.

Habe nun einiges darüber gelesen den Renderer zu bearbeiten, aber ich wieß nicht wo dieser hingehört ?

Java:
public class DB_Viewer extends JFrame {

    private final int small = 50;
    private final int big = 150;


    public static JTable table;

    public DB_Viewer() {
        getContentPane().setLayout(null);
        table = new JTable(new SimpleTableModel());


        JScrollPane sPane = new JScrollPane(table);
        sPane.setBounds(0, 0, 1184, 822);

        getContentPane().add(sPane);
        this.setSize(1200, 940);
      
   
        sPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        sPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        this.setVisible(true);
    }

      public void setColumnWidth() {
        for (int i = 0; i < table.getColumnCount(); i++) {
           TableColumn c = table.getColumnModel().getColumn(i);
            c.setPreferredWidth(150);
        }
    }

    public static void main(String[] args) {
        new DB_Viewer();
    }
}

class SimpleTableModel extends DefaultTableModel {

    private int rows = 30, iZeilen=main.DB_title.length;
    private Object[] rowData = new Object[iZeilen];

    public SimpleTableModel() {
        super();
        initModelData(); 
      
    }
    private void initModelData() {
        System.out.println( "Datenbank Schreiben " );
      
  
        for (int i = 0; i < iZeilen; i++) {
       
            this.addColumn(main.DB_title[i]);
        }
        for (int j = 0; j < rows; j++) {
            for (int i = 0; i < iZeilen; i++) {
                rowData[i] = main.sDatenbankinhalt[j][i];
              
            }
            this.addRow(rowData);

         
        } 
    } 
}
 

student86

Mitglied
Anschließend füge ich die Funktion hinzu

Code:
public class myRenderer implements TableCellRenderer {
}

weiß da aber irgendwie nicht mit umzugehen, kennt Ihr vllt einen Link wo ich mal Grundlagen diesbezüglich nachlesen, versteh da denke ich was Grundlegend nicht.
 

student86

Mitglied
Den Renderer habe ich nun zugewiesen aber mein Print im Renderer wird nie aufgerufen... ?

Java:
        getContentPane().setLayout(null);
        table = new JTable(new SimpleTableModel());
        System.out.println("renderer ruweisen");
        table.setDefaultRenderer(Color.class, new ColorTableCellRenderer());
      
        JScrollPane sPane = new JScrollPane(table);


Code:
 class ColorTableCellRenderer extends DefaultTableCellRenderer{
   
       
        public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);
             System.out.println("Ausführung Renderer");
      ....
...
...
   
            return this;
        }
    }


Das "System.out.println("Ausführung Renderer");" wird nie ausgeführt.
Wird der renderer vllt. nicht aufgerufen weil ich ein SimpleTableModel verwende ?
 

Thallius

Top Contributor
Nein, sondern weil es keine Spalte gibt die eine Color als Klasse hat. Du must schon das angeben was dageändert werden soll. In Deinem Fall wahrscheinlich String.class oder Integer.class oder sowas.
 

student86

Mitglied
Also ich beschreibe meine Tabelle mit einem String Array.

Java:
 class SimpleTableModel extends DefaultTableModel {

    private Object[] rowData = new Object[main.DB_title.length];

    public SimpleTableModel() {
        super();
        initModelData(); 
      
    }
   
    public  void initModelData() {
        System.out.println( "Datenbank Schreiben " );
        for (int i = 0; i < main.DB_title.length; i++) {
            this.addColumn(main.DB_title[i]);
        }
        for (int j = 0; j < main.Anzahl_Teile_in_DB; j++) {
            for (int i = 0; i < main.DB_title.length; i++) {
                rowData[i] = main.sDatenbankinhalt[j][i];
            }
            this.addRow(rowData); 
   
        }  
    }  
}
 

thet1983

Top Contributor
table.setDefaultRenderer(Color.class, new ColorTableCellRenderer()
kann schon mal nicht funktionieren...hast du im Model eine Cell die von Color stammt? Nein!

Deine Daten sind alle String s oder?
Nun was glaubst du was statt Color.class jetzt hin gehört?
Richtig : String.class

was gibt diese Methode zurück?
public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column)

Richtig : Component
Component ist die Mutterklasse von?
Richtig: Button, Textcomponents...etc

Also was muss ich wohl machen wenn diese Methode einen Rückgabewert benötigt?
Richtig : ich geb im einen ( ein TextField, Label, Button.....)

nur demo code
Java:
@Override
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
           int row, int column) {

       JTextField cell = new JTextField();
       cell.setText((value == null)? "NO VALUE" : value.toString());
       cell.setBackground((value.toString().equals("1"))? Color.green : table.getBackground());
       // selbst implementierten !!
       // isSelected && hasFocus TODO
       return cell;
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    15,5 KB · Aufrufe: 24

student86

Mitglied
Vielen Dank, die super ausführliche Erklärung hat mir das ganze mal ein bisschen näher gebracht.

Musste im Aufruf ein Objekt einsetzen
Java:
        table = new JTable(new SimpleTableModel());
        System.out.println("renderer zuweisen");
        table.setDefaultRenderer(Object.class, new ColorTableCellRenderer());

Nun werden aber auch die Maße Höhe und Breite der Celle überschrieben und die Einstellungen aus dem SimpleTableModel gehen verloren(Anhang). Muss ich die nun alle per Hand wieder gerade biegen ?
 

Anhänge

  • Tabelle.JPG
    Tabelle.JPG
    34,3 KB · Aufrufe: 25

thet1983

Top Contributor
du kannst auch JLabel oder Buttons verwenden...
die Methode getTableCellRenderComponent besitzt übergabe parameter die du verwenden kannst
zb int column -> 0: erste col, 1: zweite etc...

da muss man sich ein bisschen spielen, bis es so passt wie man sich das vorstellt..
 

student86

Mitglied
Es geht voran :)

Mit einen JTextfield wird die Tabelle sehr langsam und stottert sehr beim scrollen. habe nun zum JLabel gewechselt.
Java:
 class ColorTableCellRenderer extends DefaultTableCellRenderer{
   
     @Override
        public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);
            System.out.println("Ausführung Renderer");
     // Mit einem JTextfield stottert die Tabelle      
            //JTextField cell = new JTextField();
            JLabel cell = new JLabel();
            //cell.setBounds(100, 100, 100, 100);
            cell.setText((value == null)? "NO VALUE" : value.toString());
    //        cell.setBackground((value.toString().equals("1"))? Color.green : table.getBackground());
            cell.setForeground(Color.RED);
     // Bleibt weiß
            cell.setBackground(Color.GREEN);
          
            table.setRowHeight( 22 );
          
            // selbst implementierten !!
            // isSelected && hasFocus TODO
             return cell;
          
        }

Ich habe jetzt ja mit dem ColorTableCellRenderer das damalige SimpleTableModel überschrieben!? Was hat das SimpleTableModel denn verwendet ? Auch ein JTextArea oder JLabels oder . ... ? Weil damals hat die Tabelle ohne Renderer nicht glaggt.
 

Anhänge

  • Tabelle.JPG
    Tabelle.JPG
    29,5 KB · Aufrufe: 35
Zuletzt bearbeitet:

Thallius

Top Contributor
Ich verstehe auch nicht was du da eigentlich machst. Ich dachte du willst nur die Hintergrundfarbe ändern je nachdem was in der Zelle steht. Warum machst du das dann nicht einfach.

Code:
if(column == DeinSpaltenIndex)
{
    if(value.equals("1")
        setBackground(Color.DeineFarbeFür1);
}
return this;

Das wars schon
 

X5-599

Top Contributor
Nicht ganz, oder? Ist es bei diesen Renderen nicht so, dass man immer dafür zu sorgen hat, dass ein "definierter" Zustand des Labels besteht? Also wenn man, wie hier, den background ändert gilt dieser dann für alle Zellen, die gerendert werden. Hier: ab dem Zeitpunkt wo ein value von "1" auftritt werden nur noch "DeineFarbeFür1" farbene Zellen gerendert.
 

Thallius

Top Contributor
Nicht ganz, oder? Ist es bei diesen Renderen nicht so, dass man immer dafür zu sorgen hat, dass ein "definierter" Zustand des Labels besteht? Also wenn man, wie hier, den background ändert gilt dieser dann für alle Zellen, die gerendert werden. Hier: ab dem Zeitpunkt wo ein value von "1" auftritt werden nur noch "DeineFarbeFür1" farbene Zellen gerendert.

Und warum frage ich wohl davor die Spalte ab?
 

X5-599

Top Contributor
Meiner Erfahrung nach wird das doch aber nichts nützen. Sobald das setBackgorund einmal gesetzt wurde hat das Label diesen Hintergrund. Alle Zellen, für die dieser Renderer zuständig ist werden dann mit dieser Farbe gerendert.
 

student86

Mitglied
Ich verstehe auch nicht was du da eigentlich machst. Ich dachte du willst nur die Hintergrundfarbe ändern je nachdem was in der Zelle steht. Warum machst du das dann nicht einfach.

Code (Text):

if(column == DeinSpaltenIndex)
{
if(value.equals("1")
setBackground(Color.DeineFarbeFür1);
}
return this;

Das wars schon

Das Funktioniert ja auch , alle Zeilen die eine 1 Beinhalten werden grün. Siehe Angehängtes Bild.

Nur ist die Tabelle nun unbrauchbar, weil sie sehr stark laggt,

Java:
 class ColorTableCellRenderer extends DefaultTableCellRenderer{
    
     @Override
        public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);
            System.out.println("Ausführung Renderer");
     // Mit einem JTextfield stottert die Tabelle       
            JTextField cell = new JTextField();
           // JLabel cell = new JLabel();

            cell.setText(value.toString());
            if (value.toString().equals("1")){
                cell.setBackground(Color.green);
            }
            table.setRowHeight( 22 );
           
            // selbst implementierten !!
            // isSelected && hasFocus TODO
             return cell;   
        }
    }
 

Anhänge

  • Tabelle.JPG
    Tabelle.JPG
    20,2 KB · Aufrufe: 35

truesoul

Top Contributor
Meiner Erfahrung nach wird das doch aber nichts nützen. Sobald das setBackgorund einmal gesetzt wurde hat das Label diesen Hintergrund. Alle Zellen, für die dieser Renderer zuständig ist werden dann mit dieser Farbe gerendert.

Jein, also der Hintergrund lässt sich weiterhin verändern und die Variante von @Thallius ist schon korrekt bzw funktioniert auch. Wird auch offiziell so gemacht siehe link von vorhin.

Java:
table.setDefaultRenderer(String.class, new ColorRenderer());

public class ColorRenderer extends JLabel implements TableCellRenderer {
    public ColorRenderer() {
        setOpaque(true);
    }

    public Component getTableCellRendererComponent(JTable table, Object object, boolean isSelected, boolean hasFocus,
            int row, int column) {

        int selectedColumn = table.getSelectedColumn();
        int selectedRow = table.getSelectedRow();

        setBackground(Color.WHITE);

        if (isSelected) {
            if (selectedRow == row && column == selectedColumn)
                setBackground(Color.RED);
        }

        setText(String.valueOf(object));
        return this;
    }
}

Grüße
 

student86

Mitglied
Das Laggen lag am JTextfield. Ohne die erstellte "cell" und nur mit
Java:
            if (value.toString().equals("1")){
                 setBackground(Color.green);
             }
läuft es flüssig
 

student86

Mitglied
Etapenziel erreicht. Vielen Dank! eine Einzelne Zelle in einer bestimmten Spalte ist nun grün wenn der Inhalt true ist.

Java:
 class ColorTableCellRenderer extends DefaultTableCellRenderer{
    
     @Override
        public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);
           
            if (value.toString().equals("true")){
                if(column==73){
                    setBackground(Color.green);
                }
            }
            else if((row%2)==0){
                setBackground(Color.white);
            }
            else{
                setBackground(Color.lightGray);
            }           
            table.setRowHeight( 22 );
             return this;   
        }

nächstes Ziel -> Die ganze Zeile einfärben
 

student86

Mitglied
Ganze Zeile Farbig klappt so:

Java:
 class ColorTableCellRenderer extends DefaultTableCellRenderer{
    
     @Override
        public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);

            if (table.getValueAt(row, 73).toString().equals("true")){
                setBackground(Color.red);
            }
            else if((row%2)==0){
                setBackground(Color.white);
            }
            else{
               
                setBackground(Color.lightGray);
            }           
            table.setRowHeight( 22 );
             return this;   
        }
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2
Y JTable AWT, Swing, JavaFX & SWT 6
D Swing JCombobox in einem JTable vorbelegen AWT, Swing, JavaFX & SWT 4
R Swing JTable : Header der Spalten ergänzen mit caption (wie bei html-table) AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben