在鼠标悬停时计算工具提示而不是加载 table

Calculate ToolTip on Mouseover instead of loading the table

我正在创建一个 swing table 单元格渲染器,它应该将图像显示为工具提示。这是基本实现:

  1. 图像存储在文件服务器上,并使用文档管理系统进行管理。我们使用一种方法使用它们的唯一文档 ID 来检索这些文件。这部分不能更改。

  2. 创建一个包含图像 Id 和文件对象的 HashMap

  3. 渲染器检查图像Id是否包含在HashMap中。如果是,图像将从 HashMap 加载。如果没有,则应下载图像。

这是渲染器方法:

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    zebraPainter.paint(table, value, isSelected, hasFocus, row, column, this, false);
    if (value != null) {
        @SuppressWarnings({ "rawtypes", "unchecked" })
        T bo = (T) (((DefaultBOTableModel) table.getModel()).getBusinessObject(row));
        if (bo.getImageLink() != null) {
            setToolTipText(getImageFile(bo.getImageLink()));
        } else {
            setToolTipText(null);
        }
    }
    return this;
}

T 是存储在 JTable 中的通用对象。

这是生成工具提示的方法HTML

private String getImageFile(final Integer documentId) {
    if (documentId != null) {
        final DocumentService docService = ResourceManager.get(DocumentService.class);

        // check whether the document is already stored in imageMap. Use this if yes, download the image
        // and put in the map if no.
        File image = imageMap.get(documentId);
        if (image == null) {
            File myImage = docService.retrieveDocumentFile(new KeyObject(documentId, -1));
            imageMap.put(documentId, myImage);
            image = imageMap.get(documentId);

        }

        // URL of the image.
        URL url;
        try {
            url = image.toURI().toURL();
        } catch (MalformedURLException e) {
            throw new MespasRuntimeException("Error generating image tooltip", e);
        }

        return "<html><img src='" + url + "'/></html>";
    } else {
        return null;
    }
}

这很好用。然而,由于我们的 table 可以增长到相当大(一次可以显示 10'000 个项目,这是无法更改的)并且用户并不总是拥有最好的互联网连接,这给我带来了以下问题:

用于创建 HTML 工具提示的图像在填充 table 时下载。

我怎样才能以一种时尚的方式改变这个方法

getImageFile()

仅当我在单元格上执行鼠标悬停以确保仅下载实际正在观看的图像时才被调用?

您需要 addMouseMotionListener 来检测鼠标何时悬停在图像上,然后您应该访问存储在单元格上的通用对象以获取 link 以调用 getImageFile()

第一个进程需要 mouseMoved 内的条件来仅计算从单元格到另一个单元格(不是单元格内部)的移动。

第二个需要作为 JComponent 访问单元格才能设置工具提示图像。 :

public static int rowh, colh;//global 
...

table.addMouseMotionListener(new MouseAdapter() {
        @Override
        public void mouseMoved(MouseEvent e) {
            int row = table.rowAtPoint(e.getPoint());
            int col = table.columnAtPoint(e.getPoint());

            if (rowh != row || colh != col) { //movements from cell to cell inside the table. 
                rowh = row;
                colh = col;
                Object value = table.getModel().getValueAt(row, col);//get your Object value

                TableCellRenderer cellRenderer = table.getCellRenderer(row, col);
                Component rendererComponent = cellRenderer.getTableCellRendererComponent(table, null, false, true, row, col);
                JComponent jcomp = (JComponent)rendererComponent;

                //set the toolTip as you want.
                T bo = (T) (((DefaultTableModel) table.getModel()).getBusinessObject(row));
                    if (bo.getImageLink() != null) {
                        jcomp.setToolTipText(getImageFile(bo.getImageLink()));
                    } else {
                        jcomp.setToolTipText(null);
                    }
            }
        }

        @Override
        public void mouseExited(MouseEvent e) {
            rowh = -1;
            colh = -1;
        }
    });