在JTable中更改行的背景颜色
-
28-09-2019 - |
题
我有一个带有3列的JTable。我已经设置了 TableCellRenderer
对于所有这样的3列(也许不是很有效?)。
for (int i = 0; i < 3; i++) {
myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
}
这 getTableCellRendererComponent()
返回每行带有随机背景颜色的组件。
程序运行时,如何将背景更改为其他随机颜色?
解决方案
一种方法是在模型中存储每行的当前颜色。这是一个简单的模型,该模型固定在3列和3行中:
static class MyTableModel extends DefaultTableModel {
List<Color> rowColours = Arrays.asList(
Color.RED,
Color.GREEN,
Color.CYAN
);
public void setRowColour(int row, Color c) {
rowColours.set(row, c);
fireTableRowsUpdated(row, row);
}
public Color getRowColour(int row) {
return rowColours.get(row);
}
@Override
public int getRowCount() {
return 3;
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public Object getValueAt(int row, int column) {
return String.format("%d %d", row, column);
}
}
注意 setRowColour
呼叫 fireTableRowsUpdated
;这将导致表的那一行更新。
渲染器可以从表中获取模型:
static class MyTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
MyTableModel model = (MyTableModel) table.getModel();
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(model.getRowColour(row));
return c;
}
}
更改行的颜色将很简单:
model.setRowColour(1, Color.YELLOW);
其他提示
理查德·费恩(Richard Fearn)的答案的简历,使每一行灰色:
jTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
return c;
}
});
此处给出的其他答案效果很好,因为您在每一列中使用相同的渲染器。
但是,我倾向于相信通常,当使用JTable时,您将在每个Columm中都有不同类型的数据,因此您不会为每列使用相同的渲染器。在这些情况下,您可能会发现 表行渲染 方法有帮助。
这基本上就像重新粉刷桌子一样简单。但是,我还没有找到一种选择性重新粉刷一个行/列/单元的方法。
在此示例中,单击按钮更改行的背景颜色,然后调用重新涂抹。
public class TableTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Color[] rowColors = new Color[] {
randomColor(), randomColor(), randomColor()
};
final JTable table = new JTable(3, 3);
table.setDefaultRenderer(Object.class, new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JPanel pane = new JPanel();
pane.setBackground(rowColors[row]);
return pane;
}
});
frame.setLayout(new BorderLayout());
JButton btn = new JButton("Change row2's color");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
rowColors[1] = randomColor();
table.repaint();
}
});
frame.add(table, BorderLayout.NORTH);
frame.add(btn, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
private static Color randomColor() {
Random rnd = new Random();
return new Color(rnd.nextInt(256),
rnd.nextInt(256), rnd.nextInt(256));
}
}
打电话 getTableCellRendererComponent(...)
包括寻求渲染器的单元格的值。
您可以使用该值来计算颜色。如果您还使用AbstractTableModel,则可以为渲染器提供任意类型的值。
一旦有颜色,您就可以 setBackground()
在您要返回的组件上。
不隶属于 StackOverflow