2

我有一个包含 3 列的 JTable。1. 图标,2. 文件或文件夹的名称,3. 文件类型或“文件夹”。我在方法中使用 JLabel(我设置背景 + png 图像)绘制图标getTableCellRendererComponent。最初,我绘制了 JLable 的“白色”或“灰色”交替背景,因为这些是JTableSwing 组件交替绘制表格的颜色。现在,当我选择一行时,图标(第一列)背景不会被重绘为与行的其余部分相同的“深蓝色”。说明性屏幕截图

以下是我的问题:

一般 1)如何在突出显示行时突出显示图标单元格(指针就足够了,不需要代码)?

具体的

1.1) 我必须使用 JLabel 吗?为什么我不能只是例如.SetValueAt("image.png",0,0)

1.2)我尝试了,getColumnClass(...)但这似乎重绘了给定列中的所有单元格。这是预期的吗?

谢谢。

4

2 回答 2

4

1.)调用时javax.swing.table.TableCellRenderer获取参数。您可以通过继承(例如)和覆盖isSelected来轻松编写自己的:调整对象并返回。拥有自己的渲染器还可以让您设置断点并真正了解正在发生的事情。TableCellRendererJLabelgetTableCellRendererComponentthis

1.1 + 1.2。)两者setValueAt都是getColumnClass模型的一部分,并且可能无法解决所选背景的问题。

您不必使用JLabel: 如果您查看返回类型,getTableCellRendererComponent您会发现它是Component(甚至不是JComponent)。我猜JLabel这只是习惯性的,因为它通常具有渲染器所需的所有功能,并且DefaultTableCellRenderer还可以使用JLabel. 为了获得最大的自由,我建议您使用JComponent和编写自己的paintComponent,但在这种情况下,您可能不必这样做。

于 2012-09-02T06:16:23.660 回答
3

假设条纹(交替的白色/灰色背景)在您的 LAF(Nimbus?)中自动发生,您不需要自定义渲染器:该表已经为 Icon 和 ImageIcon 类注册了默认渲染器。确保您的 tableModel 将其中一个类作为第一列的 columnClass 返回并享受自动操作:-)

这是一个快速的代码片段:

DefaultTableModel model = new DefaultTableModel(0, 2) {

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (columnIndex == 0) {
            return Icon.class;
        }
        return super.getColumnClass(columnIndex);
    }

};
File[] files = new File(".").listFiles();
FileSystemView fsv = FileSystemView.getFileSystemView();
for (File f : files) {
    model.addRow(new Object[] {fsv.getSystemIcon(f), fsv.getSystemDisplayName(f)});
}
JTable table = new JTable(model);
于 2012-09-02T08:01:40.077 回答