Change the background color of a row in a JTable

前端 未结 5 1181
我寻月下人不归
我寻月下人不归 2020-11-30 10:09

I have a JTable with 3 columns. I\'ve set the TableCellRenderer for all the 3 columns like this (maybe not very effective?).

 for (int i = 0; i          


        
5条回答
  •  暖寄归人
    2020-11-30 10:24

    One way would be store the current colour for each row within the model. Here's a simple model that is fixed at 3 columns and 3 rows:

    static class MyTableModel extends DefaultTableModel {
    
        List 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);
        }
    }
    

    Note that setRowColour calls fireTableRowsUpdated; this will cause just that row of the table to be updated.

    The renderer can get the model from the table:

    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;
        }
    }
    

    Changing a row's colour would be as simple as:

    model.setRowColour(1, Color.YELLOW);
    

提交回复
热议问题