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

问题描述 投票:1回答:1

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

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

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

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

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

java swing jtable tablerowsorter
1个回答
8
投票

为了用JTable更改setAutoCreateRowSorter(true)中的单元格颜色,我在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());

© www.soinside.com 2019 - 2024. All rights reserved.