亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看精品自拍私拍| 国产精品成久久久久三级| 久久久久久久爱| 国产欧亚日韩视频| 亚洲久久久久久久久久| 美女视频黄免费的亚洲男人天堂| 中文字幕国产日韩| 亚洲国产精品成人av| 亚洲欧美国产日韩天堂区| 国产福利视频一区二区| 日韩国产中文字幕| 久久手机免费视频| 在线观看国产精品91| 人体精品一二三区| 国产欧美日韩亚洲精品| 97香蕉超级碰碰久久免费软件| 日韩av成人在线| 欧美视频精品一区| 日韩一区二区久久久| 久久精品夜夜夜夜夜久久| 国产精品99久久久久久www| 国产一区二区三区在线免费观看| 国产精品男人的天堂| 欧美精品精品精品精品免费| 亚洲高清av在线| 欧美大肥婆大肥bbbbb| 欧美精品激情在线观看| 中文字幕欧美亚洲| 亚洲男人天堂网| 久久99亚洲精品| 91av视频在线免费观看| 精品综合久久久久久97| 亚洲bt欧美bt日本bt| 亚洲一级一级97网| 欧美成人国产va精品日本一级| 欧美激情区在线播放| 欧美在线视频网| www日韩中文字幕在线看| 国产精品久久久久久久久久| 久久在精品线影院精品国产| 日韩一区二区欧美| 欧美成年人网站| 成人黄色av网站| 日韩av综合中文字幕| 亚洲人成电影网站色| 国产精品久久久久aaaa九色| 国产ts人妖一区二区三区| 中文字幕精品—区二区| 久久久国产成人精品| 欧美国产日韩中文字幕在线| 97成人精品视频在线观看| 正在播放国产一区| 国产成人激情小视频| 欧美极品美女电影一区| 日韩免费精品视频| 国产精品aaa| 亚洲国产天堂久久综合| 国内精品中文字幕| 久久精品视频中文字幕| 日韩动漫免费观看电视剧高清| 亚洲在线视频观看| 日本欧美一级片| 欧美老少配视频| 国产精品激情av电影在线观看| 欧美精品做受xxx性少妇| 日韩精品免费在线| 日韩日本欧美亚洲| 亚洲精品福利在线观看| 精品香蕉在线观看视频一| 久久久亚洲国产天美传媒修理工| 欧美亚洲国产成人精品| 一区二区在线免费视频| 在线观看成人黄色| 高清一区二区三区日本久| 久久久综合av| 欧美性做爰毛片| 尤物九九久久国产精品的特点| 亚洲男人天堂久| 日韩高清免费观看| 国产成人福利视频| 91免费视频国产| 91精品免费久久久久久久久| 97激碰免费视频| 在线视频欧美日韩精品| 国产成人啪精品视频免费网| 欧美天天综合色影久久精品| 深夜福利国产精品| 日韩视频免费在线观看| 成人网页在线免费观看| 精品国产成人av| 欧美一级视频免费在线观看| 精品日本美女福利在线观看| 亚洲一区亚洲二区亚洲三区| 日韩最新中文字幕电影免费看| 亚洲男人天堂2024| 亚洲精品中文字幕女同| 日本精品免费观看| 久久免费视频这里只有精品| 91久久久精品| 91精品久久久久久久久| 国产精品视频在线播放| 国产精品高潮呻吟久久av野狼| 欧美日韩亚洲一区二| 日韩av一区在线| 国产成人jvid在线播放| 国模精品视频一区二区三区| 精品久久香蕉国产线看观看亚洲| 日韩在线播放一区| 色无极影院亚洲| 欧美激情精品久久久久久久变态| 国产精品va在线| www.美女亚洲精品| 国产一区二区三区在线观看视频| 中文字幕欧美日韩在线| 91av视频在线播放| 国产日韩欧美在线| 亚洲品质视频自拍网| 国产欧美一区二区白浆黑人| 亚洲娇小xxxx欧美娇小| 国产xxx69麻豆国语对白| 国产精品欧美在线| 精品美女久久久久久免费| 国产美女精品视频| 狠狠躁天天躁日日躁欧美| 欧美中文在线视频| 亚洲成人av中文字幕| 亚洲福利小视频| 高清亚洲成在人网站天堂| 国产精品一区二区久久久| 精品福利一区二区| 国产精品吊钟奶在线| 中文精品99久久国产香蕉| 久久久亚洲国产天美传媒修理工| 这里只有精品视频在线| 777精品视频| 日韩黄色在线免费观看| 日韩小视频网址| 亚洲自拍小视频| 欧美在线精品免播放器视频| 亚洲欧美在线一区| 98午夜经典影视| 亚洲第一av网| 欧美成人精品h版在线观看| 日本伊人精品一区二区三区介绍| 欧美日韩国产精品专区| 5252色成人免费视频| 国产做受高潮69| 亚洲午夜激情免费视频| 日韩av电影手机在线观看| 国产成人高潮免费观看精品| 欧美精品www在线观看| 欧美日韩激情美女| 国产成人亚洲综合青青| 久久久伊人欧美| 伊人久久精品视频| 亚洲影院色无极综合| 欧美日韩国产限制| 蜜月aⅴ免费一区二区三区| 亚洲性视频网址| 日本亚洲欧洲色| 精品无人区乱码1区2区3区在线| 日韩av日韩在线观看| 日本久久久久久久| 日本免费一区二区三区视频观看|