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
ColorColumnRenderer
Aufruf
Was mache ich falsch. Über eine Antwort würde ich mich freuen.
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.