【问题标题】:How to show icon instead of number in JTable?如何在 JTable 中显示图标而不是数字?
【发布时间】:2021-06-24 14:02:57
【问题描述】:

为了节省数据库空间,我将数字而不是图标保存到数据库中。例如数据库中的数字 9 表示 B.png。我想要的是首先将数据加载到JTable

然后循环将数字改为相应的图标,如9应改为B.png图标:

但是我将数据加载到表格后它不起作用,数字9单元格应该显示图标,但它显示了图标的文件路径:

  public void load() {
    try {
        conn = (Connection) DriverManager.getConnection("jdbc:mysql://192.168.30.6/game?autoReconnect=true", "lee", "");
        pstmt = (PreparedStatement) conn.prepareStatement("Select c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17 From test_socre order by sn");
        rs = pstmt.executeQuery();
        score.setModel(DbUtils.resultSetToTableModel(rs));
        while (rs.next()) {
        }
        DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
        centerRenderer.setHorizontalAlignment(JLabel.CENTER);
        score.getColumnModel().getColumn(0).setCellRenderer(centerRenderer);
        for (int x = 0; x < score.getColumnCount(); x++) {
            score.getColumnModel().getColumn(x).setCellRenderer(centerRenderer);//how to center alignment in jtable
        }
        for (int ix = 0; ix < score.getRowCount(); ix++) {
            for (int jy = 0; jy < score.getColumnCount(); jy++) {
                if (score.getValueAt(ix, jy) != null && "9".equals(score.getValueAt(ix, jy).toString())) {

                    ImageIcon icon = new ImageIcon(getClass().getResource("/slip/B.png"));

                    score.setValueAt(icon, ix, jy);
                }
            }
        }

        rs.close();
        pstmt.close();
        conn.close();
    } catch (SQLException ex) {
        Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
    }
}

【问题讨论】:

    标签: java swing jtable imageicon


    【解决方案1】:

    我仍然不确定我是否理解这个问题,但请注意,渲染器可以为每个值选择适当的图标。以下是左侧表格中的原始数字和右侧表格中相同表格模型的图标的样子。

    特别注意下面代码中的IconTableCellRenderer

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    import java.net.URL;
    import javax.swing.table.*;
    import java.util.Random;
    
    public class ImageForNumberTable {
    
        private JComponent ui = null;
        String prefix = "https://i.stack.imgur.com/";
        String[] urlStrings = {
            "wCF8S.png", "5v2TX.png", "F0JHK.png", "4EVv1.png", "xj49g.png"
        };
        ImageIcon[] imageIcons = new ImageIcon[5];
    
        ImageForNumberTable() {
            try {
                initUI();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    
        public final void initUI() throws Exception{
            if (ui!=null) return;
            
            for (int ii=0; ii<urlStrings.length; ii++) {
                URL url = new URL(prefix + urlStrings[ii]);
                imageIcons[ii] = new ImageIcon(url);
            }
            Random random = new Random();
            Integer[][] values = new Integer[5][5];
            for (int xx=0; xx<values.length; xx++) {
                for (int yy=0; yy<values[0].length; yy++) {
                    values[xx][yy] = new Integer(random.nextInt(5));
                }
            }
            String[] colNames = {"Col 1", "Col 2", "Col 3", "Col 4", "Col 5"};
            DefaultTableModel dtm = new DefaultTableModel(values, colNames);
    
            ui = new JPanel(new GridLayout(0,2,0,0));
            ui.setBorder(new EmptyBorder(4,4,4,4));
            
            JTable table1 = new JTable(dtm);
            table1.setRowHeight(36);
            JTable table2 = new JTable(dtm);
            table2.setDefaultRenderer(Object.class, new IconTableCellRenderer());
            table2.setRowHeight(36);
            
            ui.add(new JScrollPane(table1));
            ui.add(new JScrollPane(table2));
        }
    
        public JComponent getUI() {
            return ui;
        }
        
        class IconTableCellRenderer extends DefaultTableCellRenderer {
    
            @Override
            public Component getTableCellRendererComponent(
                    JTable table, Object value, boolean isSelected, 
                    boolean hasFocus, int row, int column) {
                Component c = super.getTableCellRendererComponent(
                        table, value, isSelected, hasFocus, row, column);
                JLabel l = (JLabel)c;
                final Integer val = (Integer)value;
                l.setIcon(imageIcons[val.intValue()]);
                l.setText("");
                
                return l;
            }
        }
    
        public static void main(String[] args) {
            Runnable r = () -> {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                ImageForNumberTable o = new ImageForNumberTable();
                
                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);
                
                f.setContentPane(o.getUI());
                f.pack();
                
                f.setVisible(true);
            };
            SwingUtilities.invokeLater(r);
        }
    }
    

    【讨论】:

    • 你找到解决方案了吗?
    • @AndrewThompson table2.setDefaultRenderer(Object.class, new icontableCellRenderer()); 这行我不明白。我检查了文档:docs.oracle.com/javase/7/docs/api/javax/swing/…
    • @JianHe “这条线我不明白。” 那条线我没有给出。始终复制/粘贴您要询问的内容,而不是键入“类似”的行。但是,即使您使用了正确的大写/小写字母,在我发表评论之前,我也需要更多关于您不理解的内容的详细信息。你为什么不问你自己的问题(在你自己的问题线程中,表现出比评论中明显的更多的努力)?
    【解决方案2】:

    但它显示了图标的文件路径:

    你需要告诉表格使用什么渲染器;

    如果表格中的所有数据都是Icon,那么您可以告诉表格使用默认的图标渲染器。

    第一次尝试:

    table.setDefaultRenderer(Object.class, table.getDefaultRenderer(Icon.class));
    

    如果这不起作用,那么您可以使用:

    JTable table = new JTable(data, columnNames)
    {
        @Override
        public Class getColumnClass(int column)
        {
            return Icon.class;
        }
    };
    

    如果你有文本和图标的组合,那么你可以使用类似的东西:

    JTable table = new JTable(...)
    {
        @Override
        public TableCellRenderer getCellRenderer(int row, int column)
        {
            Object value = getValueAt(row, column);
    
            return getDefaultRenderer(value.getClass();
        }
    
    };
    

    【讨论】:

      【解决方案3】:

      尝试设置默认渲染器:

      myTable.getColumnModel().getColumn(1)
      .setCellRenderer(myTable.getDefaultRenderer(ImageIcon.class));
      

      对每个输入 ImageIcon 的单元格执行此操作。

      【讨论】:

      • 你不能为每个单元格设置一个渲染器。此方法设置整个列的渲染器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 2017-11-15
      • 2017-04-06
      • 2015-10-16
      • 1970-01-01
      相关资源
      最近更新 更多