JTable的ToolTip提示和其它的组件提示是一样的,因为它们都是继承于Jcomponent,当我们需要为我们的单元格实现ToolTip的时候,只需要复写它的getToolTipText方法就可以了,
看看Sun官方的例子:
//Implement table cell tool tips.
@Override
public String getToolTipText(MouseEvent
e) {
取得鼠标的行和列:
java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);
int ealColumnIndex = convertColumnIndexToModel(colIndex);
设置你需要显示的ToolTip,然后返回
tip = ……;
returntip;
同样的JTableHeader也是如此:
protected JTableHeader
createDefaultTableHeader() {
returnnew JTableHeader(columnModel) {
@Override
public String
getToolTipText(MouseEvent e) {
这样不用其它设置,JTable的基本ToolTip就实现了,它虽然比较简单,但是最大的好处是不用自己考虑定位和显示的问题,很多时候也就可以了.
关于JTable的简单ToolTip提示就算是完成了,当我们只是简单的提示的时候,只需要复写JTable的getToolTipText和setToolTipText方法就可以了,上个例子就是这样;但是当我们需要使我们的ToolTip提示不像Sun提供的那么单调,我们就需要自己来实现了.
这时候的重点已经不在JTable上了,而在于ToolTip上面,我们可以把我们需要呈现的ToolTip实现为一个JPanel,这样就可以在它的上面放置各种组件了,设置放图标都可以,这个时候就需要实现这个ToolTip的UI和Manager,这方面有很多开源的实现,以后有时间的话开个专题专门来介绍ToolTip的,这里不写了.
对于已经实现好的我们自己的ToolTip,我们需要做的是把它注册到我们的JTable上面,再根据鼠标的位置显示它,如下图所示,它可以有Title,可以有图片,可以有正文,甚至可以再加别的组件.如下图所示:
我们需要的是增加监听:
addMouseListener(this)
根据监听的状态处理ToolTip:
@Override
publicvoid mouseExited(MouseEvent event) {
隐藏
@Override
publicvoid mousePressed(MouseEvent event) {
显示
@Override
publicvoid mouseMoved(MouseEvent event) {
判断状态,显示或者隐藏.
然后是判断位置:
// display
directly below or above JTable band
location.x = screenLocation.x;
location.y = screenLocation.y +
mouseEvent.getY() + 22;
location.x = screenLocation.x
+mouseEvent.getX();
f ((location.y + size.height) > (sBounds.y + sBounds.height)) {
location.y = screenLocation.y - size.height;
最后是取得鼠标所在单元格的值传入显示:
Point p = mouseEvent.getPoint();
int row =
rowAtPoint(p);
int col =
columnAtPoint(p);
if (row == -1
|| col == -1) {
returnnull;
}
Object data = getValueAt(row, col);
当然此时你可以对data做变换,从而显示需要的值.
使用很简单,注册就可以了.
setActionRichTooltip(new RichTooltip());
然后是另外一种ToolTip的效果,这个是一个开源的实现,只抓张图看看就算了,和前面的实现基本类似,还比那个简单,也是UI,Timer以及位置计算.如下图,代码在open就有:
ToolTip到这儿就算完了,但是实际使用中可能有这个问题,如下图:
这是因为我们经过设置Renderer渲染的单元格显示值和实际值不一样了.但我们很多时候需要看到的其实不是它的真实值,而是渲染后的值,可以通过渲染的实现类把它取回来:
先取得渲染类:
TableCellRenderer cellRenderer = table.getColumnModel().getColumn(column).getCellRenderer();
再去的渲染的控件:
Component component =
cellRenderer.getTableCellRendererComponent(table,
table.getValueAt(row, column), false, false, row, column);
这个时候不知道这个控件是否有getText方法,通过反射判断,没有则设置为””
String text = "";
if (component
!= null) {
for (Method
method : component.getClass().getMethods()) {
if
(method.getName().equals("getText")) {
text =
method.invoke(component).toString();
}
}
}
最后效果如图:
到此为止,所有关于JTable的ToolTip提示就完成了,当然我实现的都是一些基本的效果,比较复杂的效果,则需要你自己去绘制和实现ToolTip了,说句简单的,技术完成了,以后就是玩色彩和审美了,做程序也就这样了,很多时候后者重要.