2011-01-21 9 views
6

Nie mogę wymusić układ w Swing. Mam JComponent dodany do JLayeredPane i ustawiam granicę na JComponent. Następnie chcę natychmiast ponownie rysować wszystko - nie w sensie "proszę to tak szybko" jak invalidate(), ale synchronicznie i natychmiastowo. Jakaś pomoc? Nie mogę znaleźć odpowiedniej metody, aby to zrobić, a całe moje czytanie o invalidate(), validate(), repaint(), doLayout(), etc po prostu wprowadza mnie w błąd!Wymuś natychmiastowy układ i pomaluj w Swing

Odpowiedz

0

Najbardziej niezawodnym sposobem, aby Swing zaktualizował wyświetlacz, jest użycie SwingUtilities.invokeLater. W twoim przypadku, to będzie wyglądać mniej więcej tak

SwingUtilities.invokeLater(new Runnable { 
          public void run() { 
           somecomponent.repaint(); 
          } 
          }); 

ja sobie sprawy „invokelater” nie dokładnie brzmi jak robi coś natychmiastowe, ale w praktyce, imprezy pisał w ten sposób tendencję wykonać dość szybko w porównaniu do zaledwie nazywając np somecomponent.repaint() bezpośrednio. Jeśli bezwzględnie musisz sprawić, by kod sterujący czekał na aktualizację GUI, to jest też invokeAndWait, ale moje doświadczenie jest takie, że rzadko jest to konieczne.

Zobacz także: document on event dispatch w Swing.

+0

Niestety, żadna z nich nie zadziała na moją impl:/Potrzebuję aktualizacji GUI natychmiast, a nie po przetworzeniu oczekujących zdarzeń. To ze względu na wadę w moim projekcie, że potrzebuję tego w ten sposób, ale niestety zmiana spowodowałaby mnie z powrotem prawie dwa tygodnie i mam jutro dostawa:/ – Hamy

+0

OK spróbuj tego: użyj invokeAndWait, następnie wewnątrz wywoływanego wywołania paintImmediately na zewnętrzny pojemnik. Myślę, że jest to tak blisko, jak można uzyskać za pomocą Swing - będzie to nadpisać poprzednie połączenia do "odświeżenia", jeśli się nie mylę. – phooji

+0

Niestety to też nie działa. Aby wywołać invokeAndWait, musisz odrodzić nowy wątek. Mam * bardzo * powolne zdarzenie zdarzające się zaraz po tym obrazie, i zaczyna się wykonywanie przed uruchomieniem, co skutkuje zamrożeniem interfejsu graficznego bez wykonania tej funkcji malowania. – Hamy

2

Zgodnie z this (patrz rozdział "Malowanie synchroniczne") powinna działać metoda paintImmediately().

+1

Próbowałem tego - myComponent.paintImmediately (myComponent.getBounds). Bez powodzenia :(Myślę, że może tak być dlatego, że zmiana granicy wymaga nowego przejścia układu z powodu granicy z użyciem dodatkowych pikseli po każdej stronie obiektu. – Hamy

+0

paint Natychmiast może to być droga, ale nadal musisz opublikować ją jako zdarzenie using invokeLater lub invokeAndWait, myślę. – phooji

+0

@Hamy Czy próbowałeś wywoływanie go na składnik nadrzędny, który może pozwolić na zmianę układu – Jonathan