2009-09-15 2 views

Odpowiedz

1

Przesłonięcie paint(Graphics), aby nic nie zrobić, jeśli ustawiona jest flaga, uniemożliwi malowanie; możesz również dodać własne podwójne buforowanie, przesłonięcie, aby narysować obraz.

Możesz włączyć podwójne buforowanie dla każdego składnika JComponent przy użyciu metody setDoubleBuffered(boolean) tego komponentu, nie musisz robić nic więcej, jeśli to wszystko, czego potrzebujesz.


Nawet jeśli wyłączysz malowanie na najwyższym poziomie komponentu nadrzędnymi farbę, nie zatrzyma komponenty dziecko od malowania, jeśli są one odbierania zdarzeń; można zastąpić zawartość ramki statycznym obrazem (utworzonym na podstawie wywołania farby z grafiką ze zbuforowanego obrazu).

+0

lepiej jest zastąpić metodę paintComponent(). A jeśli po prostu wrócisz z paintComponent(), czy zachowa poprzedni obraz lub po prostu zostawisz śmieci? –

+0

Nie zawsze. paint wywołuje paintComponent() i paintChildren() przekazując grafikę dla bufora poza ekranem, jeśli włączone jest podwójne buforowanie. Jeśli chcesz zmienić sposób, w jaki komponent maluje się bez zmiany zachowania dzieci, obramowań lub podwójnego buforowania, lepiej jest przesłonić funkcję paintComponent(), ale nie o to tu pytamy. –

3

Również w przypadku w przypadku, gdy powód, dla którego to robisz, polega na tym, że robisz kilka aktualizacji GUI komponentów i martwisz się o wszystkie te automatycznie wysłane repliki(), nie rób tego. repaint() nie maluje od razu, wysyła odłożone odświeżone zdarzenie do kolejki zdarzeń AWT, która będzie koegzystować wiele powtórzeń dla danego regionu, aby uniknąć powtarzania tego samego obrazu.

+0

Naszym problemem jest to, że wysyłamy wystarczającą ilość tych zdarzeń, aby przenosić wątek zdarzenia do punktu, w którym interfejs użytkownika przestaje reagować na dane wprowadzone przez użytkownika. Jedyne rozwiązanie, jakie znaleźliśmy, to przespać się między niektórymi aktualizacjami, aby interakcja z użytkownikiem mogła się wcisnąć, ale płacimy za to. Próbuję sprawdzić, czy w jakiś sposób zamarzanie i odmrażanie może trochę przyspieszyć. – Uri

+0

Czy te aktualizacje są odpowiedzią na zdarzenia użytkownika (EDT), czy na zdarzenia niezobowiązujące (np. Wątek tła)? –

+1

Czy można zawęzić informację, czy przetwarzanie danych pojawia się w EDT, czy w rzeczywistym malowaniu, które zabiera czas? – CarlG

Powiązane problemy