JTable用模型而不是行保持颜色

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

我有两难选择。我正在编写一个程序,该程序将查看来自应用程序的日志,并根据日志级别(例如信息,调试,错误等)将行突出显示为某种颜色。我还为用户提供了隐藏日志级别的功能。因此,如果单击“显示信息”,则所有“信息”的日志条目都将被隐藏。问题来了,当隐藏条目时,突出显示的颜色将被下推到它们下面的行。

我正在寻找一种颜色与条目保持一致的方式,并且当对象被隐藏时不在下一个单元格中呈现颜色

这是我到目前为止所做的:

我初始化渲染器并将其设置为默认值:

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;
  }
}

这是没有过滤器的结果。所有行均正确突出显示With No Filters

但是当我单击“显示跟踪”时,我们现在可以看到第一行在仍应为绿色的情况下以灰色突出显示

With Filter applied

两个组件(突出显示和隐藏)都按预期独立工作,但是将它们耦合在一起一直是一个挑战。任何帮助都会很棒。

java swing jtable
1个回答
2
投票

JTables的老问题...视图索引不是模型索引。不要使用视图索引在模型中查找,反之亦然。

查找JTable.convertRowIndexToViewJTable.convertRowIndexToViewJTable.convertRowIndexToModelJTable.convertRowIndexToModel

在渲染器中接收的索引是视图索引。您正在使用收到的视图索引在模型中进行查找。在模型中查找之前,请先使用正确的“转换”方法转换为模型索引。

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