我有两难选择。我正在编写一个程序,该程序将查看来自应用程序的日志,并根据日志级别(例如信息,调试,错误等)将行突出显示为某种颜色。我还为用户提供了隐藏日志级别的功能。因此,如果单击“显示信息”,则所有“信息”的日志条目都将被隐藏。问题来了,当隐藏条目时,突出显示的颜色将被下推到它们下面的行。
我正在寻找一种颜色与条目保持一致的方式,并且当对象被隐藏时不在下一个单元格中呈现颜色
这是我到目前为止所做的:
我初始化渲染器并将其设置为默认值:
tableRenderer = new ModelTableRenderer();
table.setDefaultRenderer(Object.class, tableRenderer);
然后创建分类器:
sorter = new TableRowSorter<DefaultTableModel>(model);
table.setRowSorter(sorter);
并且我有一个回调方法,每个复选框都使用showSelected
。这将显示一个LogLevels列表,并将过滤器应用于排序器:
public void showSelected(List<LogLevel> showList) {
Set<LogLevel> hideSet = showList.stream().collect(Collectors.toSet());
sorter.setRowFilter(new RowFilter<DefaultTableModel, Object>(){
@Override
public boolean include(Entry<? extends DefaultTableModel, ? extends Object> entry) {
LogLevel level = (LogLevel) entry.getValue(LogModel.ERROR_COLUMN);
return hideSet.contains(level);
}
});
}
ModelTableRenderer类
此类是我用来渲染行颜色的类。它查看当前行,并获取LogLevel
所在的列值,具体取决于日志级别。当行未隐藏时,此方法工作正常。
public class ModelTableRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 425091150909034479L;
public ModelTableRenderer() { }
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (!c.isVisible()) return c;
Color color = Color.WHITE;
LogLevel level = (LogLevel) table.getModel().getValueAt(row, LogModel.ERROR_COLUMN);
switch (level) {
case DEBUG:
color = Color.GREEN;
break;
case ERROR:
color = Color.ORANGE;
break;
case FATAL:
color = Color.RED;
break;
case INFO:
color = Color.WHITE;
break;
case TRACE:
color = Color.GRAY;
break;
case WARN:
color = Color.YELLOW;
break;
default:
break;
}
if ((Boolean)table.getModel().getValueAt(row, LogModel.SUPPRESS_COLUMN)) {
color = Color.BLACK;
}
c.setBackground(color);
c.setForeground(Color.BLACK);
table.repaint();
return c;
}
}
但是当我单击“显示跟踪”时,我们现在可以看到第一行在仍应为绿色的情况下以灰色突出显示
两个组件(突出显示和隐藏)都按预期独立工作,但是将它们耦合在一起一直是一个挑战。任何帮助都会很棒。
JTables的老问题...视图索引不是模型索引。不要使用视图索引在模型中查找,反之亦然。
查找JTable.convertRowIndexToView
,JTable.convertRowIndexToView
,JTable.convertRowIndexToModel
和JTable.convertRowIndexToModel
。
在渲染器中接收的索引是视图索引。您正在使用收到的视图索引在模型中进行查找。在模型中查找之前,请先使用正确的“转换”方法转换为模型索引。