package docen_swing;

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JApplet;
import javax.swing.JComboBox;
import javax.swing.ImageIcon;
import javax.swing.BorderFactory;
import java.net.MalformedURLException;
import java.io.IOException;
import java.net.URL;

/*****************************************************************************
 * Applet que tiene un combo con nombres de imágenes.
 * En la JLabel (etiqueta_imagen) se situa la imagen (ImageIcon).
 * En el combo ponemos los nombres de las imágenes.
 * Las imágenes se obtienen desde un archivo jar y se cargan en un array ImageIcon.
 * Atrapamos el evento de cambio de selección del combo, con la finalidad de mostrar
 * la imagen correspondiente al item seleccionado.
 *****************************************************************************/
public class visor extends JApplet {

  JComboBox combo = new JComboBox();          // Combo donde están los nombres de imágenes
  JLabel etiqueta_imagen = new JLabel();      // Etiqueta donde pondremos imagen
  String[] nom_imagenes = {"casa", "mar" };   // Nombres de los archivos de imágenes
  ImageIcon[] imagenes = new ImageIcon[nom_imagenes.length]; // vector de imagenes

  public void init() {
    try {  jbInit(); }
    catch ( Exception e ) {  e.printStackTrace();  }
  }

  /*******************************************************************
   * Inicialización de componentes
   ******************************************************************/
  private void jbInit() throws Exception {

    /*** Obtengo el panel raíz y le asignno un administrador de diseño FlowLayout ***/
    Container contenedor_applet = getContentPane();
    contenedor_applet.setLayout( new FlowLayout() );

    /*** Definimos aspecto y listener del combo. Etiqueta: borde y tamaño ***/
    combo.setPreferredSize(new Dimension(150, 21));
    combo.addActionListener(new visor_combo_actionAdapter(this));
    etiqueta_imagen.setBorder( BorderFactory.createRaisedBevelBorder());
    etiqueta_imagen.setPreferredSize(new Dimension(300, 200));

    /*** Llenamos el combo y cargamos imágenes en array ***/
    cargar_combo();
    cargar_imagenes();

    /*** Selección predeterminada: la primera imagen ***/
    etiqueta_imagen.setIcon( imagenes[0]);   // En etiqueta: ponemos la 1ª imagen
    combo.setSelectedIndex( 0 );             // En combo: seleccionado nombre 1º

    /*** Añadimos los componentes al contenedor (Content Pane) ***/
    contenedor_applet.add(combo);
    contenedor_applet.add(etiqueta_imagen);

  }    //////////////////////////// Fin de jbInit()

  /***************************************************************************
   * Pone en combo los nombres de las imágenes
   ***************************************************************************/
  void cargar_combo() {
     for ( int i = 0; i < nom_imagenes.length; i++ )
       combo.addItem( nom_imagenes[i] );
  }

  /****************************************************************************
   * Carga las imagenes almacenadas en archivo JAR. Las imagenes se cargan
   * en el array.
   ****************************************************************************/
  void cargar_imagenes() {
    try {
       URL url_imagen;
       for ( int i = 0; i < nom_imagenes.length; i++ ) {
	  /*** Leer de JAR: obtenemos el URL y cargo imagen en array ***/
	  url_imagen = new URL( "jar:" + getCodeBase().toString() +
				       "imagenes.jar!/" + nom_imagenes[i] + ".JPG" );
  	  imagenes[i] = new ImageIcon( getImage( url_imagen ) );
       }
    }
    catch (MalformedURLException mue) {  // Hija de IOException
       System.out.print("URL inadecuada: ");
       System.out.println(mue.getMessage() );
    }
    catch (IOException ioe) {            // Hija de Exception
	System.out.print("IOException: ");
	System.out.println(ioe.getMessage() );
    }
    catch (Exception e) {
       System.out.print("Excepción general: cargar_imagenes(). ");
       System.out.println(e.getMessage());
    }
  }

  /*******************************************************************
   * Gestión de evento de cambio de selección en combo: cambia la imagen de
   * la etiqueta
   *******************************************************************/
  void combo_actionPerformed(ActionEvent e) {
      int indice_seleccionado = combo.getSelectedIndex();
      etiqueta_imagen.setIcon( imagenes[indice_seleccionado]);
   }

}    ////////////////////// Fin de clase \\\\\\\\\\\\\\\\\\\\\\\\\\\\

/***************************************************************************
 * Listener del combo
 **************************************************************************/
class visor_combo_actionAdapter implements java.awt.event.ActionListener {
   visor adaptee;

   visor_combo_actionAdapter(visor adaptee) {
      this.adaptee = adaptee;
   }
   public void actionPerformed(ActionEvent e) {
      adaptee.combo_actionPerformed(e);
   }
}


