更改JTable中行的背景颜色

use*_*ser 20 java jtable tablecellrenderer

我有一个有3列的JTable.我已经设置了TableCellRenderer所有3列这样的(可能不是很有效?).

 for (int i = 0; i < 3; i++) {
     myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
 }
Run Code Online (Sandbox Code Playgroud)

getTableCellRendererComponent()返回一个随机的背景颜色为每行一个组件.
在程序运行时如何将背景更改为其他随机颜色?

Oli*_*eux 25

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;
    }
});
Run Code Online (Sandbox Code Playgroud)


Ric*_*arn 21

一种方法是存储模型中每行的当前颜色.这是一个固定在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意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;
    }
}
Run Code Online (Sandbox Code Playgroud)

更改行的颜色将如下所示:

model.setRowColour(1, Color.YELLOW);
Run Code Online (Sandbox Code Playgroud)


cam*_*ckr 15

这里给出的其他答案很有效,因为您在每列中使用相同的渲染器.

但是,我倾向于认为通常在使用JTable时,每个列中将包含不同类型的数据,因此您不会为每列使用相同的渲染器.在这些情况下,您可能会发现表行渲染方法很有帮助.