SwingWorker - SwingWorker

SwingWorker je populární užitková třída vyvinutý uživatelem Sun Microsystems pro Houpačka knihovna Programovací jazyk Java. SwingWorker umožňuje správné používání vlákno pro odesílání událostí. Do Java 6, SwingWorker je součástí JRE.[1]

Od roku 1998 do roku 2006 bylo vyrobeno několik nekompatibilních, neoficiálních verzí SwingWorker a je třeba dbát na to, aby se předešlo hojné dokumentaci k těmto verzím předcházející Java 6.

Použití v Javě 6.0

Problém podprocesu s odesláním události

SwingWorker je užitečný, když je třeba provést časově náročnou úlohu po události interakce s uživatelem (například analýza velkého souboru XML po stisknutí JButton). Nejpřímější způsob, jak to udělat, je:

soukromé Dokument doc;...JButton knoflík = Nový JButton(„Otevřít XML“);knoflík.addActionListener(Nový ActionListener() {    @ Přepis    veřejnost prázdnota akce Provedeno(ActionEvent E) {        doc = loadXML();    }});

To bude fungovat, ale bohužel loadXML () metoda bude volána stejným způsobem vlákno jako hlavní Swing vlákno ( Vlákno dispečinku událostí ), takže pokud metoda potřebuje čas na provedení, GUI během této doby zamrzne.

Řešení SwingWorker

Tento problém není specifický pro Javu, ale je společný pro mnoho GUI modely. SwingWorker navrhuje způsob, jak to vyřešit provedením časově náročného úkolu na jiném vlákně na pozadí, při zachování GUI během této doby reagovat.

Vytváření pracovníka

Následující kód definuje SwingWorker, který zapouzdřuje loadXML () volání metody:

SwingWorker pracovník = Nový SwingWorker<Dokument, Neplatné>() {    @ Přepis    veřejnost Dokument doInBackground() {        Dokument intDoc = loadXML();        vrátit se intDoc;    }};

Provádění pracovníků

Provádění se spouští pomocíSwingWorker.execute () metoda.

Načítání výsledku

Výsledek lze načíst pomocí SwingWorker.get () metoda.

Jako volání dostat() na podprocesu odeslání události blokuje všechny události, včetně překreslení, před zpracováním až do dokončení úkolu, je třeba se mu vyhnout před zdlouhavá operace skončila. Výsledek lze načíst dvěma způsoby po dokončení úkolu:

soukromé Dokument doc;...SwingWorker<Dokument, Neplatné> pracovník = Nový SwingWorker<Dokument, Neplatné>() {    @ Přepis    veřejnost Dokument doInBackground() {        Dokument intDoc = loadXML();        vrátit se intDoc;    }    @ Přepis    veřejnost prázdnota Hotovo() {        Snaž se {            doc = dostat();        } chytit (Přerušená výjimka např) {            např.printStackTrace();        } chytit (ExecutionException např) {            např.printStackTrace();        }    }}

Kompletní příklad pracovníka

soukromé Dokument doc;...JButton knoflík = Nový JButton(„Otevřít XML“);knoflík.addActionListener(Nový ActionListener() {    @ Přepis    veřejnost prázdnota akce Provedeno(ActionEvent E) {        SwingWorker<Dokument, Neplatné> pracovník             = Nový SwingWorker<Dokument, Neplatné>() {            @ Přepis            veřejnost Dokument doInBackground() {                Dokument intDoc = loadXML();                vrátit se intDoc;            }            @ Přepis            veřejnost prázdnota Hotovo() {                Snaž se {                    doc = dostat();                } chytit (Přerušená výjimka např) {                    např.printStackTrace();                } chytit (ExecutionException např) {                    např.printStackTrace();                }            }        };        pracovník.vykonat();    }});

Historie: Využití před Java 6.0

SwingWorker je součástí Java SE pouze od verze Java 6.0. Sun vydal verze, které mají být použity se staršími JDK, i když se jednalo o neoficiální verze, které nebyly součástí Java SE a nebyly zmíněny ve standardní dokumentaci knihovny.[2] Nejnovější z těchto verzí pochází z roku 2003 a je často označována jako SwingWorker verze 3.[3] Bohužel JDK 6.0 SwingWorker a SwingWorker verze 3 používají různé názvy metod a nejsou kompatibilní. Verze backport (viz níže) se nyní doporučuje pro použití před verzí Java 6.

Příklad pro vytvoření instance SwingWorker 3 je uveden níže:

SwingWorker pracovník = Nový SwingWorker() {    veřejnost Objekt postavit() {        ... // přidat kód pro vlákno na pozadí    }    veřejnost prázdnota hotovo() {        ... // kód, který zde přidáte, se spustí ve vlákně uživatelského rozhraní    } };pracovník.Start();  // Spustit vlákno na pozadí

The Start() Metoda provede kód přidaný v metodě construct () v samostatném vlákně. Chcete-li být upozorněni, když vlákno na pozadí skončí, stačí přepsat dokončeno () metoda. The postavit() metoda může vrátit výsledek, který lze později načíst pomocí SwingWorker's dostat() metoda.

Backport Java 6 SwingWorker

Backport Java 6 SwingWorker do Java 5 je k dispozici na http://swingworker.java.net/[trvalý mrtvý odkaz ]. Kromě názvu balíčku ( org.jdesktop.swingworker ), je kompatibilní s Java 6 SwingWorker.

Ekvivalenty

Viz také

Reference

  1. ^ SwingWorker
  2. ^ Viz javax.swing shrnutí balíčku před a po J2SE 6.0. Všimněte si také, že na indexových stránkách dokumentace není do verze 6.0 uvedena žádná třída SwingWorker: [1], [2].
  3. ^ Můžete si jej stáhnout „SwingWorker 3“. Internetový archiv. Archivovány od originál 26. června 2012.

externí odkazy