我们正在使用 JTable
,它显示数据和状态(New
、Processed
、Closed
)。每个状态行都有不同的颜色,这是通过重载 JTable
的 prepareRenderer()
实现的。
现在我们需要对该表进行排序,我们正在使用 table.setAutoCreateRowSorter(true);
来实现它。行得到正确排序,但行的颜色保持不变。在此操作后,我们需要根据状态列将颜色重新应用到所有行。
我想知道实现该目标的最佳方法是什么。我能想到的有几种方法:
- 重新绘制/重新验证表格。但我认为仅仅这样做是行不通的。
- 捕获
mouseClicked
事件并确定是否单击了列标题然后手动调用prepareRenderer()
然后调用 repaint/revalidate - 然后我阅读了这里的一个问题,其中提到的一个答案是不直接调用 repaint/revalidate,而是更改底层数据模型,它会自动调用上述方法。
我不知道该怎么办。谁能提供有关实现此目标的正确方法的见解?
最佳答案
要使用 setAutoCreateRowSorter(true)
更改 JTable
中的单元格颜色,我在我的方法中使用了方法 table.getRowSorter().convertRowIndexToModel(row) TableCellRenderer
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());
关于java - 对行进行排序后更改 Swing JTable 中的行颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7785166/