有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java动态更改JTable单元格的颜色

我想知道如何在没有用户响应的情况下更改表中单元格的背景颜色。 例如,如果由于一些不相关的方法调用,我的一个变量发生了变化,我希望在我的表中反映出来。 例如,一个方法更改了我用来初始化表的数组的值,但是用户没有参与其中,比如说值的经过时间更改。那么,我如何在我的表中反映它,或者是否有任何方法可以手动调用TableCellRenderer

编辑: 用代码片段更新了问题here


共 (1) 个答案

  1. # 1 楼答案

    按照建议,使用自定义单元渲染器:

    import java.awt.Color;
    import java.awt.Component;
    import java.util.Random;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableModel;
    
    public class CellRenderDemo {
    
        private static final int MAX =120;
        private static Object[] columnName = {"Item", "Value"};
        private static Object[][] data = {{"Value A", 12}, {"Value B", 34},  {"Value C", 66}};
        private final JTable table;
    
        CellRenderDemo() {
            table = new JTable(data, columnName);
            table.getColumnModel().getColumn(1).setCellRenderer(new CustomRenderer());//use custom cell rendered for col 1
        }
    
        void randomizeData(){
            Random rnd = new Random();
            TableModel model = table.getModel();
            new Timer(1000, e->{
                model.setValueAt(rnd.nextInt(MAX+1), rnd.nextInt(model.getRowCount()), 1);
            }).start();
        }
    
        JTable getTable() {
            return table;
        }
    
        static class CustomRenderer extends DefaultTableCellRenderer {
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
                    int row, int column)   {
                Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    
                int cellValue = (int)value;
                if(cellValue <= MAX / 3){ //change color based on value 
                    cellComponent.setBackground(Color.PINK);
                } else if ( cellValue > 2*MAX / 3){
                    cellComponent.setBackground(Color.CYAN);
                } else {
                    cellComponent.setBackground(Color.YELLOW);
                }
                return cellComponent;
            }
        }
    
        public static void main(String[] args) {
            Runnable r = () -> {
                JFrame frame = new JFrame();
                CellRenderDemo cd = new CellRenderDemo();
                frame.add(new JScrollPane(cd.getTable()));
                frame.pack();
                cd.randomizeData();
                frame.setVisible(true);
            };
            SwingUtilities.invokeLater(r);
        }
    }
    

    enter image description here