JTable的ToolTip提示和其它的組件提示是一樣的,因為它們都是繼承于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提示就算是完成了,當我們只是簡單的提示的時候,只需要復寫JTable的getToolTipText和setToolTipText方法就可以了,上個例子就是這樣;但是當我們需要使我們的ToolTip提示不像Sun提供的那么單調,我們就需要自己來實現了.
這時候的重點已經不在JTable上了,而在于ToolTip上面,我們可以把我們需要呈現的ToolTip實現為一個JPanel,這樣就可以在它的上面放置各種組件了,設置放圖標都可以,這個時候就需要實現這個ToolTip的UI和Manager,這方面有很多開源的實現,以后有時間的話開個專題專門來介紹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();
}
}
}
最后效果如圖:
到此為止,所有關于JTable的ToolTip提示就完成了,當然我實現的都是一些基本的效果,比較復雜的效果,則需要你自己去繪制和實現ToolTip了,說句簡單的,技術完成了,以后就是玩色彩和審美了,做程序也就這樣了,很多時候后者重要.