【问题标题】:Change row color in Swing JTable after sorting rows在对行进行排序后更改 Swing JTable 中的行颜色
【发布时间】:2011-10-16 15:11:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 听起来你在某处缺少一个 convertRowIndexToModel (假设状态在其他地方)
  • 这是一个很好的指针 kleopatra...我正在研究这个方向,这最终可能会导致解决方案。谢谢,我会在这里评论所有更新:)
  • 我阅读了有关 TableRowSorter 的文档。它说“JTable 的基于行的方法和 JTable 的选择模型指的是视图而不是底层模型。因此,有必要在两者之间进行转换。例如,要根据 myModel 获得选择,您需要转换索引”。它提供了一个利用 convertRowIndexToModel() 的代码。这意味着我的一般策略应该是将 MouseListener 与 JTableHeader 相关联,并在 mouseClicked() 时为每一行调用 convertRowIndexToModel,然后在表上调用 repaint()/revalidate()。这种方法正确吗???
  • 不,太复杂了——一切都应该自动处理。是时候展示一些代码了,不祥的 sscce :-)
  • 爱你珍妮特和我的老板!但是问题还是没有彻底解决!!!当我完全处理它时,我会发布详细的解决方案:)

标签: java swing jtable tablerowsorter


【解决方案1】:

为了用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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2014-11-07
    • 2013-05-28
    • 2011-04-21
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多