2012-06-01 2 views
2

У меня есть JTable. В одной колонке содержится JPanel, которая содержит JLabels с ImageIcons. Я создал пользовательский рендеринг ящиков, и все работает отлично от наконечника инструмента на JLabel. Когда я нахожусь над любым из этих JLabels, мне нужно показать Tooltip этого конкретного JLabel. Он не показывает изоляцию от JLabel.Инструмент в JPanel в JTable не работает

Адрес CustomRenderer.

private class CustomRenderer extends 
      DefaultTableCellRenderer implements TableCellRenderer { 

     @Override 
     public Component getTableCellRendererComponent(JTable table, 
      Object value, boolean isSelected, boolean hasFocus, int row, 
       int column) { 

      if (value != null && value instanceof List) { 

       JPanel iconsPanel = new JPanel(new GridBagLayout()); 
       List<ImageIcon> iconList = (List<ImageIcon>) value; 
       int xPos = 0; 
       for (ImageIcon icon : iconList) { 
        JLabel iconLabel = new JLabel(icon); 
        iconLabel.setToolTipText(icon.getDescription()); 
        GridBagConstraints gbc = new GridBagConstraints(); 
        gbc.gridy = 1; 
        gbc.gridx = xPos++; 
        iconsPanel.add(iconLabel, gbc); 
       } 
       iconsPanel.setBackground(isSelected ? table 
         .getSelectionBackground() : table.getBackground()); 
       this.setVerticalAlignment(CENTER); 
       return iconsPanel; 
      } 
      return this; 
     } 
    } 
+1

Пожалуйста, пост код из части в вопросе. –

+0

[Для лучшей помощи, скорее всего, включите sscce] (http://www.sscce.org/). – user1329572

+1

Он не показывает всплывающую подсказку, потому что там нет реального компонента. JTable работает с рендерером - все, что вы получаете, это paintComponent() компонента, возвращаемого средством отображения ячеек таблицы. – ControlAltDel

ответ

9

Проблема в том, что вы устанавливаете всплывающие подсказки для подкомпонентов компонента, возвращаемого вашим CellRenderer. Чтобы выполнить то, что вы хотите, вы должны рассмотреть переопределить getToolTipText(MouseEvent e) на JTable. В случае, вы можете найти на какую строку и столбец мышь, используя:

java.awt.Point p = e.getPoint(); 
int rowIndex = rowAtPoint(p); 
int colIndex = columnAtPoint(p); 

Оттуда вы могли бы затем повторно подготовить визуализации клеток, найти какой компонент находятся в положении мышей и в конечном итоге получить его подсказка.

Вот фрагмент того, как вы могли бы переопределить JTable getToolTipText:

@Override 
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); 
     Rectangle cellRect = getCellRect(hitRowIndex, hitColumnIndex, false); 
     component.setBounds(cellRect); 
     component.validate(); 
     component.doLayout(); 
     p.translate(-cellRect.x, -cellRect.y); 
     Component comp = component.getComponentAt(p); 
     if (comp instanceof JComponent) { 
      return ((JComponent) comp).getToolTipText(); 
     } 
    } 

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

    return tip; 
} 
+0

Благодарим вас за ответ. Если я установил всплывающую подсказку JPanel в свой код, он будет работать правильно. Но здесь необходимо отобразить всплывающие подсказки для каждого JLabel внутри JPanel (JPanel добавляется в один конкретный столбец в JTable). – user1430989

+0

@ user1430989 пожалуйста, что случилось с примером из [Sn'Oracle JTable tutorial] (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial /uiswing/examples/components/TableToolTipsDemoProject/src/components/TableToolTipsDemo.java) – mKorbel

+0

@ user1430989 Я отправил версию JTable.getToolTipText, которая должна работать с вашим кодом. –

Смежные вопросы