利用SwingWorker异步加载图片
2015-07-26 17:28
281 查看
参考自:http://www.oschina.net/code/snippet_12_82#113
基本思路:
通过SwingWorker来异步获取图片并创建ImageIcon;
通过JLabel的设置Icon的方式来显示获取的图片。
实例代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.imageio.ImageIO;
public class ImageLoaderDemo extends JFrame {
private JTextArea log;
private JPanel viewer;
public ImageLoaderDemo() {
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[] {
"http://cdqxx.img44.wal8.com/img44/521141_20150617214704/143459309389.jpg",
"C:\\Users\\TS\\Desktop\\test1.PNG",
"C:\\Users\\TS\\Desktop\\test2.PNG",
"C:\\Users\\TS\\Desktop\\test3.PNG" };
new ImageLoadingWorker(log, viewer, files).execute();
}
});
add(new JScrollPane(log), BorderLayout.NORTH);
add(new JScrollPane(viewer), BorderLayout.CENTER);
add(start, BorderLayout.SOUTH);
setSize(600, 600);
}
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ImageLoaderDemo().setVisible(true);
}
});
}
}
class ImageLoadingWorker extends SwingWorker<List<ImageIcon>, String> {
private JTextArea log;
private JPanel viewer;
private String[] filenames;
public ImageLoadingWorker(JTextArea log, JPanel viewer, String... filenames) {
this.log = log;
this.viewer = viewer;
viewer.setLayout(new GridLayout(0,2,5,5));
this.filenames = filenames;
}
@Override
protected void done() {
System.out.println("done()");
viewer.removeAll();
try {
for (ImageIcon image : get()) {
JLabel jl = new JLabel(image);
viewer.add(jl);
viewer.revalidate();
}
} catch (Exception e) {
}
}
@Override
protected void process(List<String> messages) {
System.out.println("process()");
for (String message : messages) {
log.append(message);
log.append("\n");
}
}
@Override
public List<ImageIcon> doInBackground() {
System.out.println("doInBackground()");
List<ImageIcon> images = new ArrayList<ImageIcon>();
int width = 400;
int height = 400;
for (String filename : filenames) {
ImageIcon ii = new ImageIcon();
try {
if(filename.startsWith("http")){
ii.setImage(new ImageIcon(new URL(filename)).getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT));
}else{
ii.setImage(new ImageIcon(ImageIO.read(new File(filename))).getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT));
}
images.add(ii);
publish("Loaded " + filename);
} catch (IOException ioe) {
publish("Error loading " + filename);
}
}
return images;
}
}
注:测试时注意修改本地图片的地址。
基本思路:
通过SwingWorker来异步获取图片并创建ImageIcon;
通过JLabel的设置Icon的方式来显示获取的图片。
实例代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.imageio.ImageIO;
public class ImageLoaderDemo extends JFrame {
private JTextArea log;
private JPanel viewer;
public ImageLoaderDemo() {
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[] {
"http://cdqxx.img44.wal8.com/img44/521141_20150617214704/143459309389.jpg",
"C:\\Users\\TS\\Desktop\\test1.PNG",
"C:\\Users\\TS\\Desktop\\test2.PNG",
"C:\\Users\\TS\\Desktop\\test3.PNG" };
new ImageLoadingWorker(log, viewer, files).execute();
}
});
add(new JScrollPane(log), BorderLayout.NORTH);
add(new JScrollPane(viewer), BorderLayout.CENTER);
add(start, BorderLayout.SOUTH);
setSize(600, 600);
}
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ImageLoaderDemo().setVisible(true);
}
});
}
}
class ImageLoadingWorker extends SwingWorker<List<ImageIcon>, String> {
private JTextArea log;
private JPanel viewer;
private String[] filenames;
public ImageLoadingWorker(JTextArea log, JPanel viewer, String... filenames) {
this.log = log;
this.viewer = viewer;
viewer.setLayout(new GridLayout(0,2,5,5));
this.filenames = filenames;
}
@Override
protected void done() {
System.out.println("done()");
viewer.removeAll();
try {
for (ImageIcon image : get()) {
JLabel jl = new JLabel(image);
viewer.add(jl);
viewer.revalidate();
}
} catch (Exception e) {
}
}
@Override
protected void process(List<String> messages) {
System.out.println("process()");
for (String message : messages) {
log.append(message);
log.append("\n");
}
}
@Override
public List<ImageIcon> doInBackground() {
System.out.println("doInBackground()");
List<ImageIcon> images = new ArrayList<ImageIcon>();
int width = 400;
int height = 400;
for (String filename : filenames) {
ImageIcon ii = new ImageIcon();
try {
if(filename.startsWith("http")){
ii.setImage(new ImageIcon(new URL(filename)).getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT));
}else{
ii.setImage(new ImageIcon(ImageIO.read(new File(filename))).getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT));
}
images.add(ii);
publish("Loaded " + filename);
} catch (IOException ioe) {
publish("Error loading " + filename);
}
}
return images;
}
}
注:测试时注意修改本地图片的地址。
相关文章推荐
- [原创]java局域网聊天系统
- java很神奇 用swing制作欢迎屏幕
- java基于swing实现的五子棋游戏代码
- 使用java swing实现qq登录界面示例分享
- Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane)组件使用案例
- 可视化Swing中JTable控件绑定SQL数据源的两种方法深入解析
- Java Swing中的文本区(JTextArea)实现换行保存到文件的几个方法
- Java Swing中的表格(JTable)和树(JTree)组件使用实例
- Java Swing中的文本框(JTextField)与文本区(JTextArea)使用实例
- Java Swing中的JButton、JComboBox、JList和JColorChooser组件使用案例
- Java Swing中的工具栏(JToolBar)和分割面版(JSplitPane)组件使用案例
- ios通过按钮点击异步加载图片
- Android异步加载网络图片的工具类
- 要离开Swing了,曾经的爱与恨
- Swing 和AWT之间的关系
- SWING中使用ImageIcon
- exe4j生成可执行文件出现错误UnsupportedClassVersionError
- 让JTable不显示表头
- jasperreport中的demo学习
- 为 SWT Windows桌面程序定制适合分发的 JRE