Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Primer JPanel no visible, segundo JPanel si visible

No se que me faltaria aqui porque el primer JPanel que es paneljuego1, no me sale en pantalla al hacer pausa. Al finalizar el programa, el segundo JPanel es el unico que me sale. Gracias por vuestra ayuda.

package minaveespacial;

import java.awt.EventQueue;

public class Ejecuta {

Marco marco;
PanelJuego paneljuego1;
PanelJuego paneljuego2;

PintaYEjecuta pintayejecuta1;
PintaYEjecuta2 pintayejecuta2;

public Ejecuta(){
marco = new Marco();
paneljuego1 = new PanelJuego();
paneljuego2 = new PanelJuego();

pintayejecuta1 = new PintaYEjecuta();
pintayejecuta2 = new PintaYEjecuta2();

programa();
}


public void programa(){
marco.setBounds(0,0,800,600);
pintayejecuta1.setBounds(0,0,800,600); // FALTABA ESTA LINEAAAAAAAAA MIRALO CON DEbug
pintayejecuta2.setBounds(0,0,800,600); // FALTABA ESTA LINEAAAAAAAAA MIRALO CON DEbug


// meto el primero
paneljuego1.add(pintayejecuta1);
marco.getContentPane().add(paneljuego1);
// lo veo ya
marco.setVisible(true);
// refresco porque no aparece nada en debug
paneljuego1.updateUI();


// pruebo a pausarlo
try {
Thread.sleep (2000);
} catch (Exception e) {
// Mensaje en caso de que falle
}



// quito el primero
marco.getContentPane().remove(paneljuego1);

// meto el segundo
paneljuego2.add(pintayejecuta2);
marco.getContentPane().add(paneljuego2);

// refresco porque no aparece nada en debug
paneljuego2.updateUI();

// pruebo a pausarlo
try {
Thread.sleep (2000);
} catch (Exception e) {
// Mensaje en caso de que falle
}


}

// metodo main que usa EventQueue para crear un objeto
public static void main(String[] args) {

// import java.awt.EventQueue;
EventQueue.invokeLater(new Runnable() {
public void run() {
Ejecuta ejecuta = new Ejecuta();
ejecuta.marco.setVisible(true);
}
}
); // aqui se cierra el () del .invokeLater()
}
}

junio 25, 2016 | Unregistered CommenterNovato

Como ejecutas el programa desde el hilo de la cola de eventos (que esto NO está mal, cabe mencionar) no se repinta el primero porque sólo lo hará hasta el final (no importa que hayas intentado repintarlo antes), y al final sólo repinta paneljuego2 porque es el que está agregado al panel obtenido desde marco.getContentPane().
Puedes hacer que el primer panel sea remplazado por el segundo y dibujado si haces que esa parte del código se invoque después, cuando el primero haya sido repintado:

public void programa() {
marco.setBounds(0, 0, 800, 600);
pintayejecuta1.setBounds(0, 0, 800, 600); // FALTABA ESTA LINEAAAAAAAAA
// MIRALO CON DEbug
pintayejecuta2.setBounds(0, 0, 800, 600); // FALTABA ESTA LINEAAAAAAAAA
// MIRALO CON DEbug
// meto el primero
paneljuego1.add(pintayejecuta1);
marco.getContentPane().add(paneljuego1);

// lo veo ya
marco.setVisible(true);

// refresco porque no aparece nada en debug
paneljuego1.updateUI();

Runnable runnable = () -> {

// pruebo a pausarlo
try {
Thread.sleep(2000);
} catch (Exception e) {
// Mensaje en caso de que falle
}

// quito el primero
marco.getContentPane().remove(paneljuego1);

// meto el segundo
paneljuego2.add(pintayejecuta2);
marco.getContentPane().add(paneljuego2);

// refresco porque no aparece nada en debug
paneljuego2.updateUI();

// pruebo a pausarlo
try {
Thread.sleep(2000);
} catch (Exception e) {
// Mensaje en caso de que falle
}
};

SwingUtilities.invokeLater(runnable); // puedes utilizar también esto en lugar de EventQueue
}

junio 26, 2016 | Registered Commenterangelns