繁体   English   中英

对行进行排序后更改 Swing JTable 中的行颜色

[英]Change row color in Swing JTable after sorting rows

我们正在使用一个JTable ,它显示数据和状态( NewProcessedClosed )。 每个状态行都有不同的颜色,这是通过重载JTable prepareRenderer()实现的。

现在我们需要对该表进行排序,我们正在使用table.setAutoCreateRowSorter(true); 实现这一目标。 行得到正确排序,但行的颜色保持不变。 我们需要根据状态列将颜色重新应用于此操作后的所有行。

我想知道什么是实现这一目标的最佳方式。 我能想到的有几种方法:

  1. 重新绘制/重新验证表格。 但我认为仅仅这样做是行不通的。
  2. 捕获mouseClicked事件并确定是否单击了列标题然后手动调用prepareRenderer()然后调用 repaint/revalidate
  3. 然后我在这里阅读了其中一个问题,其中提到的答案之一不是直接调用 repaint/revalidate,而是更改底层数据模型,它会自动调用上述方法。

我不知道该怎么做。 任何人都可以请提供有关实现这一目标的正确方法的见解吗?

为了使用setAutoCreateRowSorter(true)更改JTable单元格颜色,我在TableCellRenderer使用了方法table.getRowSorter().convertRowIndexToModel(row)

import javax.swing.*;

import javax.swing.table.DefaultTableCellRenderer;

import javax.swing.table.TableModel;

import java.awt.*;

public class OwnTableCellRenderer extends DefaultTableCellRenderer {

    public OwnTableCellRenderer() {
        super();
        setOpaque(true);
    }

    public Component getTableCellRendererComponent(JTable table, 
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus, 
                                                   int row, 
                                                   int column) {

        setBackground(Color.white);
        setForeground(Color.black);

        TableModel model = table.getModel();
        int modelRow = table.getRowSorter().convertRowIndexToModel(row);
        int columnStatusPosition = 5;
        String statusColumnValue = (String) model.getValueAt(modelRow, columnStatusPosition);

        if (statusColumnValue.equals("ACTIVE")) {
            if (isSelected) {
                setBackground(Color.green);
            } else {
                setBackground(Color.yellow);
            }
        }

        setText(value != null ? value.toString() : "");
        return this;
    }
}

进而

table.setDefaultRenderer(Object.class, new OwnTableCellRenderer());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM