Threads y Ventanas
Publicado por Juande (2 intervenciones) el 15/03/2005 12:29:33
No me acabo de aclarar con los threads, con los notify(), wait() ni suspend()...
Resulta que tengo una ventana que al pulsar un boton llama a una funcion que me crea otra ventana ( de otra clase que implementa Runnable ).
La funcion de la clase original es esta :
public void nuevo() {
if( area.getText().length() > 1 ) {
VentConfirmacion vc = new VentConfirmacion("Existe un documento abierto",
"Desea guardar los canvios del actual documento ?");
Thread confirma = new Thread(vc);
confirma.start();
while(confirma.isAlive()) {
//System.out.println("v");
}
System.out.println("Devuelve control");
if( vc.respuesta() == 1) {
try {
guardaFitxer();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Aqui me creo la nueva ventana y la asocio a un Thread al q le hago start(). Lo que quiero es que no seguir con la ejecucion de esta funcion hasta que la nueva clase VentConfirmacion no haya pasado por el actionPerformed ( el usuario haya elegido [si|no|cancelar]. Aqui esta la clase en cuestion:
public class VentConfirmacion extends JFrame implements ActionListener,Runnable{
private Thread devolver_respuesta = new Thread(this);
int respuesta = -1; // 0=Cancelar , 1=Si, 2=No
boolean sehaescogido = false;
public VentConfirmacion(String titulo,String texto) {
setTitle(titulo);
JLabel label = new JLabel(texto);
JButton bsi = new JButton("Si");
JButton bno = new JButton("No");
JButton bcan = new JButton("Cancelar");
getContentPane().add(label,BorderLayout.NORTH);
Panel panel = new Panel();
panel.setLayout(new FlowLayout());
panel.add(bsi);
panel.add(bno);
panel.add(bcan);
getContentPane().add(panel,BorderLayout.SOUTH);
bsi.addActionListener(this);
bno.addActionListener(this);
bcan.addActionListener(this);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println("Entro en actionPerformed");
Object obj = e.getSource();
if(obj instanceof JButton) {
JButton jb = (JButton)obj;
if(jb.getLabel() == "Si") {
respuesta = 1;
cierra();
}
if(jb.getLabel() == "No") {
respuesta = 2;
cierra();
}
if(jb.getLabel() == "Cancelar") {
respuesta = 0;
cierra();
}
sehaescogido=true;
devolver_respuesta.notify();
}
}
public void cierra() {
setVisible(false);
}
public int respuesta() {
return respuesta;
}
public void run() {
System.out.println("Entro en run");
if(!sehaescogido) {
try {
devolver_respuesta.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Salgo en run");
}
}
Como lo tengo q hacer ??
Resulta que tengo una ventana que al pulsar un boton llama a una funcion que me crea otra ventana ( de otra clase que implementa Runnable ).
La funcion de la clase original es esta :
public void nuevo() {
if( area.getText().length() > 1 ) {
VentConfirmacion vc = new VentConfirmacion("Existe un documento abierto",
"Desea guardar los canvios del actual documento ?");
Thread confirma = new Thread(vc);
confirma.start();
while(confirma.isAlive()) {
//System.out.println("v");
}
System.out.println("Devuelve control");
if( vc.respuesta() == 1) {
try {
guardaFitxer();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Aqui me creo la nueva ventana y la asocio a un Thread al q le hago start(). Lo que quiero es que no seguir con la ejecucion de esta funcion hasta que la nueva clase VentConfirmacion no haya pasado por el actionPerformed ( el usuario haya elegido [si|no|cancelar]. Aqui esta la clase en cuestion:
public class VentConfirmacion extends JFrame implements ActionListener,Runnable{
private Thread devolver_respuesta = new Thread(this);
int respuesta = -1; // 0=Cancelar , 1=Si, 2=No
boolean sehaescogido = false;
public VentConfirmacion(String titulo,String texto) {
setTitle(titulo);
JLabel label = new JLabel(texto);
JButton bsi = new JButton("Si");
JButton bno = new JButton("No");
JButton bcan = new JButton("Cancelar");
getContentPane().add(label,BorderLayout.NORTH);
Panel panel = new Panel();
panel.setLayout(new FlowLayout());
panel.add(bsi);
panel.add(bno);
panel.add(bcan);
getContentPane().add(panel,BorderLayout.SOUTH);
bsi.addActionListener(this);
bno.addActionListener(this);
bcan.addActionListener(this);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println("Entro en actionPerformed");
Object obj = e.getSource();
if(obj instanceof JButton) {
JButton jb = (JButton)obj;
if(jb.getLabel() == "Si") {
respuesta = 1;
cierra();
}
if(jb.getLabel() == "No") {
respuesta = 2;
cierra();
}
if(jb.getLabel() == "Cancelar") {
respuesta = 0;
cierra();
}
sehaescogido=true;
devolver_respuesta.notify();
}
}
public void cierra() {
setVisible(false);
}
public int respuesta() {
return respuesta;
}
public void run() {
System.out.println("Entro en run");
if(!sehaescogido) {
try {
devolver_respuesta.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Salgo en run");
}
}
Como lo tengo q hacer ??
Valora esta pregunta


0