国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Java Swing 多線程加載圖片(保證順序一致)

2024-07-13 10:14:43
字體:
來源:轉載
供稿:網友

大二的時候做的課程設計,圖片管理器,當時遇到圖片很多的文件夾,加載順序非常慢。雖然嘗試用多個Thread加載圖片,卻無法保證圖片按順序加載。直到今天學會了使用Callable接口和Future接口,于是心血來潮實現了這個功能。

廢話不多說,看代碼。

多線程加載圖片(核心):

package com.lin.imagemgr;import java.awt.Dimension;import java.awt.image.BufferedImage;import java.io.File;import java.io.FilenameFilter;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.stream.Collectors;import javax.swing.ImageIcon;import javax.swing.JLabel;import net.coobird.thumbnailator.Thumbnails;public class ImageMgr { private static ImageMgr instance = new ImageMgr(); private ImageMgr() {} public static ImageMgr getInstance() {  return instance; } //線程池 private ExecutorService executor = Executors.newFixedThreadPool(8); public List<JLabel> loadImages(String path) {  List<JLabel> images = new ArrayList<>();  File file = new File(path);  if (!file.isDirectory()) {   throw new RuntimeException("need directory!");  }  File[] files = file.listFiles(new FilenameFilter() {   @Override   public boolean accept(File dir, String name) {    //thumbnail只支持jpg??    if (name.endsWith(".jpg")) {     return true;    }    return false;   }  });  //并發加載圖片,并使用Future保存加載結果  List<Future<MyLabel>> futures = new ArrayList<>();  for (final File f : files) {   Future<MyLabel> future = executor.submit(() -> {    return new MyLabel(f.getName(), f.getAbsolutePath());   });   futures.add(future);  }  //等待所有并發加載返回結果  try {   for (Future<MyLabel> future : futures) {    MyLabel icon = future.get();    images.add(icon);   }  } catch (InterruptedException e) {   e.printStackTrace();  } catch (ExecutionException e) {   e.printStackTrace();  }  //Java8使用stream API 進行排序  List<JLabel> sortedList = images.stream().sorted().collect(Collectors.toList());  return sortedList; } //繼承JLabel并實現Comparable接口,從而對JLabel進行排序 private static class MyLabel extends JLabel implements Comparable<MyLabel>{  private static final long serialVersionUID = 1L;  private String fileName;  public MyLabel(String fileName, String fullPath) {   this.fileName = fileName;   //使用thumbnailator生成縮略圖   try {    BufferedImage bufferedImage = Thumbnails.of(fullPath)     .size(100, 120)    .asBufferedImage();    setIcon(new ImageIcon(bufferedImage));    setPreferredSize(new Dimension(100, 120));   } catch (IOException e) {    e.printStackTrace();   }  }  @Override  public int compareTo(MyLabel o) {   int result = this.fileName.compareTo(o.fileName);   return result;  } }}

Swing界面:

 

package com.lin.imagemgr;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.FlowLayout;import java.util.List;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextField;public class MainFrame extends JFrame{ private static final long serialVersionUID = 1L; private JTextField pathField; private JButton showBtn; private JPanel contentPanel; public void init() {  JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));  topPanel.setPreferredSize(new Dimension(800, 40));  pathField = new JTextField(50);  showBtn = new JButton("顯示圖片");  topPanel.add(pathField);  topPanel.add(showBtn);  getContentPane().add(BorderLayout.NORTH, topPanel);  contentPanel = new JPanel();  contentPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));  contentPanel.setPreferredSize(new Dimension(750, 1800));  JScrollPane jsp = new JScrollPane(contentPanel);  getContentPane().add(BorderLayout.CENTER, jsp);  showBtn.addActionListener((e) -> {   try {    loadImages();   } catch (Exception ex) {    ex.printStackTrace();   }  });  setSize(800, 650);  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  setLocationRelativeTo(null);  setVisible(true); } public void loadImages() {  contentPanel.removeAll();  String path = pathField.getText();  long start = System.currentTimeMillis();  List<JLabel> images = ImageMgr.getInstance().loadImages(path);  for (JLabel label :images) {   contentPanel.add(label);  }  contentPanel.updateUI();  long end = System.currentTimeMillis();  System.out.println("加載需要" + (end - start) + "毫秒!"); } public static void main(String[] args) {  new MainFrame().init(); }}

運行結果

Java,Swing,多線程,加載圖片

Java,Swing,多線程,加載圖片

在我的電腦上,加載92張圖片并渲染到界面上,總共花了1568毫秒。大家可以找一個圖片很多的文件夾,嘗試加載大量圖片的情況。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邹平县| 尖扎县| 新蔡县| 什邡市| 义马市| 枣强县| 金溪县| 繁峙县| 昌黎县| 莒南县| 三门峡市| 卫辉市| 孙吴县| 南京市| 锦州市| 阜平县| 璧山县| 北流市| 虞城县| 多伦县| 姚安县| 交城县| 常德市| 上栗县| 宁都县| 进贤县| 宜春市| 阳高县| 曲沃县| 霍州市| 太白县| 锦州市| 确山县| 千阳县| 高邑县| 金门县| 余干县| 巴彦淖尔市| 集贤县| 岳阳县| 高邮市|