Reputation: 956
I want to color specific rows in jTable..i did it for columns by using this code,
private class CustomCellRenderer extends DefaultTableCellRenderer {
/* (non-Javadoc)
* @see
javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
*/
@Override
public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
Component rendererComp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, column);
//Set foreground color
// rendererComp.setForeground(Color.red);
//Set background color
rendererComp .setBackground(Color.pink);
return rendererComp ;
}
}
And i call the above code using,
jTable1.getColumnModel().getColumn(3).setCellRenderer(new CustomCellRenderer());
But i want to do the same for rows in jTable..There's no getColumnModel() or getColumn() in the case of rows..So what's the alternate way for doing that? I am doing it in Netbeans by using Java Swing..
Upvotes: 4
Views: 16290
Reputation: 205775
As you want to alter entire rows, irrespective of column class, consider overriding prepareRenderer()
, as discussed here. The TableCellRenderer
and prepareRenderer()
approaches are contrasted here.
Upvotes: 3
Reputation: 18819
This seems like a very dirty way of handling it. It'll be a much better idea if you use a gridLayout using the layoutManager for you containter (i think it must be a JFrame). U can add individual componets (JPanels, Jbuttons, or any other JComponent) and handle their look by using the paint()/repaint() methods.
EDIT
OR you can change the the getTableCellRendererComponent(....) method to set your custom background colors using nested if-else statements or switch-case according to the int rows ,int columns (that are provided as arguments).
This will be much easier
Upvotes: 0
Reputation: 47608
Here is an example on how you can combine both column colors and row color. You basically perform tests in the TableCellRenderer to see if the background should be of one color or another.
import java.awt.Color;
import java.awt.Component;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class TestTable {
public class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setBackground(null);
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setText(String.valueOf(value));
boolean interestingRow = row % 5 == 2;
boolean secondColumn = column == 1;
if (interestingRow && secondColumn) {
setBackground(Color.ORANGE);
} else if (interestingRow) {
setBackground(Color.YELLOW);
} else if (secondColumn) {
setBackground(Color.RED);
}
return this;
}
}
private JFrame f;
private JTable table;
protected void initUI() {
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
Vector<String> columNames = new Vector<String>();
columNames.add("Col 0");
columNames.add("Col 1");
columNames.add("Col 2");
for (int i = 0; i < 20; i++) {
Vector<Object> v = new Vector<Object>();
v.add(i % 3 == 0 ? "Hello" : "World");
v.add("Some data in row " + (i + 1));
v.add("Some other data in row " + (i + 1));
data.add(v);
}
table = new JTable(new DefaultTableModel(data, columNames));
Enumeration<TableColumn> en = table.getColumnModel().getColumns();
while (en.hasMoreElements()) {
TableColumn tc = en.nextElement();
tc.setCellRenderer(new MyTableCellRenderer());
}
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.add(new JScrollPane(table));
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTable().initUI();
}
});
}
}
Upvotes: 6