gpt4 book ai didi

java - JTable 保持模型的颜色而不是行的颜色

转载 作者:行者123 更新时间:2023-12-02 01:13:37 25 4
gpt4 key购买 nike

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

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

这是我迄今为止所做的:

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

tableRenderer = new ModelTableRenderer();
table.setDefaultRenderer(Object.class, tableRenderer);

然后我创建我的排序器:

sorter = new TableRowSorter<DefaultTableModel>(model);
table.setRowSorter(sorter);

我有一个每个复选框都使用的回调方法,称为 showSelected。这需要显示 LogLevel 列表并将过滤器应用于排序器:

  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

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

最佳答案

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

查找JTable.convertRowIndexToView , JTable.convertRowIndexToModel , JTable.convertColumnIndexToViewJTable.convertColumnIndexToModel

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

关于java - JTable 保持模型的颜色而不是行的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58997049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com