2012-05-04 67 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

谢谢。投票表决,我的答案被删除。 –