3 votes

Info-bulle dans JPanel dans JTable ne fonctionne pas

J'ai un JTable. Une colonne contient un JPanel qui contient quelques JLabels avec des ImageIcons. J'ai créé un rendu de cellule personnalisé et tout fonctionne bien sauf l'info-bulle sur le JLabel. Lorsque je survole l'un de ces JLabels, je dois afficher l'info-bulle de ce JLabel particulier. Il ne montre pas l'info-bulle du JLabel.

Voici le 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 iconList = (List) 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;
        }
    }

12voto

Guillaume Polet Points 31933

Le problème est que vous définissez des info-bulles sur les sous-composants du composant retourné par votre CellRenderer. Pour réaliser ce que vous voulez, vous devriez envisager de remplacer la méthode getToolTipText(MouseEvent e) sur le JTable. À partir de l'événement, vous pouvez trouver sur quelle ligne et quelle colonne la souris se trouve, en utilisant :

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

Ensuite, vous pourriez re-préparer le rendu de la cellule, trouver quel composant se trouve à la position de la souris et éventuellement récupérer son info-bulle.

Voici un extrait de comment vous pourriez remplacer la méthode getToolTipText de JTable :

@Override
public String getToolTipText(MouseEvent event) {
    String tip = null;
    Point p = event.getPoint();

    // Localiser le rendu sous l'emplacement de l'événement
    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();
        }
    }

    // Aucune info-bulle du rendu, obtenir notre propre info-bulle
    if (tip == null) {
        tip = getToolTipText();
    }

    return tip;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X