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;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.JTableHeader;


public class JtableCellTips {
	
	private JTable table;
	
	String[] namestooltip={"wow ncp  name","some word"};
	
	public JtableCellTips(){
		JFrame f = new JFrame();
		f.setSize(300, 200);
		Object[][] playerInfo = {
				{ "提里奥.弗丁", "种族不代表荣耀,我见过最高尚的兽人,也见过最卑劣的人类。" },
				{ "莫格莱尼", "生命本身毫无意义,只有死亡才能让你了解人性的真谛。"} };
		String[] Names = { "姓名", "台词" };
		
		
		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;
			}
			
			 protected JTableHeader createDefaultTableHeader() {
			        return new JTableHeader(columnModel) {
			            public String getToolTipText(MouseEvent e) {
			                String tip = null;
			                java.awt.Point p = e.getPoint();
			                int index = columnModel.getColumnIndexAtX(p.x);
			                int realIndex =  columnModel.getColumn(index).getModelIndex();
			                return namestooltip[realIndex];
			            }
			        };
			    }

		};
		
		//悬浮提示单元格的值 
//		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);//关闭提示
//				}
//			}
//		});
		
		JScrollPane scrollPane = new JScrollPane(table);
		f.getContentPane().add(scrollPane, BorderLayout.CENTER);
		f.setTitle("单元格悬浮提示");
		f.setLocationRelativeTo(null);
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setVisible(true);
		
	}
	
	public static void main(String[] args) {
		new JtableCellTips();
	}

}

 

你可能感兴趣的:(swing,F#)