2012-03-20 10 views
23

Nie mogę znaleźć żadnej oficjalnej dokumentacji mówiącej, że można bezpiecznie zadzwonić pod numer Component.repaint z innego wątku niż wątku wysyłki zdarzeń, EDT.Bezpieczne korzystanie z Component.repaint() poza EDT?

Czy to prawda? Gdzie mogę znaleźć dokumentację/kod?

+0

dobre pytanie +1, moje poglądy helikopter :-) -> 'a)' wszystko działa aż repaint () nie jest zablokowany przez Thread.sleep (int), 'b)' istniało kilka tematów dotyczących isEventDispatchThread(), ale te linie są tracone na splądrowanym Java.Net 'c)' uzgodnionym z API dla AWT Components i dla ich zagnieżdżone klasy w Swingu – mKorbel

Odpowiedz

25

Oto quote from an official page stwierdzając, że:

Następujące metody są bezpieczne JComponent zadzwonić z dowolnego wątku:repaint(), revalidate(), i invalidate(). Zdania kolejki metod dla i wywołują zdarzenia, aby wywoływać odpowiednio numery paint() i validate().

EDIT 1:


Ponieważ poprzednie ogniwo wymienione zostały przesunięte. Publikuję numer new link, ale może to zająć trochę więcej czasu, aby rzeczywiście poznać autentyczność tej strony, ponieważ wygląda na to, że pochodzi z serwera , ale pochodzi z serwera University, co można zobaczyć na pasku adresu.

7

Jest bezpieczny dla wątków. RepaintManager zapewnia, że ​​takie połączenia są umieszczane w wątku wysyłania zdarzeń.

Painting in AWT and Swing ("official" documentation)

Celem Swing za RepaintManager klasie jest maksymalizacja efektywności przetwarzania przemalować na hierarchii Swing szczelność i również do wdrożenia „rewalidacja” Mechanizm obrotu jest (ten ostatni będzie przedmiotem dla oddzielnego artykułu). Implementuje mechanizm odmalowywania przechwytując wszystkie żądania odświeżania na komponentach Swing (aby nie były one już przetwarzane przez AWT) i zachowując swój własny stan, który musi zostać zaktualizowany (znany jako "brudne regiony"). Wreszcie, używa on invokeLater() do przetworzenia oczekujących żądań dotyczących zdarzenia wysyłającego wątku, zgodnie z opisem w sekcji "Odświeżanie Przetwarzanie" (opcja B).

W przypadku większości programów, RepaintManager może być wyświetlany jako część wewnętrznego systemu Swinga i może być praktycznie zignorowany. Jednak jego interfejs API zapewnia programom możliwość uzyskania lepszej kontroli nad niektórymi aspektami malowania w zakresie .

+1

Dziękuję za ten wspaniały obraz Doc, potrzebowałem tego tak długo :-), po prostu nie mogłem go znaleźć. Wygląda na to, że czekałem, aż się odezwiesz :-) –

+2

@GagandeepBali: Ja też na tym polegam. Jednym z wygodnych sposobów na znalezienie go jest interfejs API ['Component'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html). – trashgod

3

o doświadczeniach na tym forum

(+1 dla obu Główni odpowiadający), ale myślę, że nie jest możliwe, aby odpowiadając na pytanie poprawnie, część metod Graphics(2D) wymagane wezwanie do repaint() programowo, reszta wdrożenie tej metody (w API) bezpośrednio (na pewno niektóre z nich brakuje tej metody w API)

dla części Swing JComponents jest może lepiej dis-zgadzają, to forum jest pełne pytań o Concurency in Swing, począwszy Graphics(2D) myślał JTextComponents, JTree i kończy się (Tak samo jest zadeklarowana jako bezpieczne dla wątków) z setText(),

o Concurency in Swing czy istnieją znaczące liczby pytań

+1

ehhh ........? Odpowiedź na to pytanie brzmi jasno TAK - nie ma potrzeby mącenia wód przez potencjalnie niewłaściwie działający niezwiązany kod – kleopatra

+0

Popieram zdrowy sceptycyzm mKorbela: 1) APIs mogą [zmień] (http://stackoverflow.com/a/3245805/230513), chociaż prawdopodobnie nie "repaint()". 2) Podczas gdy 'repaint()' sam jest bezpieczny dla wątków, zwykle wywołuje się go po zaktualizowaniu komponentu, który nie jest bezpieczny dla wątków. – trashgod

+0

@trahgod dzięki za tłumaczenie :-) Chociaż mam tendencję do nie zgodzić się trochę: a) nie było żadnych zmian, ale poprawka błędu dokumentu (prawdopodobnie to samo, to była długa historia) b) jeśli tak, to kod _before_ calling repaint jest zły, a nie odświeżanie się – kleopatra

Powiązane problemy