2010年4月18日 星期日

JTable 表格(懸浮框提示)

JTableToolTip提示和其它的组件提示是一样的,因为它们都是继承于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提示就算是完成了,当我们只是简单的提示的时候,只需要复写JTablegetToolTipTextsetToolTipText方法就可以了,上个例子就是这样;但是当我们需要使我们的ToolTip提示不像Sun提供的那么单调,我们就需要自己来实现了.

这时候的重点已经不在JTable上了,而在于ToolTip上面,我们可以把我们需要呈现的ToolTip实现为一个JPanel,这样就可以在它的上面放置各种组件了,设置放图标都可以,这个时候就需要实现这个ToolTipUIManager,这方面有很多开源的实现,以后有时间的话开个专题专门来介绍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();

}

}

}

最后效果如图:

到此为止,所有关于JTableToolTip提示就完成了,当然我实现的都是一些基本的效果,比较复杂的效果,则需要你自己去绘制和实现ToolTip,说句简单的,技术完成了,以后就是玩色彩和审美了,做程序也就这样了,很多时候后者重要.



source: http://www.blogjava.net/zeyuphoenix/archive/2010/04/14/318380.html

沒有留言: