Cuando estaba en mi segundo año, hice un diseño de diseño y un gerente de imágenes. En ese momento, encontré carpetas con muchas imágenes, y el orden de carga era muy lento. Aunque intenté cargar imágenes con múltiples hilos, no podía garantizar que las imágenes se cargarían en orden. Hasta hoy, aprendí a usar la interfaz de llamada y la interfaz futura, por lo que me di cuenta de esta función por capricho.
No digas muchas tonterías, mira el código.
Carga de imágenes multiproceso (núcleo):
paquete 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.concurrent.execution; java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.future; import java.util.stream.collectores; import javax.swing.imageicon; import javax.swing.jlabel; import net.coobird.thumbnailator; Imagemgr {private static imagemgr instance = new imagemgr (); private imagemgr () {} public static imagemgr getInstance () {return instancia; } // hilo de hilo privado ejecutorservice ejecutor = ejecutors.newfixedthreadpool (8); Lista pública <JLabel> LoadImages (string ruta) {list <jlabel> images = new ArrayList <> (); Archivo archivo = nuevo archivo (ruta); if (! file.isDirectory ()) {Throw New RuntimeException ("¡Necesito directorio!"); } File [] files = file.listfiles (new FileNameFilter () {@Override public boolean Acept (archivo dir, name de cadena) {// miniatura solo admite jpg? // cargue simultáneamente la imagen y use el futuro para guardar la lista de resultados de carga <futuro <mylabel>> futures = new ArrayList <> (); para (archivo final f: archivos) {futuro <mylabel> futuro = ejecutor.submit (() -> {return new myLabel (f.getName (), f.getabsolutePath ());}); futures.add (futuro); } // Esperando que todas las cargas concurrentes devuelvan el resultado Try {for (Future <MyLabel> Future: Futures) {MyLabel Icon = Future.get (); Images.add (icono); }} catch (InterruptedException e) {E.PrintStackTrace (); } catch (ExecutionException e) {E.PrintStackTrace (); } // java8 usa la API de transmisión para clasificar la lista <jlabel> sortedList = images.stream (). Sorted (). Coleccions (coleccionadores.tolist ()); regresar sortedlist; } // heredar jlabel e implementar una interfaz comparable para clasificar la clase estática privada de jlabel myLabel extiende jlabel implementos comparables <mylabel> {private estático final long serialversionUid = 1l; nombre de archivo de cadena privada; public myLabel (String FileName, String FullPath) {this.FileName = FileName; // Use miniatura para generar pruebas de miniatura {bufferedImage bufferedImage = thumbnails.of (Papath) .size (100, 120) .asbufferedImage (); Seticon (nuevo Imageicon (BufferedImage)); setPreferredSize (nueva dimensión (100, 120)); } catch (ioException e) {E.PrintStackTrace (); }} @Override public int Compareto (myLabel o) {int resultado = this.filename.compareto (O.FileName); resultado de retorno; }}}Interfaz de swing:
paquete com.lin.imagemgr; import java.awt.borderloyout; 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 extiende jframe {private estático final long SerialVersionUid = 1l; privado JTextfield Pathfield; Privado JButton Showbtn; JPANEL ContentPanel privado JPANEL; public void init () {jpanel toppanel = new JPanel (new FlowLayout (FlowLayout.Lft, 5, 0)); toppanel.setPreferedSize (nueva dimensión (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 (nuevo FlowLayout (FlowLayout.Lft, 5, 5)); contentPanel.setPreferedSize (nueva dimensión (750, 1800)); JscrollPane jsp = new JScrollPane (contentPanel); getContentPane (). add (borderLayout.center, jsp); showbtn.addactionListener ((e) -> {try {loadImages ();} catch (excepción ex) {ex.printstackTrace ();}}); setSize (800, 650); setDefaultCloseOperation (jframe.exit_on_close); setLocationrelativeto (nulo); setVisible (verdadero); } public void loadImages () {contentPanel.removeAll (); String path = pathfield.gettext (); Long Start = System.CurrentTimemillis (); List <jlabel> images = imagemgr.getInstance (). LoadImages (ruta); for (etiqueta jlabel: imágenes) {contentPanel.add (etiqueta); } contentPanel.updateui (); Long End = System.CurrentTimemillis (); System.out.println ("Cargar requiere" + (finalizar - inicio) + "milisegundos!"); } public static void main (string [] args) {new mainframe (). init (); }}Resultados de ejecución
En mi computadora, tardó 1568 milisegundos en cargar 92 imágenes y convertirlas en la interfaz en total. Puede encontrar una carpeta con muchas imágenes e intentar cargar muchas imágenes.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.