我正在创建一个swing table cell renderer,它应该将图像显示为工具提示。这是基本的实现:
图像存储在文件服务器上,并使用文档管理系统进行管理。我们使用一种方法使用其唯一的文档ID来检索这些文件。这部分不能改变。
创建包含图像ID和文件对象
这是渲染器方法:
@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()
当我在单元格上执行鼠标悬停以确保只下载实际正在观看的图像时,才会调用?
答案 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;
}
});