SwingWorker - SwingWorker
![]() | Tento článek má několik problémů. Prosím pomozte vylepši to nebo diskutovat o těchto problémech na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
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:
- přepsat
SwingWorker.done ()
metoda. Tato metoda se nazývá hlavní vlákno pro odesílání událostí.
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(); } }}
- zaregistrujte posluchače pomocí pracovníka
SwingWorker.addPropertyChangeListener (PropertyChangeListener)
metoda. Posluchač bude upozorněn na změny ve stavu pracovníka.
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
System.ComponentModel.BackgroundWorker
- .NET Frameworkflash.system.Worker
- Adobe Flashandroid.os.AsyncTask
- Android
Viz také
Reference
- ^
SwingWorker
- ^ 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].
- ^ Můžete si jej stáhnout „SwingWorker 3“. Internetový archiv. Archivovány od originál 26. června 2012.
externí odkazy
- SwingWorker dokumentace třídy pro Javu 7.
- Pracovní vlákna a SwingWorker z prostředí Java společnosti Oracle Souběžnost v Swingu tutorial.
- Zlepšete výkon aplikací pomocí SwingWorker v prostředí Java SE 6 John O'Conner, leden 2007.