import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Color;
import java.net.URL;

// CLASE PRINCIPAL
public class Botones_Fotos2 extends JFrame implements ActionListener {

   // VARIABLES A NIVEL DE CLASE

   /* Container es un componente genérico AWT que puede contener otros componentes AWT
   *
   * Swing proporciona 3 contenedores de primer nivel: JFrame, JDialog y JApplet,
   * cada uno de ellos contiene un panel raíz (JRootPane) con varios elementos:
   * - panel de contenido (contentPane): los componentes visibles del contenedor de primer nivelexcepto barra de menú, por defecto tiene BorderLayout()
   * - barra de menú (menuBar): es opcional, está fuera de contentPane
   * - panel de cristal (glassPane): por encima de menuBar y contentPane, está oculto por defecto y se encarga de interceptar acciones del usuario para JRootPane:
   *
   * No se puede añadir elementos directamente a JRootPane:
   * rootPane.add(elemento); --> NO
   * hay que añadirlos al contentPane de rootPane con el método getContentPane():
   * rootPane.getContentPane().add(elemento); --> SI
   *
   * Para añadir elementos a un Frame: Frame.getContentPane().add(elemento);
   *
   * getContentPane() devuelve un objeto Container, no un objeto JComponent
   * por ello es conveniente crear un componente personalizado para usar como contentPane;
   *
   * Para usar un componente como contentPane:
   *
   * crear un panel y añadirle componentes:
   * JPanel panel = new JPanel(new BorderLayout());
   * panel.setBorder(elegirBorde);
   * panel.add(unComponente, BorderLayout.CENTER);
   * panel.add(otroComponente, BorderLayout.PAGE_END);
   *
   * hacer que panel sea contentPane de un contenedor de nivel superior:
   * panel.setOpaque(true);
   * topLevelContainer.setContentPane(panel);
   *
   * panel1 es el contenedor de todos los elementos de la ventana */
   //private Container panel1 = getContentPane();
   private JPanel panel1 = new JPanel(new BorderLayout());

   // panel para la etiqueta rutaLabel y pBotones
   private JPanel panelSup = new JPanel(new GridLayout(2,0));
   // panel que agrupa los botones superiores
   private JPanel pBotones = new JPanel(new GridLayout(1,0));
   // panel para la etiqueta rutaLabel
   private JPanel pLabel = new JPanel();
   // panel para los botones inferiores
   private JPanel pBotones2 = new JPanel(new GridLayout(1,0));


   // Array de botones con el nombre de la imagen en cada uno de ellos
   private JButton[] strBotones =  {new JButton("Pelosas"), 
                         new JButton("Tux"),
                         new JButton("Ctr"),
                         new JButton("Gato"),
                         new JButton("Milu")};   

   // fuente para botones y etiqueta
   Font letra = new Font("Verdana", Font.BOLD, 12);

   // etiqueta para mostrar las imágenes JPG
   private JLabel imgLabel = new JLabel();

   // etiqueta para mostrar la ruta a los archivos
   private JLabel rutaLabel = new JLabel();

   // botones de la parte inferior
   private JButton Codigo = new JButton("Archivo fuente java");
   private JButton Salir = new JButton("Salir del programa");

   // String para mostrar en el cuadro de diálogo
   //String txtLabel = new String();

   /* String foto para usar en setLabelPicture()
   * coincide con el nombre de la imagen JPG y con el texto del botón
   * esta imagen aparece al arrancar el programa */
   private String nombreFoto = "Milu";


   // MÉTODO DE ENTRADA AL PROGRAMA
   public static void main(String[] args) {
     // decoración Java
     //JFrame.setDefaultLookAndFeelDecorated(true);
     // instancia de la clase principal, hereda JFrame
     new Botones_Fotos2();
   }


