突出显示JTable中的单元格,其中包含一个Icon

时间:2012-09-02 06:09:41

标签: java swing icons jtable jlabel

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

以下是我的问题:

常规 1)突出显示一行时如何突出显示Icon单元格(指针就足够了,没有预期的代码)?

具体

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

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

感谢。

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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);