jueves, 2 de mayo de 2013

Refrescar un JPanel

Buenas amigos, hace tiempo un compañero me pregunto como refrescar el fondo de un JPanel, que le estaba resultando complicado, y últimamente por la red me estoy encontrado hilos sobre gente que no sabe refrescar bien el fondo de un JPanel. Bien, no es algo complicado, ni mucho menos, pero le haremos un mini-tutorial para aquellos que tengan dudas.
 Bien, para empezar vamos a ir a google o donde queráis y a descargar 2 imágenes  las cuales introduciremos dentro de la carpeta src de nuestro proyecto, posteriormente crearemos una clase que herede de JFrame. En ella, incrustaremos un panel para nuestra imagen y un botón que al ser pulsado cambiará nuestra imagen de fondo. Nos debería quedar mas o menos así:


Ahora, creamos una clase "Panel" que herede de JPanel, al cual le deberemos de pasar la url para que el método Graphics nos lo pinte en nuestro panel:



Como veis  ya no le paso la url por constructor, si no que por medio de un "set" le establezco el valor que va a tener url, aquí es donde más pifias he visto, ya que la gente suele introducir la url por constructor, y al intentar refrescar el panel, se le vuelve a crear un nuevo panel, con lo cual resulta un poco fastidioso.

Vamos a volver a la clase anterior, donde tenemos nuestra JFrame, y modificamos nuestro JPanel, en vez de poner JPanel, le ponemos Panel para que nos cargue nuestra clase:


Así es como he dejado yo el Panel, lo he creado, le he pasado la url de mi imagen al Panel, le he puesto un borde con titulo, la posición del Panel, y agregarlo.

Hecho esto, agregamos un evento al botón para que cuando se pulse nos cambie nuestra imagen de fondo:

Bueno, en el evento del botón hacemos lo siguiente:
    • Establezco la nueva ruta de la url
    • Le cambio el nombre al borde(es una pijaica mía, podéis pasar de él)
    • Establezco el nuevo borde para el Panel.
    • Actualizo el panel.
      • panel.updateUI(); este es el método que hay que utilizar para actualizar el panel.
Y ya está, si habéis hecho bien los pasos, os debería de cambiar la imagen de fondo al pulsar el botón.

Aquí mi resultado:


Aquí os dejo la clase con el JFrame:


Un saludo a todos, esto no tiene más historia.

5 comentarios:

  1. me encima la imagen en mis jlabel y en mis cuadros de texto. AYUDA PLIS

    package inicio;

    import java.awt.Color;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;

    public class Inicio extends JFrame {

    public boolean valerroru=false;
    public boolean valerrorp=false;
    public boolean valcorrectu=false;
    public boolean valcorrectp=false;
    public Image fondo;

    public Inicio()
    {
    setSize(500,650);
    setVisible(true);
    setLocation(500,50);
    setTitle("Inicio de sesion");

    PanelFondo pf= new PanelFondo();
    pf.setUrl("/img/fondo.png");
    getContentPane().add(pf);

    ImageIcon ferror= new ImageIcon(getClass().getResource("/img/error2.png"));
    ImageIcon fcorrect= new ImageIcon(getClass().getResource("/img/correcto.png"));

    JLabel usuario= new JLabel("Usuario:");
    usuario.setBounds(150,250, 50,20);


    JLabel error= new JLabel();
    error.setBounds(118,273, 30,30);
    error.setIcon(ferror);
    error.setVisible(false);

    JLabel correct= new JLabel();
    correct.setBounds(118,273, 30,30);
    correct.setIcon(fcorrect);
    correct.setVisible(false);

    JTextField campo1= new JTextField();
    campo1.setBounds(150,275, 190,30);

    JLabel contraseña= new JLabel("Contraseña:");
    contraseña.setBounds(150,320, 190,30);

    JLabel error2= new JLabel();
    error2.setBounds(118,347, 30,30);
    error2.setIcon(ferror);
    error2.setVisible(false);

    JLabel correct2= new JLabel();
    correct2.setBounds(118,347, 30,30);
    correct2.setIcon(fcorrect);
    correct2.setVisible(false);

    JPasswordField campo2= new JPasswordField();
    campo2.setBounds(150,350, 190,30);



    ImageIcon flecha= new ImageIcon(getClass().getResource("/img/flecha.png"));
    JButton aceptar= new JButton();
    aceptar.setIcon(flecha);
    aceptar.setBounds(170,440, 150,40);
    aceptar.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent event)
    {

    String user=campo1.getText();
    String password= campo2.getText();

    System.out.println(user);
    System.out.println(password);
    validar(user,password);

    if (valcorrectu==true){
    correct.setVisible(true);
    error.setVisible(false);
    }
    if (valcorrectp==true){
    correct2.setVisible(true);
    error2.setVisible(false);

    }
    if (valerroru==true){
    error.setVisible(true);
    correct.setVisible(false);
    }
    if (valerrorp==true){
    error2.setVisible(true);
    correct2.setVisible(false);

    }repaint();
    }

    });

    JPanel todo= new JPanel();

    todo.setLayout(null);

    todo.add(usuario);
    todo.add(error);
    todo.add(error2);
    todo.add(correct);
    todo.add(correct2);
    todo.add(campo1);
    todo.add(contraseña);
    todo.add(campo2);
    todo.add(aceptar);

    add(todo);


    }

    public String validar(String usuario, String password)
    {

    String[][] users = new String [5][2];
    users[0][0]="IDURAN";
    users[0][1]="123";
    String mensaje="";
    String msnusuario="";
    String msnpss="";

    for(int i=0; i<users.length; i++)
    {
    if (usuario.equals(users[i][0]) && password.equals(users[i][1])){
    mensaje="Bienvenido";
    valcorrectu=true;
    valcorrectp=true;
    valerrorp=false;
    valerroru=false;
    break;
    }else{
    mensaje="usuario y/o password incorrecto";
    }
    }
    System.out.println(mensaje);
    System.out.println(msnusuario);
    System.out.println(msnpss);
    return "";
    }
    }

    ResponderEliminar
  2. excelente!!!! gracias por el post

    ResponderEliminar
  3. Muy bueno king , me sirvio de mucho

    ResponderEliminar