我有一个与
JTable
配合使用的应用程序,在这个 JTable
中,我希望每个单元格都具有 ImageIcon
和一些文本。
我在这个链接上看到(https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender),
JTable
支持ImageIcon
或文本,但似乎两者都不是同一时间。
我还看到,在
ImageIcon
的项目符号上,它写着 由居中标签渲染。
好吧,我知道我可以将
ImageIcon
和文本放在同一个 JLabel
上——我已经在应用程序的不同部分这样做了。
我如何访问该
JLabel
,以便我可以在该图标旁边放置一些文本?
我被告知我的问题实际上是重复的。这是原始问题的链接。
https://stackoverflow.com/a/52065145/131872
但是我可以提供更多关于我如何实现它的细节。
就我而言,我想存储
ImageIcon
和一些文本。因此,我应该做的第一件事是创建一个包含这两个元素的数据类型。
record TextIcon(String text, ImageIcon icon) {}
接下来,我需要创建一个可以渲染此数据类型的渲染器。为此,我将延长
DefaultTableCellRenderer
。
final class MyTableCellRenderer extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (value instanceof TextIcon textIcon)
{
this.setText(textIcon.text());
this.setIcon(textIcon.icon());
}
return this;
}
}
这样做很好,因为现在我不需要指定这适用于哪一列。我可以将此渲染器应用到我的所有列,然后如果它们不是
TextIcon
,它们将只执行它们本来应该得到的默认渲染。
或者,如果我需要为表创建另一种数据类型,我可以向此方法添加另一个 if 语句。此策略是向表格添加自定义渲染的强大方法。
现在我有了渲染器,我会将其添加到我的所有列中。这是最简单的方法。
table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
我使用
Object.class
因为我希望这个渲染器用于所有列。由于 Object
是所有引用数据类型的父级,因此这样做本质上意味着我将此渲染器应用到我的所有列。
之后,我就按原样继续,事情就正常了!