`
zeyuphoenix
  • 浏览: 55578 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

表格(悬浮框提示)

 
阅读更多
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 12"> <meta name="Originator" content="Microsoft Word 12"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> <link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso"> <!--[if !mso]> <style> v":* {behavior:url(#default#VML);} o":* {behavior:url(#default#VML);} w":* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> <link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"> <!--[if gte mso 9]><xml> Normal 0 false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4;} @font-face {font-family:Calibri; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman";} @font-face {font-family:""@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal { mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Calibri","serif"; mso-bidi-font-family:"Times New Roman";} .MsoChpDefault { mso-bidi-font-family:"Times New Roman";} /* Page Definitions */ @page {} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; layout-grid:15.6pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.5pt; font-family:"Calibri","serif";} </style> <![endif]-->

JTableToolTip提示和其它的组件提示是一样的,因为它们都是继承于Jcomponent,当我们需要为我们的单元格实现ToolTip的时候,只需要复写它的getToolTipText方法就可以了,

看看Sun官方的例子:

<!--[if gte vml 1]> <![endif]-->

       //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,可以有图片,可以有正文,甚至可以再加别的组件.如下图所示:

<!--[if gte vml 1]> <![endif]-->

我们需要的是增加监听:

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就有:

<!--[if gte vml 1]> <![endif]-->

ToolTip到这儿就算完了,但是实际使用中可能有这个问题,如下图:

<!--[if gte vml 1]> <![endif]-->

这是因为我们经过设置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();

                }

            }

        }

最后效果如图:

<!--[if gte vml 1]> <![endif]-->

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics