Habe 2 TableCellRenderer kann aber immer nur einen aktivieren

Madebuvie

Mitglied
Hallo zusammen,
vielleicht kann mir jemand helfen. Ich habe eine Tabelle und dafür 2 TableCellRender (Einer soll aufgrund von Zelleninhalten entsprechende Zellen farbig darstellen. Der andere soll, wenn der Text in der Spalte zu groß wird einen Zeilenumbruch hervorrufen.
Leider kann ich aber immer nur einen CellRenderer aktivieren. Wenn ich die RowHeightRenderer aktviert habe und rufe dann den ColorRenderer auf, dann wird der RowHeightRenderer überschrieben.
Die Zelle wird zwar farbig dargestellt aber ich habe dann keinen Zeilenumbruch mehr.

Nachfolgend die entsprechenden Codezeilen

RowHeightCellRenderer

Java:
package renderer;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;

import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.BadLocationException;

public class RowHeightCellRenderer extends JTextArea implements
        TableCellRenderer {

    private static final long serialVersionUID = 1L;

    public RowHeightCellRenderer() {
        setLineWrap(true);
        setWrapStyleWord(true);

    }

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        this.setText((String) value);

        if (isSelected) {
            this.setBackground(table.getSelectionBackground());
            this.setForeground(table.getSelectionForeground());

        } else {
            this.setBackground(table.getBackground());
            this.setForeground(table.getForeground());
        }

        final int columnWidth = table.getColumnModel().getColumn(column)
                .getWidth();
        final int rowHeight = table.getRowHeight(row);
        this.setSize(columnWidth, rowHeight);

        this.validate();
        return this;
    }// getTableCellRendererComponent

    @Override
    public Dimension getPreferredSize() {
        try {
            final Rectangle rectangle = this.modelToView(getDocument()
                    .getLength());
            if (rectangle != null) {
                return new Dimension(this.getWidth(), this.getInsets().top
                        + rectangle.y + rectangle.height
                        + this.getInsets().bottom);
            }
        } catch (BadLocationException e) {
            e.printStackTrace(); // TODO: implement catch
        }

        return super.getPreferredSize();
    }
}// RowHeightCellRenderer

ColorColumnRenderer

Java:
package renderer;

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class ColorColumnRenderer extends DefaultTableCellRenderer {
    Color bkgndColor;
    Color fgndColor;

    public ColorColumnRenderer(Color bkgndColor, Color fgndColor) {
        super();
        this.bkgndColor = bkgndColor;
        this.fgndColor = fgndColor;
    }

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

        Component cell = super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);

        cell.setBackground(bkgndColor);
        cell.setForeground(fgndColor);

        if (isSelected) {
            cell.setBackground(fgndColor);
            cell.setForeground(bkgndColor);
        } else {
            if (table.getValueAt(row, 7).equals("WIN ")) {
                if (column > 0) {
                    cell.setBackground(Color.GREEN);
                    cell.setForeground(Color.BLACK);
                }
            }

        }
        return cell;
    }

    public Color getBkgndColor() {
        return bkgndColor;
    }

    public void setBkgndColor(Color bkgndColor) {
        this.bkgndColor = bkgndColor;
    }

    public Color getFgndColor() {
        return fgndColor;
    }

    public void setFgndColor(Color fgndColor) {
        this.fgndColor = fgndColor;
    }

}

Aufruf

Java:
        RowHeightCellRenderer dynRow = new RowHeightCellRenderer();
        this.table.getColumnModel().getColumn(1).setCellRenderer(dynRow);
        this.table.getColumnModel().getColumn(2).setCellRenderer(dynRow);
        this.table.getColumnModel().getColumn(3).setCellRenderer(dynRow);
        
        this.table.getModel().addTableModelListener(this);
        ColorColumnRenderer colRow = new ColorColumnRenderer(Color.lightGray, Color.blue);
        this.table.getColumnModel().getColumn(0).setCellRenderer(colRow);
        this.table.getColumnModel().getColumn(1).setCellRenderer(colRow);
        
        
        this.table.getColumnModel().addColumnModelListener(new TableColumnModelListener() {
            boolean columnHeightWillBeCalculated = false;

            @Override
            public void columnAdded(TableColumnModelEvent e) {
            }

            @Override
            public void columnRemoved(TableColumnModelEvent e) {
            }

            @Override
            public void columnMoved(TableColumnModelEvent e) {
            }

            @Override
            public void columnMarginChanged(ChangeEvent e) {
                if (!columnHeightWillBeCalculated && table.getTableHeader().getResizingColumn() != null) {
                    columnHeightWillBeCalculated = true;
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            // textTable.getTableHeader().getResizingColumn() is != null as long as the user still is holding the mouse down
                            // To avoid going over all data every few milliseconds wait for user to release
                            if (table.getTableHeader().getResizingColumn() != null) {
                                SwingUtilities.invokeLater(this);
                            } else {
                                tableChanged(null);
                                columnHeightWillBeCalculated = false;
                            }
                        }
                    });
                }
            }

            @Override
            public void columnSelectionChanged(ListSelectionEvent e) {
            }
        });

