عندما كنت في السنة الثانية من السنة الثانية ، قمت بتصميم الدورة التدريبية ومدير الصور. في ذلك الوقت ، واجهت مجلدات مع العديد من الصور ، وكان ترتيب التحميل بطيئًا للغاية. على الرغم من أنني حاولت تحميل الصور بمواضيع متعددة ، إلا أنني لم أستطع ضمان تحميل الصور بالترتيب. حتى اليوم ، تعلمت استخدام الواجهة القابلة للاتصال والواجهة المستقبلية ، لذلك أدركت هذه الوظيفة على نزوة.
لا تقل الكثير من الهراء ، انظر إلى الكود.
تحميل الصور متعدد مؤشرات الترابط (جوهر):
package com.lin.imagemgr ؛ import java.awt.dimension ؛ import java.awt.image.bufferedimage ؛ import java.io java.util.concurrent.executorservice ؛ import java.util.concurrent.executors ؛ import java.util.concurrent.future ؛ import java.util.stream.collectors ؛ javax.swing.imageicon ؛ ImageMgr {private static ImageMgr مثيل = new ImageMgr () ؛ Private ImageMgr () {} static ImageMgr getInstance () {return مثيل ؛ }. القائمة العامة <Jlabel> loadImages (string path) {list <Jlabel> Images = new ArrayList <> () ؛ ملف الملف = ملف جديد (مسار) ؛ if (! file.isdirectory ()) {رمي new runTimeException ("Need Need!") ؛ } file [] files = file.listfiles (filenamefilter () {Override public boolean قبول (ملف dir ، اسم السلسلة) {// thumbnail يدعم فقط jpg ؟؟ if (name.endswith (". // بشكل متزامن ، قم بتحميل الصورة واستخدم المستقبل لحفظ قائمة نتائج التحميل <المستقبل <Milabel>> Futures = new ArrayList <> () ؛ لـ (Final File F: Files) {Future <Milabel> Future = Executor.Submit (() -> {return new mylabel (f.getName () ، f.getabsolutepath ()) ؛}) ؛ العقود الآجلة. Add (المستقبل) ؛ } // في انتظار جميع الأحمال المتزامنة لإرجاع النتيجة ، حاول {Future <milabel> المستقبل: العقود الآجلة) {mylabel icon = future.get () ؛ صور. add (icon) ؛ }} catch (interruptedException e) {E.PrintStackTrace () ؛ } catch (executionException e) {e.printStackTrace () ؛ } // يستخدم Java8 API Stream لفرز القائمة <Jlabel> sortedList = Images.stream (). sorted (). collect (collectors.tolist ()) ؛ إرجاع sortedlist ؛ } // ernerit jlabel وتنفيذ واجهة قابلة للمقارنة لفرز jlabel static static الفئة mylabel يمتد Jlabel أدوات قابلة للمقارنة <mylabel> {private Static Final Long SerialVersionuid = 1L ؛ اسم الملف الخاص بالسلسلة ؛ MyLabel العامة (اسم ملف السلسلة ، سلسلة FullPath) {this.filename = filename ؛ // استخدم Thumbnailator لإنشاء Thumbnail Try {BufferedImage BufferedImage = thumbnails.of (FullPath) .Size (100 ، 120) .AsbufferedImage () ؛ seticon (New ImageIcon (BufferEdImage)) ؛ setPreferredSize (Dimension New (100 ، 120)) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} Override public int compareto (mylabel o) {int result = this.filename.compareto (o.filename) ؛ نتيجة العودة }}}واجهة التأرجح:
package com.lin.imagemgr ؛ import java.awt.borderlayout ؛ استيراد java.awt.dimension ؛ استيراد java.awt.flowlayout ؛ استيراد java.util.list ؛ import javax.swing.jbutton ؛ javax.swing.jframe ؛ import javax.swing.jlabel ؛ javax.swing.jscrollpane ؛ import javax.swing.jtextfield ؛ public class mainframe يمتد Jframe {private static final long serialversionuid = 1l ؛ خاص JTextfield Pathfield ؛ خاص Jbutton Showbtn ؛ خاص jpanel contentPanel ؛ public void init () {jpanel toppanel = new jpanel (new FlowLayout (flowlayout.left ، 5 ، 0)) ؛ Toppanel.setPreferredSize (Dimension New (800 ، 40)) ؛ Pathfield = New JTextfield (50) ؛ ShowBtn = New Jbutton ("show picture") ؛ Toppanel.add (Pathfield) ؛ Toppanel.add (Showbtn) ؛ getContentPane (). add (borderlayout.north ، toppanel) ؛ contentPanel = new JPanel () ؛ ContentPanel.setLayout (New FlowLayout (FlowLayout.left ، 5 ، 5)) ؛ ContentPanel.setPreferredSize (Dimension New (750 ، 1800)) ؛ JScrollpane JSP = New JScrollPane (ContentPanel) ؛ getContentPane (). add (BorderLayout.Center ، JSP) ؛ ShowBtn.AddActionListener ((e) -> {try {loadImages () ؛} catch (استثناء ex) {ex.printStackTrace () ؛}}) ؛ SetSize (800 ، 650) ؛ setDefaultCloseOperation (jframe.exit_on_close) ؛ setLocationRelativeto (NULL) ؛ setVisible (صحيح) ؛ } public void loadImages () {contentPanel.RemoVeall () ؛ String path = pathfield.getText () ؛ بدء طويل = system.currentTimeMillis () ؛ قائمة <Jlabel> Images = ImageMgr.getInstance (). loadImages (path) ؛ لـ (JLabel Label: Images) {contentPanel.add (label) ؛ } contentPanel.updateui () ؛ End Long = System.CurrentTimeMillis () ؛ system.out.println ("التحميل يتطلب" + (end - start) + "milliseconds!") ؛ } public static void main (string [] args) {new Mainframe (). init () ؛ }}نتائج التشغيل
على جهاز الكمبيوتر الخاص بي ، استغرق الأمر 1568 ميلي ثانية لتحميل 92 صورة وتقديمها على الواجهة في المجموع. يمكنك العثور على مجلد يحتوي على الكثير من الصور ومحاولة تحميل الكثير من الصور.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.