zeyuphoenix

愿我爱的人快乐,愿爱我的人快乐,为了这些,我愿意不快乐.

表格(悬浮框提示)

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,说句简单的,技术完成了,以后就是玩色彩和审美了,做程序也就这样了,很多时候后者重要.

posted on 2010-04-14 23:29 zeyuphoenix 阅读(5246) 评论(0)  编辑  收藏 所属分类: JTable的使用

导航

<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

统计

常用链接

留言簿(52)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