当鼠标使用prepareRenderer方法悬停在JTable单元格上时显示图像

时间:2014-05-13 01:28:54

标签: java swing jtable

我使用此代码创建了一个JTable:

table = new JTable(new DefaultTableModel(
            new Object[][] {
            },
            en_entete
        )
                )

        {
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {

                URL fileURL = null;

                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    Connection conn = DriverManager.getConnection(
                            "jdbc:mysql://localhost/test", "root", "root");
                    PreparedStatement ps = conn.prepareStatement("select name, img from table where id=1");
                    ResultSet rs = ps.executeQuery();

                    while (rs.next()) {
                        String name = rs.getString("name");
                        File temp = File.createTempFile(name, ".jpg");
                        Blob blob = rs.getBlob("img");
                        int blobLength = (int) blob.length();
                        byte[] bytes = blob.getBytes(1, blobLength);
                        blob.free();
                        BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
                        ImageIO.write(img, "jpg", temp);

                        fileURL = temp.toURI().toURL();
                    }

                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                html
                = "<html><body>"
                + "<img src='"
                + fileURL + "'>";

                Component c = super.prepareRenderer(renderer, row, column);
                if (c instanceof JComponent) {
                    JComponent jc = (JComponent) c;
                    jc.setToolTipText(html);
                }
                return c;
            }

        };

因此,当鼠标悬停在我的JTable的单元格上时,图像就会显示出来。但我希望每个单元格(更改SQL请求)的图像不同,并且只显示第一列。

提前致谢

1 个答案:

答案 0 :(得分:1)

这是一种可行的方法......

我更喜欢依赖TableCellRenderer,但在这种情况下,它是不可能的。

相反,它使用getToolTipText的{​​{1}}方法尝试根据列JTable的值从数据库加载图像,该列被假定为ID我们正在寻找的形象。

这使用了一种缓存机制,这样每次请求工具提示时都不必点击数据库,它可以查找任何以前缓存的值。

0

请注意,如果单元格渲染器有工具提示,它将覆盖此值。