JList con Imagenes Auto Ajustadas sin deformacion – Java

JList con Imagenes Auto Ajustadas sin deformacion – Java

El dia de hoy veremos como crearnos un JList con Imagenes Auto ajustadas que no se se deformaran ni estiraran sino que se mostraran con su tamaño real dependiendo obviamente del tamaño de su contenedor de forma que ocupen el mismo ancho y alto. En mi caso lo necesito para mostrarme un preview de imagenes que se procesaran mas adelante pero es necesario que se muestren las vistas previas tal y como estan sin presentar ninguna deformacion y con las proporciones reales. Veamos entonces como realizar una lista de imagenes en java mediante un ejemplo tomado de una aplicacion real que lo requeri asi en su momento..

Lo que haremos..

Como ya dijimos requerimos mostrar un preview de imagenes en el que se vayan agregando imagenes y se muestren en tamaño reducido pero con proporciones reales, basicamente las 2 cosas que haremos seran

  • Mostrar imagenes en un JList.
  • Redimensionar las imagenes de tal manera que se ajusten al tamaño de su contenedor sin mostrar deformacion o estirarse.

Podria seguir hablandote de lo que haremos aqui o mejor te lo muestro en un video corto :yum: . . .

JList con Imagenes

lista = new JList();
lista.setCellRenderer(new ImageListCellRenderer());

la clase ImageListCellRenderer es para cambiar el color de background de la seleccion


¿Sabías que?

¿Necesitas aprender algo nuevo ? Ve a Udemy, busca el tema del que quieres aprender, selecciona el curso para ti y continua con tu aprendizaje.

Udemy

public class ImageListCellRenderer implements ListCellRenderer{

@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof JPanel)
{
Component component = (Component) value;
component.setForeground (Color.white);
component.setBackground (isSelected ? UIManager.getColor("Table.focusCellForeground") : Color.white);
if(isSelected){
component.setBackground(new Color(200, 217, 221));
}
return component;
}
else
{
return new JLabel("????");
}
}

}

 

// paths es un ArrayList con las rutas de las imagenes
 // scroll es un JScrollPane
 // dimension es un Objecto Dimension con las dimensiones de la pantalla
 
 paneles=new ArrayList<JPanel>();
 JPanel panel;
 Image imagen=null;
 ImageIcon icon;
 ImageIcon imageicon;
 JLabel texto;
 boolean masdeciencuenta = false;
 for(int i=0; i<paths.size(); i++){
 if(i<50){
 if(!new File(paths.get(i)).exists()){
 JOptionPane.showMessageDialog(MainWindow.this, "La imagen "+new File(paths.get(i)).getName()+" ya no esta disponible en n"+paths.get(i),"Archivo no existe.", JOptionPane.ERROR_MESSAGE);
 paths.remove(i);
 i--;
 }else{
 try {
 imagen = ImageIO.read(new File(paths.get(i)));
 } catch (IOException ex) {
 Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
 }
 try{
 icon = new ImageIcon(imagen);
 if(imagen.getWidth(null) >= imagen.getHeight(null)){
 // SI LA IMAGEN ES MAS ANCHA QUE ALTA 
 imageicon = new ImageIcon(icon.getImage().getScaledInstance(150, -1,java.awt.Image.SCALE_AREA_AVERAGING)); 
 if(imageicon.getImage().getHeight(null) > 175){
 imageicon = new ImageIcon(icon.getImage().getScaledInstance(-1, 175,java.awt.Image.SCALE_AREA_AVERAGING));
 }
 }else{
 // SI LA IMAGEN ES MAS ALTA QUE ANCHA
 imageicon = new ImageIcon(icon.getImage().getScaledInstance(-1, 175, java.awt.Image.SCALE_AREA_AVERAGING)); 
 if(imageicon.getImage().getWidth(null) > 150){
 imageicon = new ImageIcon(imageicon.getImage().getScaledInstance(150, -1, java.awt.Image.SCALE_AREA_AVERAGING)); 
 }
 }
 texto = new JLabel(new File(paths.get(i)).getName(),imageicon,JLabel.LEFT);
 texto.setHorizontalTextPosition(JLabel.CENTER);
 texto.setVerticalTextPosition(JLabel.BOTTOM);
 texto.setMinimumSize(new Dimension(150,200));
 texto.setPreferredSize(new Dimension(150,200));

 panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
 panel.add(texto);

 paneles.add(panel);
 masdeciencuenta=false;
 }catch(Exception err){
 JOptionPane.showMessageDialog(MainWindow.this, "Error al crear preview de "+paths.get(i),"Algo va mal..", JOptionPane.ERROR_MESSAGE);
 }
 }
 }else{
 masdeciencuenta=true;
 }
 }
 if(masdeciencuenta)
 JOptionPane.showMessageDialog(MainWindow.this, "Mostrando vista previa de unicamente las primeras 50 imágenes.", "Atencion!", JOptionPane.INFORMATION_MESSAGE);
 lista.setListData(paneles.toArray());

 lista.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
 lista.setLayoutOrientation(JList.HORIZONTAL_WRAP);
 lista.setAutoscrolls(true);
 lista.setVisibleRowCount(-1);
 lista.setFixedCellHeight(200);
 scroll = new JScrollPane(lista);
 Dimension dim2 = dimension;
 scroll.setMinimumSize(dim2);
 scroll.setPreferredSize(dim2);
 scroll.setBorder(null);
 updateJlist();

y el metodo updateJList unicamente refresca la pantalla con los metodos repaint y updateUI de los componentes involucrados ( el jlist y panel que lo contiene ) :yum:

Redimensionar Imagenes sin Deformarlas

Esto se hace en el siguiente codigo.. Teniendo en cuenta que la variable imagen es un objeto Image y que queremos que se ajuste a un tamaño de 150 x 175.. ( el -1 permite que se ajuste automaticamente :yum: )

icon = new ImageIcon(imagen);
if(imagen.getWidth(null) >= imagen.getHeight(null)){
// SI LA IMAGEN ES MAS ANCHA QUE ALTA
imageicon = new ImageIcon(icon.getImage().getScaledInstance(150, -1,java.awt.Image.SCALE_AREA_AVERAGING)); 
if(imageicon.getImage().getHeight(null) > 175){
imageicon = new ImageIcon(icon.getImage().getScaledInstance(-1, 175,java.awt.Image.SCALE_AREA_AVERAGING));
}
}else{
// SI LA IMAGEN ES MAS ALTA QUE ANCHA
imageicon = new ImageIcon(icon.getImage().getScaledInstance(-1, 175, java.awt.Image.SCALE_AREA_AVERAGING)); 
if(imageicon.getImage().getWidth(null) > 150){
imageicon = new ImageIcon(imageicon.getImage().getScaledInstance(150, -1, java.awt.Image.SCALE_AREA_AVERAGING)); 
}
}
texto = new JLabel(new File(paths.get(i)).getName(),imageicon,JLabel.LEFT);

y eso es todo! facil no? no? comentame tu duda y si te sirvio regalame un +1, like, tweet o comparte! :yum:

JList con Imagenes Auto Ajustadas sin deformacion

Clic para valorar esta información
[Total: 0 Promedio: 0]