如何更改具有特定列值的 JTable 整行的颜色

Posted

技术标签:

【中文标题】如何更改具有特定列值的 JTable 整行的颜色【英文标题】:How to change the color of a JTable entire row having a particular column value 【发布时间】:2013-03-14 12:28:01 【问题描述】:

我有一个从值数组填充的 Jtable。 我的代码是这样的:

  private static final String[] columnNames = "Line Number", "Error","Fix Proposed","Percentage (%)";
  static DefaultTableModel model = new DefaultTableModel(null,columnNames);

  public static void DisplayMyJList(List<CaptureErrors> x,String extension,
        ArrayList<Integer> l,ArrayList<Integer> p,
        ArrayList<String> e,ArrayList<String> s) throws IOException //Method to Dynamic get values to be populated in Jtable.

    String theExtension = extension;
    if(FILE_EXTENSION.equals("java")) 
        for(CaptureErrors ex: x) 

            Vector row = new Vector();
            row.add(ex.getLinenumber());
            row.add(ex.getMyfounderror());
            row.add(ex.getMycorrection());
            row.add(ex.getMyPercentage()+"%");

            model.addRow( row );

            //model.setRowColour(1, Color.YELLOW);
        
    

table = new JTable(model);
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);    
    table.setFillsViewportHeight(true);
    table.setShowGrid(true);
    table.setShowVerticalLines(true);
    table.setGridColor(new Color(0,128,0));
    JTableHeader header = table.getTableHeader();
    table.setBackground(new Color(255,228,225));
    table.setEnabled(true);
    header.setFont(new Font("Dialog", Font.CENTER_BASELINE, 12));
    header.setBackground(Color.black);
    header.setForeground(Color.yellow);
    JScrollPane pane4 = new JScrollPane(table); 

我可以使用 JButton 从值数组中填充 Jtable。 我想要一个条件,如果列“百分比”,获取该列中的所有值 >30,它会将行突出显示为 color.red。

我不想使用 TableCellRendererComponent 。我希望在单击 Jbutton 时执行此操作。

实际的 Jtable 如下所示:

然后根据我想要得到的,前2行应该用红色突出显示。任何帮助表示赞赏。

【问题讨论】:

您的表将所有数据视为字符串。您确实应该重写 getColumnClass() 方法以返回正确的类,以便可以正确格式化每一列。 【参考方案1】:

请参阅Table Row Rendering 中的方法以获取无需创建自定义渲染器的解决方案。

您可能还想查看Table Format Renderers,以便轻松设置百分比列的格式。

【讨论】:

【参考方案2】:

您可以创建自定义单元格渲染器。在其实现中,检查给定行的百分比值是否 > 30,然后突出显示该单元格。

例如:

class SomeRenderer extends DefaultTableCellRenderer 
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) 

        Component c = super.getTableCellRendererComponent(table,
                value, isSelected, hasFocus, row, column);

        if (isHighlightingEnabled)
            Integer percentage = (Integer) table.getValueAt(row, 3);
            if (percentage > 30)
                c.setBackground(Color.RED);
        
        return c;
    

如果需要,您可以在操作时启用/禁用此呈现逻辑。

请参阅Using Custom Renderers 了解更多详情。

【讨论】:

【参考方案3】:

渲染 API 的一个问题是很难提供复合渲染器。有很多方法可以做,不要误会我的意思,但如果能内置它会很好...[end rant]...

基本思想是您要设置一系列从基础渲染器扩展而来的渲染器,其中包含确定在所需条件下应该做什么所需的逻辑。

public class FilterRenderer extends DefaultTableCellRenderer 
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
        Double percent = (Double) table.getValueAt(row, 3);
        // You'll need some way to supply the filter value, may via a centralised 
        // manager of some kind.
        if (percent > 0.3 && !isSelected) 
            setOpaque(true);
            setBackground(Color.RED);
         else 
            setOpaque(false);
        
        return this;
    


public class OtherCellRenderer extends FilterRenderer 
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
        // Apply any special renderer requirements, like translating an object value to String
        return this;
    

您需要为每一列(在您的示例中为 4)提供一个自定义渲染器,并将每个渲染器应用于表格列

TableColumnModel model = table.getColumnModel();
model.getColumn(0).setCellRenderer(new LineNumberRenderer());
model.getColumn(1).setCellRenderer(new ErrorRenederer());
model.getColumn(2).setCellRenderer(new FixProposedRenderer());
model.getColumn(3).setCellRenderer(new Percentage());

或者您也可以使用 SwingLabs JXTable,它内置了对行高亮显示的支持

【讨论】:

以上是关于如何更改具有特定列值的 JTable 整行的颜色的主要内容,如果未能解决你的问题,请参考以下文章

根据列值更改 JTable 行的背景颜色

基于列值的 Spotfire 行颜色

更改从jar文件中获取的jtable中特定行的颜色

从具有特定值的表中获取列名

背景排序JTable后,特定值的颜色不会改变

根据 JTable 中的第一列值着色特定行?