我正在尝试为 JTable 的特定列获取自定义工具提示。我已经创建了一个 CellRenderer(我已经成功更改了其他特定于单元格的属性):
private class CustomCellRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = 1L;
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
JComponent c = (JComponent) super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
if (value != null)
{
if(column == 1 && value instanceof Date)
{
final DateFormat df = new SimpleDateFormat("h:mm aa");
table.setValueAt(df.format(value), row, column);
}
else if(column == 2)
{
c.setToolTipText((String) value);
}
else if(column == 4)
{
final Mail m = main.selectedPage.messages.get(row);
JCheckBox checkBox;
if((Boolean) value)
{
checkBox = new JCheckBox()
{
@Override
public JToolTip createToolTip()
{
System.out.println("Passed");
return new ImageToolTip(m.getImage());
}
};
checkBox.setToolTipText(m.attachName);
}
else
checkBox = new JCheckBox();
checkBox.setSelected(((Boolean)value).booleanValue());
c = checkBox;
}
}
else
{
c.setToolTipText(null);
}
return c;
}
}
当我像这样重写任何其他 JComponent 的 createTooltip() 方法时,它在渲染器之外都可以正常工作。
checkBox = new JCheckBox()
{
@Override
public JToolTip createToolTip()
{
System.out.println("Passed");
return new ImageToolTip(m.getImage());
}
};
据我所知,工具提示是在其他地方创建的,因为“通过”甚至从未被打印过。这checkBox.setToolTipText(m.attachName);
只会产生带有该字符串的默认工具提示。
我找到了一个拥有类似的问题 https://stackoverflow.com/questions/6042212/override-createtooltip-method-of-jpanel-in-java-swing,但我不能说我完全理解唯一的解决答案。我需要扩展 JTable 并覆盖吗getToolTipText(MouseEvent e)
?如果是这样,我不确定如何获得正确的(我的)工具提示。
请原谅我自学的任何怪异行为。提前致谢。 :-)
EDIT:
感谢 Robin,我能够根据 JTable 拼凑出一些东西getToolTipText(MouseEvent e)
代码。我将把它留在这里给其他有类似问题的人。再说一次,我不确定这是否是最好的方法,所以请随意在下面批评它。 :-)
messageTable = new JTable()
{
@Override
public JToolTip createToolTip()
{
Point p = getMousePosition();
// 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);
if (component instanceof JCheckBox)
{
Image img = main.selectedPage.messages.get(hitRowIndex).getImage();
if(((JCheckBox) component).isSelected())
return new ImageToolTip(img);
}
}
return super.createToolTip();
}
}