Was mache ich falsch. Über eine Antwort würde ich mich freuen.
 

Sempervivum

Erfahrenes Mitglied
Bin nicht so der Java-Experte, aber weil dir sonst niemand antwortet, versuche ich es Mal: Vermutlich heißt es nicht umsonst setCellRenderer und nicht addCellRenderer: Du kannst nur einen zuweisen; weist Du einen weiteren zu, wird dieser nicht hinzu gefügt, sondern überschreibt den vorigen.
 

Madebuvie

Mitglied
Hallo Sermpervivum,
vielen Dank für Deine Antwort. Hatte ich auch schon vermutet. Leider habe ich dazu nichts gefunden.
So etwas wie addCellRenderer wird auch dort nicht angeboten.

Viele Grüsse
MaDeBuVie
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
Du hast ja den Konstruktor, hier für den ColorRenderer:
Code:
    public ColorColumnRenderer(Color bkgndColor, Color fgndColor) {
        super();
        this.bkgndColor = bkgndColor;
        this.fgndColor = fgndColor;
    }
Diesem und der Klasse einen allgemeineren Namen geben und zusätzliche Parameter hinzu fügen:
Code:
    public CustomColumnRenderer(boolean renderHeight, boolean renderColor, Color bkgndColor, Color fgndColor) {
        super();
        this.bkgndColor = bkgndColor;
        this.fgndColor = fgndColor;
        // weitere Parameter übernehmen
    }
Diese zusätzlichen Parameter übernehmen und im weiteren Verlauf abfragen, d. h. den Code nur ausführen, wenn der betr. boolean auf true steht.
 

Madebuvie

Mitglied
Ich glaube ich hab's,
Java:
package renderer;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;

import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.BadLocationException;

public class UserTableCellRenderer  extends JTextArea implements TableCellRenderer {

    private static final long serialVersionUID = 1L;
    Color bkgndColor;
    Color fgndColor;


    public UserTableCellRenderer() {
        setLineWrap(true);
        setWrapStyleWord(true);
        this.bkgndColor = bkgndColor;
        this.fgndColor = fgndColor;


    }

    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        this.setText((String) value);
    
        
        final int columnWidth = table.getColumnModel().getColumn(column).getWidth();
        final int rowHeight = table.getRowHeight(row);
        this.setSize(columnWidth, rowHeight);
        this.validate();

        //Color Begin
        
        this.setBackground(bkgndColor);
        this.setForeground(fgndColor);

        if (isSelected) {
            this.setBackground(fgndColor);
            this.setForeground(bkgndColor);
        } else {
            if (table.getValueAt(row, 7).equals("WIN ")) {
                if (column > 0) {
                    this.setBackground(Color.GREEN);
                    this.setForeground(Color.BLACK);
                }
            }

        }
        //Color End
        
        
        return this;
    }   
    
    @Override
    public Dimension getPreferredSize() {
        try {
            final Rectangle rectangle = this.modelToView(getDocument()
                    .getLength());
            if (rectangle != null) {
                return new Dimension(this.getWidth(), this.getInsets().top
                        + rectangle.y + rectangle.height
                        + this.getInsets().bottom);
            }
        } catch (BadLocationException e) {
            e.printStackTrace(); // TODO: implement catch
        }

        return super.getPreferredSize();
    }

}

Vielen Dank für Deine Hilfe. Manchmal ist die Lösung so einfach und man sieht sie nicht.

Viele Grüsse
MaDeBuVie
 

Neue Beiträge