在Mouseover上计算工具提示而不是加载表

时间:2017-10-26 10:15:58

标签: java swing tooltip renderer

我正在创建一个swing table cell renderer,它应该将图像显示为工具提示。这是基本的实现:

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

  2. 创建包含图像ID和文件对象

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

    @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中的通用Object。

    这是生成工具提示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;
        }
    }
    

    这完全没问题。但是,由于我们的桌子可能会变得非常大(一次可以显示10到000个项目,这不能更改)并且用户不总是拥有最好的互联网连接,这会给我带来以下问题:

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

    我怎样才能以某种方式改变这个方法

    getImageFile()
    
    当我在单元格上执行鼠标悬停以确保只下载实际正在观看的图像时,才会调用

1 个答案:

答案 0 :(得分:1)

您需要addMouseMotionListener检测鼠标悬停在图像上的时间,然后您应该访问存储在单元格上的通用对象,以获取调用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;
        }
    });