天天看点

jtable单元格的悬浮提示和表头标题的悬浮提示

swing 项目时遇到这样一个问题:jtable显示内容时其中某列内容比较长通常显示不下,又因为某些原因不想或不能给予这列足够的空间,于是就想到了ToolTip。

         查了下java API发现jtbale中只有个getToolTipText的方法须在渲染器中设置,由于没有使用自定义的Render,所以使用了父类JComponent的setToolTipText方法。具体原理为:setToolTipText是整个jtable单元格的提示,可在鼠标事件中根据不同的单元格提示不同的信息。

 代码如下:  

//悬浮提示单元格的值 
		table.addMouseMotionListener(new MouseAdapter(){
			public void mouseMoved(MouseEvent e) {
				int row=table.rowAtPoint(e.getPoint());
				int col=table.columnAtPoint(e.getPoint());
				if(row>-1 && col>-1){
					Object value=table.getValueAt(row, col);
					if(null!=value && !"".equals(value))
						table.setToolTipText(value.toString());//悬浮显示单元格内容
					else
						table.setToolTipText(null);//关闭提示
				}
			}
		}); 
           

 后来发现直接重写jtable的public String getToolTipText(MouseEvent e)方法也可以达到效果,看来下jtbale源代码getToolTipText也是取自父类JComponent的getToolTipText方法。  

还是直接重写方便点 

table = new JTable(playerInfo, Names){
			public String getToolTipText(MouseEvent e) {
				int row=table.rowAtPoint(e.getPoint());
				int col=table.columnAtPoint(e.getPoint());
				String tiptextString=null;
				if(row>-1 && col>-1){
					Object value=table.getValueAt(row, col);
					if(null!=value && !"".equals(value))
						tiptextString=value.toString();//悬浮显示单元格内容
				}
				return tiptextString;
			}
		};
           

  jtable表头的提示需重写JTableHeader的public String getToolTipText(MouseEvent e)方法。

  最后列子如下(表头提示和单元格提示):

 import java.awt.BorderLayout;   

  1. import java.awt.event.MouseEvent;   
  2. import javax.swing.JFrame;   
  3. import javax.swing.JScrollPane;   
  4. import javax.swing.JTable;   
  5. import javax.swing.WindowConstants;   
  6. import javax.swing.table.JTableHeader;   
  7. public class JtableCellTips {   
  8.     private JTable table;   
  9.     String[] namestooltip={"wow ncp  name","some word"};   
  10.     public JtableCellTips(){   
  11.         JFrame f = new JFrame();   
  12.         f.setSize(300, 200);   
  13.         Object[][] playerInfo = {   
  14.                 { "提里奥.弗丁", "种族不代表荣耀,我见过最高尚的兽人,也见过最卑劣的人类。" },   
  15.                 { "莫格莱尼", "生命本身毫无意义,只有死亡才能让你了解人性的真谛。"} };   
  16.         String[] Names = { "姓名", "台词" };   
  17.         table = new JTable(playerInfo, Names){   
  18.             public String getToolTipText(MouseEvent e) {   
  19.                 int row=table.rowAtPoint(e.getPoint());   
  20.                 int col=table.columnAtPoint(e.getPoint());   
  21.                 String tiptextString=null;   
  22.                 if(row>-1 && col>-1){   
  23.                     Object value=table.getValueAt(row, col);   
  24.                     if(null!=value && !"".equals(value))   
  25.                         tiptextString=value.toString();//悬浮显示单元格内容  
  26.                 }   
  27.                 return tiptextString;   
  28.             }   
  29.              protected JTableHeader createDefaultTableHeader() {   
  30.                     return new JTableHeader(columnModel) {   
  31.                         public String getToolTipText(MouseEvent e) {   
  32.                             String tip = null;   
  33.                             java.awt.Point p = e.getPoint();   
  34.                             int index = columnModel.getColumnIndexAtX(p.x);   
  35.                             int realIndex =  columnModel.getColumn(index).getModelIndex();   
  36.                             return namestooltip[realIndex];   
  37.                         }   
  38.                     };   
  39.                 }   
  40.         };   
  41.         //悬浮提示单元格的值    
  42. //      table.addMouseMotionListener(new MouseAdapter(){  
  43. //          public void mouseMoved(MouseEvent e) {  
  44. //              int row=table.rowAtPoint(e.getPoint());  
  45. //              int col=table.columnAtPoint(e.getPoint());  
  46. //              if(row>-1 && col>-1){   
  47. //                  Object value=table.getValueAt(row, col);  
  48. //                  if(null!=value && !"".equals(value))  
  49. //                      table.setToolTipText(value.toString());//悬浮显示单元格内容  
  50. //                  else   
  51. //                      table.setToolTipText(null);//关闭提示  
  52. //              }   
  53. //          }   
  54. //      });   
  55.         JScrollPane scrollPane = new JScrollPane(table);   
  56.         f.getContentPane().add(scrollPane, BorderLayout.CENTER);   
  57.         f.setTitle("单元格悬浮提示");   
  58.         f.setLocationRelativeTo(null);   
  59.         f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);   
  60.         f.setVisible(true);   
  61.     }   
  62.     public static void main(String[] args) {   
  63.         new JtableCellTips();   
  64.     }   
  65. }