Estoy tratando de desarrollar un juego, el cual tiene dialogos que se muestran en secuencia.
Dentro del jFrame tengo un panel llamado jPanelCuerpo el cual tiene un panel jPortada que muestra la imagen de presentacion.
los dialogos están en secuencia (estos se instancian en un panel de dialogo) y tienen un atributo estado el cual indica (instanciado=0, en ejcución=1 o finalizado=2), además tienen un indice que apunta al dialogo en proceso.
El proceso en segundo plano verifica el estado del dialogo en proceso si esta instanciado, reemplaza el panel de portada por el panel del dialogo y le pone estado en ejecucion, del mismo panel de dialogo tiene un jlabel con un con evento mouseclic que pone el dialogo es estado finalizado,
Cuando el proceso en segundo plano se entera de que cambio el estado a finalizado pasa al siguiente dialogo.
Si ejecuto el programa solo me muestra el primer dialogo, si ejecuto en modo debugger al ir verificando los pasos se cambian los dialogos sin problema.
Es como si al ir paso a paso el proceso tiene el tiempo para realizar los cambios, al correr normal pareciera que solo pone el primer dialogo
Si alguien me puede orientar que puede ser desde ya muy agradecido
Saludos
Javier
Clase runnable que instancio en un thread que guardo como atributo(hiloJ) del jFrame Juego
Código
private Jugar fParent; private Dialogo jpanelJuegoD; // panel para los dialogos (multiples instancias) private Reto jpanelJuegoR; // panel para los retos (multiples instancias) private SieteYMedio jpanelJuegoS; // panel para el siete y medio private EntradaPc jpanelJuegoH; // panel para el hackeo private int ultimoTSuceso; // indica el último suceso ejecutado fParent=fp; jPanelCuerpo=jpanel; } @Override public void run(){ int tipoSuceso; boolean lupdateui=false; boolean linstancio=false; ultimoTSuceso=0; // tengo que recorrer el array de los sucesos del escenario, tomando // en cuenta el estado del escenario si no termino y el estado del suceso // si el estado del escenario indica que termino finalizo ya que puedo desde otra // parte indicar que termine // si el estado del suceso es que esta instanciado invoco al evento correspondiente // actualizando el estado del suceso a estado en ejecución // si el estado del suceso esta en ejecucion no hago nada, espero a que cambie // su estado desde otra parte del juego // si el estado del suceso es finalizado paso al siguiente y si no hay un siguiente // pongo en el estado de escenario fin y salgo del while while (true){ // si el escenario se marco como terminado salgo del while if (fParent.getEscenario().getEstado()==Sistema.EEND) { break; } // si el suceso instanciado termino if (fParent.getEscenario().getCurrentSuceso().getEstado()==Sistema.EEND) { // si no hay un siguiente suceso pongo en el escenario el atributo estdo como terminado y salgo del while if (!(fParent.getEscenario().setNextIndice())){ fParent.getEscenario().setEstado(Sistema.EEND); break; } } // si el suceso esta en estado creado if (fParent.getEscenario().getCurrentSuceso().getEstado()==Sistema.ECREADO) { // pongo a false linstacio linstancio=false; // vemos segun el tipo de suceso si ya instanciado el objeto o sino lo instancio // almaceno el tipo del suceso en curso tipoSuceso=fParent.getEscenario().getCurrentSuceso().getTipoSuceso(); switch (tipoSuceso){ // Dialogos case Sistema.DIALOGO: // si no esta instanciado el objeto panel dialogo lo instancio // sino actualizo los componentes if (jpanelJuegoD==null){ jpanelJuegoD = new Dialogo(fParent); linstancio=true; } break; // Retos case Sistema.DESAFIO: if (jpanelJuegoR==null){ jpanelJuegoR = new Reto((Jugar)fParent); linstancio=true; } break; // Siete y Medio case Sistema.OBJETIVO_SIETEYMEDIO: // si es objetivo hay que ver si es siete y medio o hackeo if (jpanelJuegoS==null){ jpanelJuegoS = new SieteYMedio((Jugar) fParent); linstancio=true; } break; // por defecto si no es uno de los sucesos anteriores es el hackeo default: if (jpanelJuegoS==null){ jpanelJuegoH = new EntradaPc((Jugar) fParent, jPanelCuerpo); linstancio=true; } break; } // si el suceso a ejecutarse es distinto al que su anterior verifico // que quede un solo componente en jPanelCuerpo if ((tipoSuceso!=ultimoTSuceso) && (jPanelCuerpo.getComponentCount()>1)){ jPanelCuerpo.remove(0); lupdateui=true; } // tengo que poner el setvisible del panel portada en false si esta visible if (jPanelCuerpo.getComponent(jPanelCuerpo.getComponentCount()-1).isVisible()){ jPanelCuerpo.getComponent(jPanelCuerpo.getComponentCount()-1).setVisible(false); } // si es un DIALOGO, hay multiples DIALOGOS if (Sistema.DIALOGO==tipoSuceso){ if (tipoSuceso!=ultimoTSuceso) { // fParent.cambiarPanel(jpanelJuegoD); jPanelCuerpo.add(jpanelJuegoD, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 870, 525),0); // hago visible el jpanelJuego jPanelCuerpo.getComponent(0).setVisible(true); if (!linstancio){ jpanelJuegoD.updatePanel(); } } // si el suceso es del mismo tipo quel anteriior solo actualizo para el suceso los componentes else { jpanelJuegoD.updatePanel(); } } // si es un DESAFIO, hay multiples DESAFIOS else if(Sistema.DESAFIO==tipoSuceso){ if (tipoSuceso!=ultimoTSuceso) { jPanelCuerpo.add(jpanelJuegoR, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 870, 525),0); // hago visible el jpanelJuego jpanelJuegoR.setVisible(true); if (!linstancio){ jpanelJuegoR.updatePanel(); } } // si el suceso es del mismo tipo quel anteriior solo actualizo para el suceso los componentes else { jpanelJuegoR.updatePanel(); } } // si es el objetivo SIETE Y MEDIO solo hay UNA INSTANCIA else if(Sistema.OBJETIVO_SIETEYMEDIO==tipoSuceso){ jPanelCuerpo.add(jpanelJuegoS, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 870, 525),0); // hago visible el jpanelJuego jpanelJuegoS.setVisible(true); } // sino solo puede ser el HACKEO, solo hay UNA INSTANCIA else{ jPanelCuerpo.add(jpanelJuegoH, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 870, 525),0); // hago visible el jpanelJuego jpanelJuegoH.setVisible(true); } // indico que se esta ejecutando fParent.getEscenario().getCurrentSuceso().setEstado(Sistema.ERUN); // cargo la fecha de inicio ultimoTSuceso=tipoSuceso; jPanelCuerpo.invalidate(); jPanelCuerpo.updateUI(); try { // pongo a dormir el hilo del procesos fParent.getHiloJ().sleep(20); Logger.getLogger(EjecutarSuceso.class.getName()).log(Level.SEVERE, null, ex); } } } } }