2010-02-03 3 views
6

Je dois afficher une info-bulle au-dessus (ou en dessous :) d'une cellule lorsque l'utilisateur entre une valeur erronée (voir l'image ci-dessous). J'ai une info-bulle, mais j'ai besoin d'un point pour l'afficher à la bonne position, donc je veux obtenir une position de cellule. Savez-vous comment l'obtenir? MAIS, si vous avez une meilleure solution pour réaliser ce comportement, je suis ouvert à toute proposition (en particulier pour le fait que l'info-bulle n'est pas liée à la cellule/Jtable/Panel et si je bouge/ferme/minimise ma fenêtre l'info-bulle est affichage à la même position)Afficher une info-bulle au-dessus d'une cellule dans une JTable

alt text http://img246.imageshack.us/img246/6756/errorpopup.png

Merci, Damien

Répondre

1

Essayez getCellRect

+0

Ouais! Il semble que cela puisse répondre à mon problème, merci :) Connaissez-vous une solution où l'info-bulle est liée à la cellule? – Damien

2

Vous avez an example of such feature i n le guide visuel des composants Swing.

Editer: En fait, ce n'est pas vraiment une info-bulle dont vous avez besoin ici, car l'infobulle doit placer le curseur sur la cellule. Vous voulez afficher l'info-bulle même si le curseur est en dehors de la cellule, n'est-ce pas? Quoi qu'il en soit, une solution alternative consiste à changer l'arrière-plan de la cellule lorsque la valeur entrée par l'utilisateur est invalide (en orange ou rouge par exemple), puis ajouter une "vraie" info-bulle (en utilisant le lien fourni) afin de donner à l'utilisateur un message d'erreur complet.

+0

Oui, ce n'est pas une "vraie" info-bulle. Votre solution de contournement pourrait bien fonctionner. Comment pouvez-vous afficher une info-bulle (réelle) lorsque l'utilisateur saisit une valeur? (Je suis dans la méthode setValueAt()) – Damien

6

S'il vous plaît faites référence ci-dessous l'extrait de code, et vous obtiendrez la solution

JTable table = new JTable() { 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
     Component c = super.prepareRenderer(renderer, row, column); 
     if (c instanceof JComponent) { 
      JComponent jc = (JComponent) c; 
      jc.setToolTipText(getValueAt(row, column).toString()); 
     } 
     return c; 
    } 
}; 

Si vous voulez afficher uniquement la cellule spécifique, tout ce que vous avez à faire est de changer la colonne param dans les params de getValueAt (...) la méthode à une colonne spécifique qui contient cette cellule

+0

Cela ne fonctionne pas si vous utilisez RowSorter, car les composants ne changeront pas d'ordre, mais les données du modèle le seront. –

+0

A fonctionné vraiment bien pour moi (sans RowSorter) – ricgeorge

0

utilisez le code suivant pour obtenir la valeur de la ligne correcte si vous utilisez RowSorter:

jc.setToolTipText(getValueAt(convertRowIndexToModel(row), column).toString()); 
+2

non - a) qui définit la même tooltip pour toutes les cellules b) ne résout pas la partie _above_ – kleopatra

2

utiliser juste en dessous du code tout en cr l'intention de l'objet JTable.

JTable auditTable = new JTable(){ 

      //Implement table cell tool tips.   
      public String getToolTipText(MouseEvent e) { 
       String tip = null; 
       java.awt.Point p = e.getPoint(); 
       int rowIndex = rowAtPoint(p); 
       int colIndex = columnAtPoint(p); 

       try { 
        //comment row, exclude heading 
        if(rowIndex != 0){ 
         tip = getValueAt(rowIndex, colIndex).toString(); 
        } 
       } catch (RuntimeException e1) { 
        //catch null pointer exception if mouse is over an empty line 
       } 

       return tip; 
      } 
     };