Jak przekazać informację o zakończeniu wątku do SwingWorker podczas zamknięcia okna

0

Cześć,

Mam takie drzewko:

JInternalFrame

  • JPanel
    • JPanel
      • JTable
        • JTableModel (SwingWorker)

W jaki sposób przekazać do SwingWorker informację z:

@Override
public void internalFrameClosing(InternalFrameEvent e) {
}

aby zakończył swoje działanie?

0

Na SwingWorkerze wywołaj metodę cancel, a w środku SwingWorkera, tzn w funkcji doInBackground cyklicznie sprawdzaj wartość isCancelled i jeśli będzie true to wyjdź z tej funkcji (co kończy działanie SwingWorkera).

0
Wibowit napisał(a):

Na SwingWorkerze wywołaj metodę cancel, a w środku SwingWorkera, tzn w funkcji doInBackground cyklicznie sprawdzaj wartość isCancelled i jeśli będzie true to wyjdź z tej funkcji (co kończy działanie SwingWorkera).

Dzięki za zainteresowanie, ale pytanie nie dotyczyło sposobu zakończenia działania Workera.

0

Przecież Ci Wibowit napisał - chciałeś, żeby klasa wywodząca się ze SwingWorkera zakończyła działanie - cancel jest najlepszą informacją dla SwingWorkera ponieważ isCancelled jest już wewnętrznie obsługiwany (i synchronizowany) przez tę klasę. Jeżeli natomiast chcesz przekazać cokolwiek co zmieni działanie SwingWorkera (i w wyniku tego zakończy on pracę), to musisz normalnie dołożyć w nim jakąś metodę i pole ręcznie synchronizowane tak jak w przypadku każdej innej klasy dostępnej z wielu wątków. Tym razem jednak to ty musisz dopilnować czy synchronizacja jest prawidłowa (sądzisz, że zrobisz to lepiej?). Jeżeli masz problem z tym, że obiekt SwingWorkera nie jest widoczny dla metody internalFrameClosing, to musisz jego referencję zapisać w jakimś polu dostępnym dla niej lub poprzez jakąś inną metodę, którą może ta pierwsza wywołać.

0

Jeżeli masz problem z tym, że obiekt SwingWorkera nie jest widoczny dla metody internalFrameClosing

Chyba własnie o to chodzi. Można zrobić jakiegoś beana dodatkowego z PropertyChangeSupport w środku i przekazać go do SwingWorkera i JFrame. Dzięki PropertyChangeSupport można się zapiąć łatwo listenerem na beanie. Bean oczywiście zawierałby pole typu np boolean on nazwie shouldClose.

0
Wibowit napisał(a):

Jeżeli masz problem z tym, że obiekt SwingWorkera nie jest widoczny dla metody internalFrameClosing

Chyba własnie o to chodzi. Można zrobić jakiegoś beana dodatkowego z PropertyChangeSupport w środku i przekazać go do SwingWorkera i JFrame. Dzięki PropertyChangeSupport można się zapiąć łatwo listenerem na beanie. Bean oczywiście zawierałby pole typu np boolean on nazwie shouldClose.

Właśnie o taką odpowiedź mi chodziło. Czyli zostanę chyba przy wzorcu obserwator. Myślałem, że Swing udostępnia "magiczne" metody informowania. Dzięki.

@Olamagato: Poza ostatnim zdaniem reszta nie na temat.

0

Swing nie ma wbudowanych żadnych metod informowania o zmianach w komponentach. Za to JavaFX 2+ ma wbudowany nawet fajny system różnego rodzaju Property i Bindingów.

Możesz zajrzeć jak ja użyłem beanów w swojej aplikacji. Klasy ActionBean i OptionsBean na https://github.com/tarsa/TarsaLZP/tree/master/java/TarsaLZP/src/com/github/tarsa/tarsalzp/gui Do obsługi beanów użyłem wbudowanej w NetBeansa (chyba) biblioteki BeansBinding: https://github.com/tarsa/TarsaLZP/tree/master/java/TarsaLZP/lib/beans-binding
Niestety na razie nie ma nigdzie przerywania działania SwingWorkera przez zmianę beana (czyli to o co ci chodzi), ale w sumie to byłby dobry pomysł na ulepszenie programu, tzn możliwość przerwania (de)kompresji (bo mój program do tego akurat służy).

0

Przejrzę to, bo na razie posiłkowałem się takim rozwiązaniem:

Jest niby manager SwingWorkerów (SW) i tak:

  • przy tworzeniu okna tworzony jest klucz K w mapie z identyfikatorem okna
  • przy tworzeniu nowego SW dodawana jest referencja do mapy dla klucza K (poprzez rekurencyjne przeszukanie przodka, aż do okna)
  • po zakończeniu SW usuwam wpis z mapy
  • przy zamknięciu okna kończę wszystkie SW dla zadanego klucza

jednak jest to mało uniwersalne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1