java - 如何为 JTable 中的特定行着色

标签 java swing jtable renderer tablecellrenderer

我希望能够突出显示 JTable 的某些行,具体取决于行本身的值。例如,如果现有数量 <重新排序级别,则该行应在 JTable 中突出显示。

我知道有一个表方法 tblItems.setSelectionBackground(Color.yellow); 在选择行时有效,但是是否有类似的方法不依赖于所选行让它们以不同的颜色显示?

public class MyTableCellRenderer implements TableCellRenderer {  
    @Override  
    public Component getTableCellRendererComponent
(JTable table, Object value, 
boolean isSelected, boolean hasFocus, int row, int column) {

        Object ob=table.getValueAt(row, column);
        if(ob.toString().equals("yes")){
            //need to colour the entire row
        }
        return 
    }

}

最佳答案

你可以使用my answer改变单元格的颜色。可以使用相同的技术将其应用于行中的每个单元格。

这也是 prepareRenderer 的示例

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import java.awt.*;

public class TableWithPrepareRendererExample extends JFrame {
  ColorName colors[] = { new ColorName("Red"), new ColorName("Green"), new ColorName("Blue"),
    new ColorName("Black"), new ColorName("White") };

  public TableWithPrepareRendererExample() {
    super("Table With prepareRenderer Example");
    setSize(500, 300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    JTable table = new JTable(new AbstractTableModel() {
      ColorName data[] = { colors[0], colors[1], colors[2], colors[3], colors[4], colors[0],
        colors[1], colors[2], colors[3], colors[4] };


      public int getColumnCount() {
        return 3;
      }

      public int getRowCount() {
        return 10;
      }

      public Object getValueAt(int r, int c) {
        switch (c) {
          case 0:
            return (r + 1) + ".";
          case 1:
            return "Some pithy quote #" + r;
          case 2:
            return data[r];
        }
        return "Bad Column";
      }

      public Class getColumnClass(int c) {
        if (c == 2)
          return ColorName.class;
        return String.class;
      }

      public boolean isCellEditable(int r, int c) {
        return c == 2;
      }

      public void setValueAt(Object value, int r, int c) {
        data[r] = (ColorName) value;
      }

    }) {
      public Component prepareRenderer(TableCellRenderer renderer,
                                       int rowIndex, int vColIndex) {
        Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
        Object value = getValueAt(rowIndex, vColIndex);
        if (value.toString().equals("Red"))
          c.setBackground(Color.RED);
        else {
          if (rowIndex % 2 == 0 && !isCellSelected(rowIndex, vColIndex)) {
            c.setBackground(Color.YELLOW);
          } else {
            // If not shaded, match the table's background
            c.setBackground(getBackground());
          }
        }
        return c;
      }
    };

    JComboBox combo = new JComboBox(colors);
    table.setDefaultEditor(ColorName.class, new DefaultCellEditor(combo));
    table.setRowHeight(20);
    getContentPane().add(new JScrollPane(table));
  }

  public static void main(String args[]) {
    TableWithPrepareRendererExample ex = new TableWithPrepareRendererExample();
    ex.setVisible(true);
  }

  public class ColorName {
    String cname;

    public ColorName(String name) {
      cname = name;
    }

    public String toString() {
      return cname;
    }
  }

}

关于java - 如何为 JTable 中的特定行着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13098846/

相关文章:

java - 对 JFrame 的位置进行动画处理

java - 改变 JTable TableHeaders 背后的背景

java - 有没有办法使用Java将 "button"添加到Windows通知区域

java - 当工具提示出现在按钮上时,鼠标事件不起作用

java - 使用 JAR 从 FIRESTORE DB 删除文档失败

java - repaint() 不会在调用时重新绘制?

java - titledBorder 标题中的图标

java - 获取 JTable 以打印表格格式

java - 进度条 Java

java - 无法满足从 com.lmax.disruptor 3.2.0 到 package sun.misc 0.0.0 的依赖