【问题标题】:How to add text next to image in jtable?如何在jtable中的图像旁边添加文本?
【发布时间】:2016-08-17 22:08:44
【问题描述】:

我有一个三列 jtable,希望前两列有一个 Imageicon 和一个字符串。

目前我正在显示像

这样的 ImageIcons
 DefaultTableModel model = new DefaultTableModel(rows, columns) {
                            @Override
                            public Class<?> getColumnClass(int column) {
                                switch (column) {
                                    case 0:
                                    case 1:
                                        return ImageIcon.class;
                                    case 2:
                                        return String.class;
                                    default:
                                        return Object.class;
                                }
                            }
                        };

jTable.setModel(model);

我确实找到了这个,但不知道 ... 中的内容或如何在 jtable 中设置 ImageIcon 和字符串:

Java - Is it possible to put an image and a String in the same JTable cell?

我们将不胜感激。

【问题讨论】:

    标签: java swing jtable imageicon


    【解决方案1】:

    因为DefaultTableCellRendererJLabel,您可以在自定义renderer 中使用它的文本对齐属性来标记图标。下面的示例覆盖 getRowHeight() 以确保可见性。我有updated 使用自定义类的示例,建议hereLabelIcon 的一个实例为每一行保存一个图标和标签对。

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    /**
     * @see https://stackoverflow.com/a/36830558/230513
     */
    public class TableExample {
    
        private JFrame frame = new JFrame("Table Demo");
        private Icon errorIcon = (Icon) UIManager.getIcon("OptionPane.errorIcon");
        private Icon infoIcon = (Icon) UIManager.getIcon("OptionPane.informationIcon");
        private Icon warnIcon = (Icon) UIManager.getIcon("OptionPane.warningIcon");
        private String[] columnNames = {"String", "Icon"};
        private Object[][] data = {
            {"One", new LabelIcon(errorIcon, "Error")},
            {"Two", new LabelIcon(infoIcon, "Information")},
            {"Three", new LabelIcon(warnIcon, "Warning")},
            {"Four", new LabelIcon(errorIcon, "Error")},
            {"Five", new LabelIcon(infoIcon, "Information")},
            {"Six", new LabelIcon(warnIcon, "Warning")}};
        private final TableModel model = new DefaultTableModel(data, columnNames) {
    
            @Override
            public Class<?> getColumnClass(int column) {
                switch (column) {
                    case 0:
                        return String.class;
                    case 1:
                        return LabelIcon.class;
                    default:
                        return String.class;
                }
            }
        };
    
        private static class LabelIcon {
    
            Icon icon;
            String label;
    
            public LabelIcon(Icon icon, String label) {
                this.icon = icon;
                this.label = label;
            }
        }
    
        private static class LabelIconRenderer extends DefaultTableCellRenderer {
    
            public LabelIconRenderer() {
                setHorizontalTextPosition(JLabel.CENTER);
                setVerticalTextPosition(JLabel.BOTTOM);
            }
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object
                value, boolean isSelected, boolean hasFocus, int row, int col) {
                JLabel r = (JLabel) super.getTableCellRendererComponent(
                    table, value, isSelected, hasFocus, row, col);
                setIcon(((LabelIcon) value).icon);
                setText(((LabelIcon) value).label);
                return r;
            }
        }
    
        public TableExample() {
            JTable table = new JTable(model) {
                @Override
                public int getRowHeight() {
                    return super.getRowHeight() + infoIcon.getIconHeight();
                }
    
                @Override
                public Dimension getPreferredScrollableViewportSize() {
                    return new Dimension(
                        (5 * super.getPreferredSize().width) / 4,
                        4 * this.getRowHeight());
                }
            };
            table.setAutoCreateRowSorter(true);
            table.setDefaultRenderer(LabelIcon.class, new LabelIconRenderer());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new JScrollPane(table));
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> {
                TableExample tableExample = new TableExample();
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

      我确实找到了这个,但不知道里面发生了什么......或者如何在 jtable 中设置 ImageIcon 和字符串:

      您需要创建自定义对象(假设您将其称为 MyCustomObject)来保存您要显示的信息。所以你的自定义对象将有两个属性:图标和文本。

      然后您创建对象并添加到 TableModel 中,就像您为表中的任何其他对象所做的那样。

      您需要重写 getColumnClass() 方法以返回前两列的 MyCustomObject。然后还需要为MyCustomObject设置自定义渲染器。

      那么在渲染代码中你会做这样的事情:

      MyCustomObject data = (MyCustomObject)value;
      setIcon(data.getIcon());
      setText(data.getText());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        相关资源
        最近更新 更多