   // MÉTODO CONSTRUCTOR QUE CREA Y MUESTRA LA INTERFAZ
   public Botones_Fotos2() {
   
     /* la variable especial this se usa en métodos de instancia
     * para hacer referencia al objeto que contiene al método,
     * aquí equivale a JFrame */

     // lo que pasa al cerrar la ventana: salir del programa
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     // mostrar los botones inferiores, configurar la fuente y enlazarlos con addActionListener
     Codigo.setActionCommand ("Codigo");
     Codigo.addActionListener(this);

     Salir.setActionCommand ("Salir");
     Salir.addActionListener(this);

     // mostrar los botones superiores, configurar la fuente y enlazarlos con addActionListener
     for(int i = 0; i < strBotones.length; i++) {
       pBotones.add(strBotones[i]);
       strBotones[i].setFont(letra);
       strBotones[i].addActionListener(this);
       }

     // configurar la etiqueta imgLabel
     imgLabel.setHorizontalAlignment(JLabel.CENTER);
     imgLabel.setOpaque(true);
     imgLabel.setBackground(Color.gray);

     // configurar la etiqueta rutaLabel
     rutaLabel.setHorizontalAlignment(JLabel.CENTER);
     rutaLabel.setFont(new java.awt.Font("Arial", Font.PLAIN, 10));

     // etiqueta para mostrar el código que añade los botones
     /*txtLabel = "for(int i = 0; i < strBotones.length; i++)\n"+
            "{\n"+
            "pBotones.add(strBotones[i]);\n"+
            "strBotones[i].setFont(letra);\n"+
            "strBotones[i].addActionListener(this);\n"+
            "}"; */


     /* colocar elementos en los paneles
     * panel1 es contentPane del JFrame */
     panel1.setOpaque(true);
     this.setContentPane(panel1);

     //pLabel.setBorder(BorderFactory.createLineBorder(Color.red, 1));

     panel1.add(panelSup, BorderLayout.NORTH);
     panelSup.add(pBotones);
     panelSup.add(pLabel);

     panel1.add(imgLabel, BorderLayout.CENTER);
     panel1.add(pBotones2, BorderLayout.SOUTH);
     pBotones2.add(Codigo);
     pBotones2.add(Salir);
     pLabel.add(rutaLabel);

     // mostrar la ventana
     this.setTitle("Botones y Fotos");
     this.setSize(new Dimension(600,540));
     // ajustar el marco a sus contenedores
     //this.pack();
     // centrar el formulario en la pantalla
     this.setLocationRelativeTo(null);
     this.setResizable(false);
     this.setVisible(true);

     /* llamar aquí al método setLabelPicture() si se prefiere
     * que el programa arranque ya con una imagen en la etiqueta */
     //setLabelPicture();
   }
   
   // MOSTRAR LA IMAGEN EN LA ETIQUETA
   private void setLabelPicture() {
     imgLabel.setText("");
     // texto del botón con extensión jpg = nombre del archivo JPG
     String nombreCompleto = "img/" + nombreFoto + ".jpg";
     /* buscar el archivo JPG dentro del archivo JAR,
     * para poder usar la clase URL hay que importar el paquete java.net.URL */
     URL url = this.getClass().getResource( nombreCompleto );
     /* informar de la ruta a la imagen seleccionada, para observar
     * las distintas formas de presentación de URL */
     rutaLabel.setText("" + url);
     //JOptionPane.showMessageDialog(null, "Ruta a la imagen seleccionada: " + url, "URL de la imagen", JOptionPane.PLAIN_MESSAGE);
     // JLabel.setIcon(Icono icono) define el icono mostrado en la etiqueta, centrado en horizontal y en vertical
     imgLabel.setIcon(new ImageIcon(url));
}

   // LO QUE SUCEDE AL PULSAR UNO DE LOS BOTONES
   public void actionPerformed(ActionEvent e) {
    /* si se ha pulsado en el botón Dialogo (si ActionCommand es Codigo)
    * mostrar la ventana con código Java */
   if ("Codigo".equals(e.getActionCommand())) {   
     // mostrar un objeto Botones_Fotos2_code, es el marco para la 2ª ventana
     Botones_Fotos2_code codeForm = new Botones_Fotos2_code();
     codeForm.show(); }
     //JOptionPane.showMessageDialog(null, txtLabel, "Crear botones", JOptionPane.PLAIN_MESSAGE); }
    // si se ha pulsado en el botón Salir (si ActionCommand es Salir)
   else if ("Salir".equals(e.getActionCommand())) {
     System.exit(0); }   
   // si se ha pulsado en cualquier otro botón
   else {
     /* e.getActionCommand() equivale al texto del botón
     * para pasarle al método e.getActionCommand() el nombre de la imagen
     * que es texto del botón.jpg */
     nombreFoto = e.getActionCommand();
     setLabelPicture(); }
   }

}