Trudności ze zrozumieniem mechanizmu rendererów JTable i JTree swing

Często podczas używaniaJTable lubJTree użytkownik zapisuje i przypisuje go do własnego specyficznego mechanizmu renderującego komórki.

Bardzo często dziedziczy się komponent użytkownikaDefaultTableCellRendereri implementuje metodę renderergetTableCellRendererComponent. Okazało się, żeDefaultTableCellRenderer w rzeczywistości dziedziczy z JLabel, dlatego zwraca siebie (to), gdy jest wywoływany do super (w metodzie renderowania), a zatem renderer użytkownika może podobnie zwracać siebie (to).

I wszystko działa dobrze.

Moje pytanie brzmi: jak to możliwe?

Za każdym razem, gdy ta metoda jest wywoływana przez tabelę, otrzymuje ona różne parametry, a etykieta wyjściowa jest zmieniana jako funkcja tych parametrów. Jeśli rzeczywiście jest to ta sama instancja etykiety - czy nie należy jej zmieniać zgodnie z ostatnim wywołaniem tej metody? Czy nie oznacza to, że wszystkie komórki tabeli są zainfekowane, składające się z tej samej instancji etykiety, która ma tę samą wartość (wartość ostatniego wywołania metody renderującej)?

Przeszukałem sieć i wykopałem kod Swinga i nie mogłem znaleźć żadnego aktuklon lubkonstruktor kopii który faktycznie duplikuje etykietę wyjściową. Nie mogłem znaleźć żadnego dowodu na to, że (być może) swing używa refleksji, aby za każdym razem ponownie tworzyć instancję renderera.

Przeczytałem Swingasamouczek na temat JTablesi tam mogłem znaleźć następne wiersze:

Możesz oczekiwać, że każda komórka w tabeli będzie składnikiem. Jednak ze względu na wydajność tabele Swing są implementowane inaczej. Zamiast tego mechanizm renderujący pojedynczej komórki jest zwykle używany do rysowania wszystkich komórek zawierających ten sam typ danych. Renderer można traktować jako konfigurowalny stempel atramentowy używany przez tabelę do stemplowania odpowiednio sformatowanych danych na każdej komórce. Gdy użytkownik zaczyna edytować dane komórki, edytor komórek przejmuje komórkę, kontrolując zachowanie edycji komórki.

Dają podpowiedź, że rzeczywiście to, co mówię, jest poprawne, ale nie wyjaśniaj, w jaki sposób faktycznie się dokonuje.

Nie mogę tego zdobyć. Czy któryś z was może?

questionAnswers(3)

yourAnswerToTheQuestion