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

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

// 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 imagenes 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");

// Cadena para usar en setLabelPicture(), coincide con el nombre de la imagen JPG y con el texto del boton
private String nombreFoto;

// METODO DE ENTRADA AL PROGRAMA
public static void main(String[] args) {
    // decoracion Java
    //JFrame.setDefaultLookAndFeelDecorated(true);
    // instancia de la clase principal, hereda JFrame
    new Botones_fotos();
}

// METODO CONSTRUCTOR QUE CREA Y MUESTRA LA INTERFAZ
public Botones_fotos() {

// la variable especial this se usa en metodos de instancia para hacer referencia al objeto 
// que contiene al metodo. Aqui equivale a la ventana (JFrame)
// lo que pasa al cerrar la ventana: salir del programa
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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

// rellenar los paneles
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 los botones inferiores, configurar la fuente y enlazarlos con addActionListener
Codigo.setActionCommand ("Codigo");
//Codigo.setBackground(new Color(220,220,220)); 
Codigo.addActionListener(this);

Salir.setActionCommand ("Salir");
//Salir.setBackground(new Color(220,220,220)); 
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].setBackground(new Color(220,220,220));
    strBotones[i].addActionListener(this);
}

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

// configurar la etiqueta rutaLabel
rutaLabel.setHorizontalAlignment(JLabel.CENTER);
rutaLabel.setFont(new java.awt.Font("Arial", Font.PLAIN, 12));
//rutaLabel.setBackground(new Color(220,220,220)); 
//rutaLabel.setSize(560,124);
//rutaLabel.setBorder(BorderFactory.createLineBorder(Color.black, 1));


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

// llamar al metodo setLabelPicture() si se prefiere que el programa arranque ya con imagen cargada
// comentar las 2 lineas si se prefiere que arranque vacio sin imagen cargada
nombreFoto = "Pelosas";     //  imagen que aparece al arrancar el programa
setLabelPicture();
}

// MOSTRAR LA IMAGEN EN LA ETIQUETA
private void setLabelPicture() {
imgLabel.setText("");
// texto del boton con extension 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 );
String urlS = url.toString();
// Java coloca los caracteres %20 en lugar de los espacios en blanco de la ruta, se quitan para mejorar su aspecto
urlS = urlS.replace("%20"," ");

// informar de la ruta a la imagen seleccionada, para ver la presentacion de URL
rutaLabel.setText("" + urlS);
// informar tambien con cuadro de mensaje
//JOptionPane.showMessageDialog(null, "Ruta a la imagen seleccionada: " + urlS, "URL de la imagen", JOptionPane.PLAIN_MESSAGE);
// JLabel.setIcon(Icon) 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 boton con el texto Archivo fuente Java, es decir,
// si ActionCommand es Codigo, mostrar la ventana con codigo Java
if ("Codigo".equals(e.getActionCommand())) {    
    // mostrar un objeto Botones_fotos_code, es el marco para la segunda ventana
    Botones_fotos_code codeForm = new Botones_fotos_code();
    //codeForm.show(); } --> obsoleto
    codeForm.setVisible(true); }
    // si se ha pulsado en el boton Salir (si ActionCommand es Salir)
else if ("Salir".equals(e.getActionCommand())) {
    System.exit(0); }    
    // si se ha pulsado en cualquier otro boton
else {
    /// e.getActionCommand() equivale al texto del boton para pasarle al metodo e.getActionCommand()
    // el nombre de la imagen que es el texto del boton on extension jpg
    nombreFoto = e.getActionCommand();
    setLabelPicture(); }
}

}