【问题标题】:Changing the color of a JTable cell DYNAMICALLY动态更改 JTable 单元格的颜色
【发布时间】:2020-08-25 11:17:52
【问题描述】:

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

编辑: 使用代码 sn-ps here

更新问题

【问题讨论】:

  • 使用table cell renderer(动态)。
  • 如果您提供的minimal reproducible example 不会改变单元格颜色,那么@AndrewThompson 可以用更正的示例来回答。
  • 您永远不会直接调用 TableCellRenderer。您更新 TableModel 中的数据,模型会告诉表格重新绘制自己。

标签: java swing jtable cell


【解决方案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);
    }
}

【讨论】:

  • 好的,非常感谢。我刚刚假设只有在视口中有用户定义的更改时才会调用单元格渲染器。抱歉这个愚蠢的问题。
  • 很高兴能帮上忙。
  • 嘿,我刚刚尝试使用我的自定义单元格渲染器,并且我有一个数组,当用户单击按钮时会更改值。因此,我希望在发生这种情况时将一些更改反映在我的表格中,但是它有时会发生,有时它只会在我单击表格时反映。有什么建议吗?
  • 请发布一个新问题,并在我的回答中包含minimal reproducible example。另见What should I do when someone answers my question?
  • 我也这样做了。这是帖子的链接link
猜你喜欢
  • 2011-08-06
  • 2011-11-03
  • 2011-08-14
  • 2014-08-24
  • 2018-08-20
  • 2011-09-24
  • 2013-02-23
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多