如何将文本放在 JTable 中单元格上的 ImageIcon 旁边

问题描述 投票:0回答:1

我有一个与

JTable
配合使用的应用程序,在这个
JTable
中,我希望每个单元格都具有
ImageIcon
和一些文本。

我在这个链接上看到(https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender),

JTable
支持
ImageIcon
或文本,但似乎两者都不是同一时间。

我还看到,在

ImageIcon
的项目符号上,它写着 由居中标签渲染

好吧,我知道我可以将

ImageIcon
和文本放在同一个
JLabel
上——我已经在应用程序的不同部分这样做了。

我如何访问该

JLabel
,以便我可以在该图标旁边放置一些文本?

java swing jtable jlabel imageicon
1个回答
0
投票

我被告知我的问题实际上是重复的。这是原始问题的链接。

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
是所有引用数据类型的父级,因此这样做本质上意味着我将此渲染器应用到我的所有列。

之后,我就按原样继续,事情就正常了!

© www.soinside.com 2019 - 2024. All rights reserved.