【问题标题】:show an image when hover over a jtable cell将鼠标悬停在 jtable 单元格上时显示图像
【发布时间】:2014-05-12 17:20:53
【问题描述】:

我有一个使用 DefaultTableModel 创建的 JTable,我想在鼠标悬停在该 JTable 的特定单元格上时显示一个图像,并且我需要每个单元格的图像都不同。

提前致谢

【问题讨论】:

    标签: java image swing jtable defaulttablemodel


    【解决方案1】:

    您可以为单元格/列/行组件覆盖JTablesetToolTip 中的prepareRenderer,并为工具顶部使用一些HTML,请参见herehere

    对于每个不同的图像,您需要获取不同的 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();
                }
            });
        }
    }
    

    【讨论】:

    • 我知道如何获取图片网址,但我不知道如何使用此代码,或者在哪里插入? jc是什么?
    • 它是一个 JComponent。您不能在组件上设置工具提示,因此首先检查渲染器组件是否是JComponent 的实例,然后进行转换。 jc 是转换为 JComponent 的组件,因此您可以在渲染器组件上调用 JComponentsetToolTip
    • 查看我发布的链接。他们有完整的工作示例
    • 查看我的 UPDATE 以获得更直观的工作示例。链接的答案可能与您尝试做的事情有些不同
    【解决方案2】:

    您需要使用自定义的TableCellRenderer

    如果您从 DefaultTableCellRenderer 继承,它扩展了 JLabel,您可以通过使用渲染器的 setIcon 方法非常轻松地引入图像,并为它提供一个包裹在 ImageIcon 中的图像。

    如果这是您第一次尝试使用渲染器,我建议您阅读以下教程:Custom table renderers

    【讨论】:

    • 好的,但我不想更改单元格中的内容,我只想在鼠标光标在单元格上时显示图像
    • 我必须添加一个监听器并在其中应用渲染器吗?以及如何做到这一点?
    • “我不想更改单元格中的内容”是什么意思?您希望图像出现在工具提示中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多