2012-05-04 106 views
0

我有一個包含JPanel的列的表。我寫了自定義渲染器和編輯器,他們工作得很好。但是,該面板包含帶有工具提示的JLabel組件。如果我點擊單元格並將鼠標懸停在標籤上,則會顯示工具提示,但是如果將鼠標移動到單元格並將鼠標懸停在JLabel上,工具提示將不會顯示。我已經添加了一個鼠標監聽器,如下所示,我得到Panel對象並嘗試使其具有焦點。JTable中的JPanel獲取焦點在鼠標單擊上,但不在鼠標上

public void mouseMoved(MouseEvent e) { 
    Point p = e.getPoint(); 
    int row = table.rowAtPoint(p); 
    int column = table.columnAtPoint(p); 
    System.out.println(row + " " + column); 
    Object o = table.getModel().getValueAt(row, column); 
    if (o instanceof FileInfoCellPanel) { 
     FileInfoCellPanel ficp = (FileInfoCellPanel)o; 
     ficp.requestFocusInWindow(); 
     //ficp.revalidate(); 
    } 
} 

我絕對得到正確的JPanel對象,但它似乎從來沒有得到重點。所以單擊單元格似乎將焦點放在面板上,但移動鼠標不會。

回答

2

如果您只想在工具提示中顯示文本,只需在渲染器返回的組件上設置工具提示即可。這可以,如果你看一下JTable#getTooltipText方法,我複製下面

的實施可以看出
public String getToolTipText(MouseEvent event) { 
    String tip = null; 
    Point p = event.getPoint(); 

    // Locate the renderer under the event location 
    int hitColumnIndex = columnAtPoint(p); 
    int hitRowIndex = rowAtPoint(p); 

    if ((hitColumnIndex != -1) && (hitRowIndex != -1)) { 
     TableCellRenderer renderer = getCellRenderer(hitRowIndex, hitColumnIndex); 
     Component component = prepareRenderer(renderer, hitRowIndex, hitColumnIndex); 

     // Now have to see if the component is a JComponent before 
     // getting the tip 
     if (component instanceof JComponent) { 
      // Convert the event to the renderer's coordinate system 
      Rectangle cellRect = getCellRect(hitRowIndex, hitColumnIndex, false); 
      p.translate(-cellRect.x, -cellRect.y); 
      MouseEvent newEvent = new MouseEvent(component, event.getID(), 
             event.getWhen(), event.getModifiers(), 
             p.x, p.y, 
             event.getXOnScreen(), 
             event.getYOnScreen(), 
             event.getClickCount(), 
             event.isPopupTrigger(), 
             MouseEvent.NOBUTTON); 

      tip = ((JComponent)component).getToolTipText(newEvent); 
     } 
    } 

    // No tip from the renderer get our own tip 
    if (tip == null) 
     tip = getToolTipText(); 

    return tip; 
} 

可以看出,以確定提示文本的渲染器要求的部件,該部件被要求它的工具提示文本。當然,這隻適用於文本而不適用於例如圖片

+0

謝謝。投票表決,我的答案被刪除。 –