Dlhotrvajúce akcie v onMouseXYZ

Na obslúženie myšacích udalostí a udalosti stlačenia klávesov využíva JPAZ2 framework mechanizmus prekrytia onMouseXYZ a onKeyXYZ metód triedy Pane. Z dôvodu efektívnosti však JPAZ2 je implementovaný tak, že všetky vizuálne zmeny zrealizované v týchto metódach sa prejavia až po ich skončení. Zároveň v tomto čase je zablokované akékoľvek spracovávanie používateľských akcií (myšacie udalosti, klávesnica). To má za následok to, že ak chceme na základe kliknutia myšou spustiť napríklad nejakú pomalú animáciu, alebo inú dlhotrvajúcu akciu, výsledok sa prejaví až po jej skončení. A to nie je v istých prípadoch žiadúce. Ako teda na to ?

Predpokladajme, že v triede MojaPlocha oddedenej od triedy WinPane máme metódu akcia, ktorú chceme spustiť pri kliknutí myšou.

@Override
protected void onMouseClicked(int x, int y, MouseEvent detail) {       
        // Spustime metodu akcia v subezne beziacom vlakne,
        // co dovoli okamzite ukoncenie metody onMouseClicked
        Thread vlakno = new Thread() {
                @Override
                public void run() {
                        akcia();
                }
        };
        vlakno.start();
}

V tomto príklade je dlhotrvajúca akcia spustená v súbežne bežiacom vlákne. JPAZ2 je naprogramovaný tak, že nemá problém s vykonávaním akcií z viacerých vlákien (je thread-safety). To však môže neplatiť pre vami vytvorené triedy. Preto treba byť veľmi opatrný a napríklad na animácie radšej využiť prekrytie onTick metódy, ktorá sa vykonáva so zadanou frekvenciou (periódou).

Vyššie uvedený príklad využíva 2 pokročilé koncepty, ktoré nie sú zahrnuté v obsahu PAZ1a:

To, že akékoľvek obslužné metódy musia čo najskôr ukončiť svoju činnosť a na dlhotrvajúce veci sa používajú vlákna, platí (asi) v každom GUI frameworku (Delphi, C#, Java - AWT/Swing, ...).