【问题标题】:How to set color of rows dynamically in jtable?如何在jtable中动态设置行的颜色?
【发布时间】:2014-07-23 03:37:56
【问题描述】:

看了很多文章,不明白怎么做!

我想更改JTable 中某些行的颜色。该表有 3 列: a、b 和 c。

规则

  1. 如果a的值
  2. 如果 a>=c 的值,则整行的颜色必须为黄色
  3. 默认情况下,行的颜色必须为蓝色。

【问题讨论】:

  • 单元格渲染由TableCellRenderer 控制,您可以在Concepts: Editors and RenderersUsing Custom Renderers 了解更多信息。如果你真的想要更简单的东西,你可以看看 SwingLabs 库中的 JXTable,它提供了行突出显示
  • 我明白这一点,但是当我尝试实现自定义渲染器时,有时整个表格会出现很多问题
  • “有时整个表格的颜色会出现很多问题” 1) 为了尽快获得更好的帮助,请发布MCVE(最小、完整、可验证的示例)。 2) 始终复制/粘贴错误或异常输出。
  • @user3684431 那么你不会在调用之间重置渲染状态

标签: java swing jtable


【解决方案1】:

试试下面的代码

public class IconifiedRenderer extends JLabel implements TableCellRenderer {
public IconifiedRenderer() {
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    JLabel label = this;
    int cellValueA=-1;
    int cellValueB=-1;
    int cellValueC=-1;
    try {
        setOpaque(true);
        label.setText(String.valueOf(value));
       try {
            cellValueA = Integer.parseInt(String.valueOf( table.getValueAt(row, 0))); //0th for A
        } catch (ArrayIndexOutOfBoundsException aa) {
            //ignore
            cellValueA=-1;
        }
       try {
            cellValueB = Integer.parseInt(String.valueOf( table.getValueAt(row, 1))); //1th for A
        } catch (ArrayIndexOutOfBoundsException aa) {
            //ignore
            cellValueB=-1;
        }
       try {
            cellValueC = Integer.parseInt(String.valueOf( table.getValueAt(row, 2))); //2th for A
        } catch (ArrayIndexOutOfBoundsException aa) {
            //ignore
            cellValueC=-1;
        }
       label.setBackground(Color.BLUE);

       if(cellValueA<=cellValueB){
           label.setBackground(Color.RED);
       }
       if(cellValueA>=cellValueC){
           label.setBackground(Color.YELLOW);
       }
    } catch (Exception ex) {
        // no need to handle
    }
    return label;
}

添加这个渲染类并在你的表格列上设置渲染

    jTable1.getColumnModel().getColumn(0).setCellRenderer(new IconifiedRenderer());
    jTable1.getColumnModel().getColumn(1).setCellRenderer(new IconifiedRenderer());
    jTable1.getColumnModel().getColumn(2).setCellRenderer(new IconifiedRenderer());

它会像这样显示你的表格...

【讨论】:

  • Tej Kiran 认为你认为你认为自己是最好的
  • 此方法仅适用于所有列中的所有数据均为字符串数据的情况。如果你有日期、数字、布尔值,那么你需要在多个不同的渲染器中重复代码。对于不需要多个渲染器的解决方案,请查看 David 在 cmets 部分提供的链接。
猜你喜欢
  • 2011-04-02
  • 2019-05-22
  • 2010-11-06
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多