2013-01-15 27 views
5

Próbuję zrozumieć, kiedy użyć revalidate/repaint/pack.Cykl odświeżania Swing

Zaskakująco nie znalazłem zbyt szczegółowej dokumentacji pod maską (nie krępuj się linkować).

Do tej pory zrozumiałem, że to wszystko leży w gestii aplikacji RepaintManager.

  • farba/przemalować odnoszą się do tego, co uważa za brudne/czyste
  • paczka/potwierdzić/revalidate odnoszą się do tego, co jest ważne

This article on Oracle wyjaśnia, że ​​wywołanie repaint kolejkuje pracę na temat Event Dispatcher to z kolei wywoła paintImmediately() na komponencie (to przerysuje komponent).

This trail wskazuje, że być lub nie być ważne, jest powiązane z menedżerem układu LayoutManager. I to wszystko dotyczy rozmiaru komponentu, a nie treści.

  1. Czy to prawda, że ​​powinieneś wywoływać revalidate po przeniesieniu/zmianie rozmiaru komponentu i przemalowaniu, gdy zmienisz jego zawartość?
  2. Czy metoda pack() jest rzeczywiście przestarzałą rzeczą, której nigdy nie należy wywoływać?
  3. Czy któreś z powyższych twierdzeń jest błędne?

Odpowiedz

6

Oto kilka podstawowych przypadków, w których należy wywołać te metody (omówię podstawy, ale mogłem pominąć kilka innych przypadków, w których wymagane byłoby wywołanie tych metod).

  1. Należy zadzwonić revalidate() na pojemniku, gdy masz albo: dodaje jeden lub więcej składników, usunięty jeden lub więcej składników, zmienił ograniczeń z jednego lub więcej zawierał składników (ograniczeń lub XXXSize(), choć ten ostatni jest niezalecane), zmieniono kontener LayoutManager.
  2. Powinieneś zadzwonić pod numer repaint(), kiedy chcesz, aby ten składnik (i jego potomkowie) został przemalowany. Ostatecznie będzie to nazwać paintComponent() (podstawowych widgetów będzie przekazywać XXXUI.paint()), paintBorder() i paintChildren() (przynajmniej w Swing)
  3. pack() faktycznie ustawia rozmiar okna do preferowanego rozmiaru. Powinieneś zazwyczaj wywołać to prawo, zanim okno stanie się widoczne. Można nazwać to później, ale da to dziwne doświadczenie użytkownika (nie wiem, wiele aplikacji, które zmienić rozmiar okien raz wyświetlany)

Główną zaletą korzystania revalidate() i repaint(), że mogą one łączyć się. Oznacza to, że jeśli zadzwonisz kilka razy pod numer repaint(), obraz zostanie wykonany tylko raz.

+0

Czy można zdefiniować farbę pod kątem zmian, które ona powoduje? Zaczynam wątpić, że całkowicie rozumiem, co to znaczy. – kotoko

+1

@kotoko Nie jestem pewien, czy otrzymuję odpowiedź, której szukasz (komentarz). Podczas malowania (implementacja metody 'paintComponent()' oznacza to, że rysujesz linie, okręgi (wypełnione lub nie), prostokąty (wypełnione lub nie), obrazy, tekst itp. (Wszystkie operacje, które możesz wykonać) faktycznie wywołują na 'Graphics/Graphics2D'). –

+0

Próbowałem zrozumieć, jakie metody wywołały co.Teraz mam to (zasada): działanie układu/komponentu wpływa, jeśli jest prawidłowe (twoje 1.); Operacje grafiki/grafiki2D wpływają na brudne. – kotoko