我用我的自定义JTable创建了一个简单的DefaultTableCellRenderer。它本身工作正常(最后一栏着色)。但是,一旦我选择了行或筛选器/取消筛选,行就会被着色,即使它根本不应该被着色。
我的渲染者:
public class StatusCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int col) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
table.convertRowIndexToModel(row), col);
DataTableModel model = (DataTableModel) table.getModel();
String data = model.getValueAt(table.convertRowIndexToModel(row), col).toString();
if (col == 3 && data.equalsIgnoreCase("successful") && !data.isEmpty()) {
c.setBackground(Color.GREEN);
}
if (col == 3 && !data.equalsIgnoreCase("successful") && !data.isEmpty()) {
c.setBackground(new Color(255, 51, 51));
}
return c;
}
}它最初的样子(以及它应该是什么样子):

并在选择2行(顶部和底部)之后:

正如你所看到的,有几行绿色,根本不应该被着色。更令人不安的是,我只选择了绿色块的上一行和下一行,这意味着它也会自动为中间的行着色。
如何停止这种行为,并且只对第一张图片中所示的行着色?
被接受的答案帮助我克服了这些问题,这是最后的代码:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int col) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
table.convertRowIndexToModel(row), table.convertColumnIndexToModel(col));
DataTableModel model = (DataTableModel) table.getModel();
String data = model.getValueAt(table.convertRowIndexToModel(row), table.convertColumnIndexToModel(col))
.toString();
if (!isSelected) {
if (col == 3 && data.equalsIgnoreCase("successful") && !data.isEmpty()) {
c.setBackground(Color.GREEN);
} else if (col == 3 && !data.equalsIgnoreCase("successful") && !data.isEmpty()) {
c.setBackground(new Color(255, 51, 51));
} else {
c.setBackground(Color.WHITE);
}
} else {
c.setBackground(c.getBackground());
}
return c;
}如果选择了单元格,则颜色为蓝色,如果没有,则根据值将白色、绿色或红色着色。
发布于 2018-06-08 08:55:51
由于渲染器组件将被重复使用,因此当条件不匹配时,请考虑设置默认颜色:
if (col == 3 && data.equalsIgnoreCase("successful") && !data.isEmpty()) {
c.setBackground(Color.GREEN);
}
else if (col == 3 && !data.equalsIgnoreCase("successful") && !data.isEmpty()) {
c.setBackground(new Color(255, 51, 51));
}
else {
c.setBackground(Color.GRAY.brighter());
}https://stackoverflow.com/questions/50756543
复制相似问题