TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
从硬盘装载一组图像并显示已装载文件的名称。SwingWorker让你在一个后台线程中运行一个特定的任务,在EDT上发
中间结果和最终结果。- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class ImageLoader extends JFrame {
- private JTextArea log;
- private JPanel viewer;
-
- public ImageLoader() {
- super("Image Loader");
-
- this.log = new JTextArea(4, 4);
- this.viewer = new JPanel();
-
- JButton start = new JButton("Start");// 点击这个按钮开始一段长时间的任务。
- start.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- String[] files = new String[] {
- "Bodie_small.png", "Carmela_small.png",
- "Unknown.png", "Denied.png",
- "Death Valley_small.png", "Lake_small.png"
- };
- new ImageLoadingWorker(log, viewer, files).execute();//后台工作线程开始工作
- }
- });
-
- add(new JScrollPane(log), BorderLayout.NORTH);
- add(new JScrollPane(viewer), BorderLayout.CENTER);
- add(start, BorderLayout.SOUTH);
-
- setSize(360, 280);
- }
-
- public static void main(String... args) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- new ImageLoader().setVisible(true);//初始化GUI
- }
- });
- }
- }
- import java.util.List;
- import java.util.ArrayList;
- import java.io.File;
- import java.io.IOException;
- import java.awt.Image;
- import javax.swing.ImageIcon;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JTextArea;
- import javax.imageio.ImageIO;
- import javax.swing.SwingWorker;
- // Final result is a list of Image
- // Intermediate result is a message as a String
- //第一个类型参数指定doInBackground的返回类型。
- //第二个类型参数指定publish和process方法要处理的数据类型
- public class ImageLoadingWorker extends SwingWorker< List< Image>, String> {
- private JTextArea log;
- private JPanel viewer;
- private String[] filenames;
- public ImageLoadingWorker(JTextArea log, JPanel viewer, String... filenames) {
- this.log = log;
- this.viewer = viewer;
- this.filenames = filenames;
- }
- // In a thread
- @Override
- protected List< Image> doInBackground() {//后台的任务
- List< Image> images = new ArrayList< Image>();
- for (String filename : filenames) {
- try {
- images.add(ImageIO.read(new File(filename)));
- //通过调用publish(),可以随时公布中间结果,publicsh()会依次调用EDT中的publish()
- publish("Loaded " + filename);
- } catch (IOException ioe) {
- publish("Error loading " + filename);
- }
- }
- return images;
- }
- // In the EDT
- //后台任务完成后(即doInBackground()方法执行完成后),SwingWorker在EDT中自动调用done(),显示最终结果。
- @Override
- protected void done() {
- try {
- for (Image image : get()) {//一般会在done()方法中调用get()方法获取doInBackground()方法计算出来的值。
- viewer.add(new JLabel(new ImageIcon(image)));
- viewer.revalidate();
- }
- } catch (Exception e) { }
- }
- // In the EDT
- @Override
- protected void process(List< String> messages) {
- for (String message : messages) {
- log.append(message);
- log.append("
- ");
- }
- }
-
- }
- 运行结果:
- [img]http://www.java3z.com/cwbwebhome/article/article5/img9/swingworker33.jpg[/img]
复制代码
源码下载:http://file.javaxxz.com/2014/11/16/000056031.zip |
|