【发布时间】:2014-05-12 17:20:53
【问题描述】:
我有一个使用 DefaultTableModel 创建的 JTable,我想在鼠标悬停在该 JTable 的特定单元格上时显示一个图像,并且我需要每个单元格的图像都不同。
提前致谢
【问题讨论】:
标签: java image swing jtable defaulttablemodel
我有一个使用 DefaultTableModel 创建的 JTable,我想在鼠标悬停在该 JTable 的特定单元格上时显示一个图像,并且我需要每个单元格的图像都不同。
提前致谢
【问题讨论】:
标签: java image swing jtable defaulttablemodel
您可以为单元格/列/行组件覆盖JTable 和setToolTip 中的prepareRenderer,并为工具顶部使用一些HTML,请参见here 和here
对于每个不同的图像,您需要获取不同的 URL 作为img 标记的src。为此,您需要了解一些基本的 HTML。对于类路径中的图像,您可以使用getClass().getResource() 获取 URL。或者您可以使用File.getUri().getUrl() 获取文件系统上的图像文件。上面的链接之一还显示了如何从关系数据库中获取图像。
无论您以何种方式获取 URL,都将使用它作为 <img src 标记中的 URL。类似于(来自链接的答案):
URL url = getClass().getResource("/path/to/image");
String html = "<html><body>"
+ "<img src='"
+ url
+ "' width=150 height=150> ";
jc.setToolTipText(html + "<br/>"
+ getValueAt(row, column).toString()
+ ": row, col (" + row + ", " + column + ")"
+ "</body></html>");
您需要以某种方式组织图像,以便模型中的数据以某种方式与可用于获取 URL 的路径相对应。假设您有一个名称作为表中的一条数据,那么您希望能够使用该名称作为获取 URL 的标识符
更新完整示例
鉴于这是我的以下项目结构
ProjectRoot
src
resources
mario
Mario.png
Luigi.png
以下作品
import java.awt.Component;
import java.net.URL;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class TableTooltipDemo {
public TableTooltipDemo() {
JTable table = getTable(getModel());
JFrame frame = new JFrame("Table ToolTip");
frame.add(new JScrollPane(table));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private JTable getTable(DefaultTableModel model) {
JTable table = new JTable(model) {
@Override
public Component prepareRenderer(TableCellRenderer renderer,
int row, int col) {
Component c = super.prepareRenderer(renderer, row, col);
if (c instanceof JComponent) {
JComponent jc = (JComponent)c;
String name = getValueAt(row, 0).toString();
String html = getHtml(name);
jc.setToolTipText(html);
}
return c;
}
};
return table;
}
private String getHtml(String name) {
URL url = getClass().getResource("/resources/mario/" + name + ".png");
String html
= "<html><body>"
+ "<img src='"
+ url
+ "' width=150 height=150></body></html>";
return html;
}
private DefaultTableModel getModel() {
String[] cols = { "Name", "Age", "Message" };
Object[][] data = { { "Mario", 32, "I am Mario!" },
{ "Luigi", 32, "I am Luigi!" },
{ "Bowser", 32, "I am Bowser!" },
{ "Princess", 32, "I am Princess!" },
{ "Koopa", 32, "I am Koopa!" } };
DefaultTableModel model = new DefaultTableModel(data, cols);
return model;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TableTooltipDemo();
}
});
}
}
【讨论】:
JComponent 的实例,然后进行转换。 jc 是转换为 JComponent 的组件,因此您可以在渲染器组件上调用 JComponent 的 setToolTip
您需要使用自定义的TableCellRenderer。
如果您从 DefaultTableCellRenderer 继承,它扩展了 JLabel,您可以通过使用渲染器的 setIcon 方法非常轻松地引入图像,并为它提供一个包裹在 ImageIcon 中的图像。
如果这是您第一次尝试使用渲染器,我建议您阅读以下教程:Custom table renderers
【讨论】: