SwingWorker
来源:互联网 发布:faker哭了知乎 编辑:程序博客网 时间:2024/06/05 22:33
SwingWorker
App.java:import javax.swing.SwingUtilities;public class App { /** * @param args */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new MainFrame("SwingWorker Demo"); } }); }}
MainFrame.java:import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.List;import java.util.concurrent.ExecutionException;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.SwingWorker;public class MainFrame extends JFrame { private JLabel countLabel1 = new JLabel("0"); private JLabel statusLabel = new JLabel("Task not completed."); private JButton startButton = new JButton("Start"); public MainFrame(String title) { super(title); setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.fill = GridBagConstraints.NONE; gc.gridx = 0; gc.gridy = 0; gc.weightx = 1; gc.weighty = 1; add(countLabel1, gc); gc.gridx = 0; gc.gridy = 1; gc.weightx = 1; gc.weighty = 1; add(statusLabel, gc); gc.gridx = 0; gc.gridy = 2; gc.weightx = 1; gc.weighty = 1; add(startButton, gc); startButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { start(); } }); setSize(200, 400); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } private void start() { // Use SwingWorker<void void=""> and return null from doInBackground if // you don't want any final result and you don't want to update the GUI // as the thread goes along. // First argument is the thread result, returned when processing finished. // Second argument is the value to update the GUI with via publish() and process() SwingWorker<boolean integer=""> worker = new SwingWorker<boolean integer="">() { @Override /* * Note: do not update the GUI from within doInBackground. */ protected Boolean doInBackground() throws Exception { // Simulate useful work for(int i=0; i<30; i++) { Thread.sleep(100); System.out.println("Hello: " + i); // optional: use publish to send values to process(), which // you can then use to update the GUI. publish(i); } return false; } @Override // This will be called if you call publish() from doInBackground() // Can safely update the GUI here. protected void process(List<integer> chunks) { Integer value = chunks.get(chunks.size() - 1); countLabel1.setText("Current value: " + value); } @Override // This is called when the thread finishes. // Can safely update GUI here. protected void done() { try { Boolean status = get(); statusLabel.setText("Completed with status: " + status); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; worker.execute(); }}</integer></boolean></boolean></void>
SwingWorker的第一个template argument:doInBackground方法的返回类型,get方法的返回值类型template argument中只能用Void(void对应的类)。如果用Void,doInBackground方法必须返回null。
template argument中只能用class,不能用primitive type。
SwingWorker的第二个template argument:publish方法的参数类型,process方法参数List的泛型类型。如果要再doInBackground方法执行的同时,update GUI,在doInBackground方法中调用publish方法,然后override process方法。
process方法的参数是一个List<第二个template argument>,因为并不是每一次在doInBackground方法中调用publish的时候process方法都会被调用。这个List保存了每次publish的内容。在process方法中,可以update GUI safely。process方法在EDT中被调度。
每一个SwingWorker对象只能execute一次,如果需要再执行一遍,只能再创建一个对象。
doInBackground方法中update GUI不安全。doInBackground方法可以throw exception。在done方法中可以catch。
done方法在这个thread结束的时候会被执行,done方法中可以update GUI safely。
get方法得到doInBackground方法的返回值,如果doInBackground还没有执行完,get方法wait。
0 0
- SwingWorker
- SwingWorker
- SwingWorker
- about SwingWorker.....
- swingworker笔记
- swing SwingWorker
- java SwingWorker
- java-swingworker
- swingworker--Simple Background Tasks
- 使用SwingWorker之一
- 使用SwingWorker之二
- 使用SwingWorker之三
- 使用SwingWorker之一
- 使用SwingWorker之二
- 使用SwingWorker之三
- 使用SwingWorker之一
- SwingWorker的使用
- SwingWorker代码的阅读
- 手斧Linux – 从LFS到Funtoo (23)
- ArcEngine数据删除几种方法和性能比较
- 安卓第四次实验:游戏计分以及碰撞修改
- 手斧Linux – 从LFS到Funtoo (24)
- Linux中backtrace()系列函数的应用实例
- SwingWorker
- tiny6410按键驱动(六)---异步通知
- Installing MySQL from Source on Windows
- 手斧Linux – 从LFS到Funtoo (25)
- 欢迎您在新浪博客安家
- QT中MainWindow的布局设置
- 完美解决qt(4.8.4) 中文路径问题
- windows 无窗口进程间消息通…
- postthreadmessage