2010-02-03 10 views
6

Muszę pokazać etykietkę powyżej (lub poniżej :) komórkę, gdy użytkownik wprowadzi w niej błędną wartość (patrz obrazek poniżej). Mam etykietkę narzędzia, ale potrzebuję punktu, aby wyświetlić go we właściwej pozycji, więc chcę uzyskać pozycję komórki. Czy wiesz, jak to uzyskać?Pokaż etykietę narzędzia nad komórką w JTable

ALE, jeśli masz lepsze rozwiązanie, aby zrealizować to zachowanie, jestem otwarty na każdą propozycję (szczególnie, że etykieta narzędzia nie jest powiązana z komórką/Jtable/Panel i jeśli poruszam/zamykam/minmize moje okno tooltip jest wyświetlacz w tej samej pozycji)

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

Dzięki Damien

Odpowiedz

1

Spróbuj getCellRect

+0

Tak! Wygląda na to, że to może odpowiedzieć na mój problem, dziękuję :) Czy znasz rozwiązanie, w którym podpowiedź jest linkiem do komórki? – Damien

2

masz an example of such feature ja w wizualnym przewodniku komponentów Swing.

Edycja: W rzeczywistości nie jest to naprawdę etykieta narzędziowa, której potrzebujesz, ponieważ etykieta musi mieć kursor umieszczony nad komórką. Chcesz wyświetlić podpowiedź, nawet jeśli kursor znajduje się poza komórką, prawda?

W każdym razie alternatywnym rozwiązaniem jest zmiana tła komórki, gdy wartość wprowadzona przez użytkownika jest niepoprawna (na przykład w kolorze pomarańczowym lub czerwonym), a następnie dodanie "prawdziwej" etykiety narzędzi (za pomocą podanego linku) aby dać użytkownikowi kompletny komunikat o błędzie.

+0

Tak, to nie jest "prawdziwa" podpowiedź. Twoje obejście może być w porządku. W jaki sposób mogę wyświetlić (real) etykietkę narzędziową, gdy użytkownik wprowadza wartość? (Jestem w metodzie setValueAt()) – Damien

6

Patrz poniżej fragment kodu, a dostaniesz rozwiązanie

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; 
    } 
}; 

Jeśli chcesz tylko pokazać konkretną komórkę, wszystko co musisz zrobić, to zmienić param kolumna w params z getValueAt (... metoda) do określonej kolumnie zawierającej że komórka

+0

To nie działa, jeśli używasz RowSorter, ponieważ komponenty nie zmieniają kolejności, ale dane modelu będą. –

+0

Naprawdę mi się udało (bez RowSorter) – ricgeorge

0

użyj następującego kodu, aby uzyskać wartość dla prawidłowego wiersza w przypadku korzystania RowSorter:

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

no - a) ustawienie tej samej etykiety dla wszystkich komórek b) nie rozwiązuje części _above_ – kleopatra

2

Wystarczy użyć kodu poniżej podczas cr ekcja obiektu 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; 
      } 
     }; 
Powiązane problemy