使用prepareRenderer方法将鼠标hover在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 = "" + ""; Component c = super.prepareRenderer(renderer, row, column); if (c instanceof JComponent) { JComponent jc = (JComponent) c; jc.setToolTipText(html); } return c; } }; 

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

提前致谢

这是一种可行的方法……

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

相反,它使用JTablegetToolTipText方法尝试根据第0列的值从数据库加载图像,该列被假定为我们要查找的图像的ID。

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

 public class MyTable extends JTable { private Connection con; private Map imgCache; public MyTable(Connection con) { this.con = con; imgCache = new HashMap<>(25); // Register with the TooltipManager setToolTipText("No image available"); } @Override public String getToolTipText(MouseEvent event) { String tip = super.getToolTipText(event); int col = columnAtPoint(event.getPoint()); int row = rowAtPoint(event.getPoint()); Object value = getValueAt(row, 0); if (value instanceof Number) { long id = ((Number) value).longValue(); File source = imgCache.get(id); if (source == null) { try (PreparedStatement ps = con.prepareStatement("select name, img from table where id=?")) { ps.setLong(1, id); ResultSet rs = ps.executeQuery(); if (rs.next()) { String name = rs.getString("name"); 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)); source = File.createTempFile(name, ".jpg"); ImageIO.write(img, "jpg", source); imgCache.put(id, source); } } catch (SQLException | IOException exp) { exp.printStackTrace(); tip = "Failed to load image: " + exp.getMessage(); } } if (source != null) { try { tip = "" + ""; } catch (MalformedURLException exp) { tip = "Failed to load image: " + exp.getMessage(); } } else { tip = "No image available"; } } return tip; } } 

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