JTable中“突出显示”特定行


问题内容

每当单元格的内容与用户的输入匹配时,我都希望突出显示JTable中的特定行。以下代码是我到目前为止可以使用的代码:

JTable table = new JTable(model) {
    public Component prepareRenderer(
            TableCellRenderer renderer, int row,
            int column) {
        Component c = super.prepareRenderer(renderer,
                row, column);
        if (!isRowSelected(row) ) {
            c.setBackground((hashMapcontainer
                    .containsKey(row)) ? Color.GREEN
                    : getBackground());
        }
        return c;
    }
    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }
};

注意:hashMapcontainerhashmap在源文件中全局作用域。

现在,此操作在某种程度上可行,但是我将其添加JTableJTabbedPane内的JFrame。JTables是在程序运行时动态创建的。但是,该prepareRenderer方法会使所有已创建的JTables中的所有特定单元格突出显示。

如何在所有JTable中保留单元格以保留其特定的突出显示单元,而不是让所有JTable在每个JTable中具有完全相同的突出显示单元呢?

提前致谢!


问题答案:

渲染器是“橡皮图章”。基本上,这意味着它们会将先前的设置带到下一个单元格。

您需要做的是提供“默认”行为

if (!isRowSelected(row) ) {
    c.setBackground((hashMapcontainer
        .containsKey(row)) ? Color.GREEN
        : getBackground());
} else {

    // Define the default background color
    // Don't forget to take into the selection state

}

虽然我个人认为prepareRenderer在这种情况下可能是一个公平的解决方案,但您确实应该探索提供基线渲染器的可能性。这是一项很艰巨的工作,但具有可移植性(如果您更改表实现)的优点,并且允许其他人定义给定单元格的突出显示规则的机会,而您基本上已经将其覆盖并覆盖,
恕我直言。

我还建议您看一下JXTable,因为它具有内置突出显示功能