我有一个包含JPanels列的表。我编写了自定义渲染器和编辑器,它们工作正常。但是,面板包含带有工具提示的JLabel组件。如果我单击进入单元格并将鼠标悬停在标签上,则会显示工具提示,但如果我将鼠标移动到单元格中并将鼠标悬停在JLabel上,则工具提示将不会显示。我已经向表中添加了一个鼠标监听器,如下所示,我获取了Panel对象并尝试使其具有焦点。
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
int row = table.rowAtPoint(p);
int column = table.columnAtPoint(p);
System.out.println(row + " " + column);
Object o = table.getModel().getValueAt(row, column);
if (o instanceof FileInfoCellPanel) {
FileInfoCellPanel ficp = (FileInfoCellPanel)o;
ficp.requestFocusInWindow();
//ficp.revalidate();
}
}
我肯定得到了正确的JPanel对象,但它似乎永远不会得到焦点。因此,单击单元格似乎会将焦点放在面板上,但移动鼠标则不会。
答案 0 :(得分:2)
如果您只想在工具提示中显示文本,则只需在渲染器返回的组件上设置工具提示即可。如果您查看JTable#getTooltipText
方法的实现,可以看到这一点,我在下面复制了
public String getToolTipText(MouseEvent event) {
String tip = null;
Point p = event.getPoint();
// Locate the renderer under the event location
int hitColumnIndex = columnAtPoint(p);
int hitRowIndex = rowAtPoint(p);
if ((hitColumnIndex != -1) && (hitRowIndex != -1)) {
TableCellRenderer renderer = getCellRenderer(hitRowIndex, hitColumnIndex);
Component component = prepareRenderer(renderer, hitRowIndex, hitColumnIndex);
// Now have to see if the component is a JComponent before
// getting the tip
if (component instanceof JComponent) {
// Convert the event to the renderer's coordinate system
Rectangle cellRect = getCellRect(hitRowIndex, hitColumnIndex, false);
p.translate(-cellRect.x, -cellRect.y);
MouseEvent newEvent = new MouseEvent(component, event.getID(),
event.getWhen(), event.getModifiers(),
p.x, p.y,
event.getXOnScreen(),
event.getYOnScreen(),
event.getClickCount(),
event.isPopupTrigger(),
MouseEvent.NOBUTTON);
tip = ((JComponent)component).getToolTipText(newEvent);
}
}
// No tip from the renderer get our own tip
if (tip == null)
tip = getToolTipText();
return tip;
}
可以看出,要确定工具提示文本,请求渲染器提供组件,并要求该组件提供其工具提示文本。当然这仅适用于文本而不适用于例如文本。图像