我有一个有3列的JTable。 1.图标,2。文件或文件夹的名称,3。文件类型或“文件夹”。我在getTableCellRendererComponent
方法中使用JLabel(我设置背景+ png图像)绘制Icon。最初,我绘制JLable的交替背景“白色”或“灰色”,因为这些是JTable
Swing组件交替绘制表格的颜色。现在,当我选择一行时,Icon(第一列)背景不会重新绘制为“深蓝色”,与行的其余部分相同。
以下是我的问题:
常规 1)突出显示一行时如何突出显示Icon单元格(指针就足够了,没有预期的代码)?
具体
1.1)我必须使用JLabel吗?为什么我不能,例如.SetValueAt("image.png",0,0)
1.2)我尝试了getColumnClass(...)
,但这似乎重绘了给定列中的所有单元格。这是预期的吗?
感谢。
答案 0 :(得分:4)
1。)javax.swing.table.TableCellRenderer
在调用时获得isSelected
参数。您可以通过继承TableCellRenderer
(例如)并覆盖JLabel
轻松编写自己的getTableCellRendererComponent
:调整对象并返回this
。拥有自己的渲染器还允许您设置断点并真正了解正在发生的事情。
1.1 + 1.2。)setValueAt
和getColumnClass
都是模型的一部分,并且可能无法解决所选背景的问题。
您不必使用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);