tag Archives: Swing

Naprawianie starych błędów, czyli wątek o Swingu

Jeśli nie wiesz, czym dokładnie jest Event Dispatch Thread polecam artykuł Threads and Swing. Daje on niejakie pojęcie o tym co, gdzie, jak i dlaczego działa w Swing‘u tak, a nie inaczej.

Jeśli wiesz już o co chodzi z EDT i rozumiesz, jakie problemy może powodować zmienianie GUI z poziomu wątku innego niż EDT, możesz chcieć zapoznać się z opisem projektu swinghelper opublikowanego na łamach serwisu java.net, a w szczególności z działem Debugging and testing.

Jak zamknąć JFrame z potwierdzeniem?

Przeglądając wyniki wujka Google związane z Javą, natknąłem się kilka razy na mniej lub bardziej udane przykłady kodu wyświetlającego okno, które w momencie zamykania wyświetla dialog z zapytaniem, czy użytkownik jest pewien, że chce je zamknąć. Postanowiłem samemu przygotować podobny przykład, który przy okazji uzasadni moje podejście do mechanizmu zamykania okien przedstawione we wpisie Zamykanie okien poprzez wciśnięcie przycisku Escape.

Prawidłowe zamykanie okien w Swing'u

Bawiąc się Swingiem od samego początku wydawało mi się, że aby prawidłowo zamknąć okno, wystarczy w akcji przycisku Zamknij wywołać:

1
2
3
private void closelButtonActionPerformed(java.awt.event.ActionEvent evt) {
    this.dispose();
}

Okazuje się jednak, że niekoniecznie jest to prawidłowe podejście, ponieważ jeśli wywołamy bezpośrednio dispose(), to nie zostaną poinformowane listenery okna oczekujące na zdarzenie zamykania okna. Co za tym idzie, zachowanie aplikacji będzie inne, niż w przypadku wciśnięcia przycisku X zamykającego okno. Zazwyczaj jednak chcemy zachować spójność działania aplikacji i obsługi zdarzeń.

Jak wykonywać długotrwałe zadania w Swing'u

Odkąd zacząłem pisać w Javie bardziej złożone aplikacje, które musiały na przykład komunikować się z jakimiś webowymi usługami lub wykonywać dłuższe obliczenia, miewałem problemy z zamarzającym GUI. Próbowałem problem ten rozwiązać na wiele sposobów, jednak zawsze znalazło się coś, co nie działało tak jak powinno - jak chociażby labele lub pola tekstowe, które powinny wyświetlać informacje o postępie zadania, a przez cały czas aż do zakończenia zadania pozostawały niezmienione.