Foros del Web » Programación para mayores de 30 ;) » Java »

Threads en Jframe

Estas en el tema de Threads en Jframe en el foro de Java en Foros del Web. Mi problema es poder hacer uso de threads dentro de una estructura JFframe q es llamada por un japplet. El objetivo de mi jframe es ...
  #1 (permalink)  
Antiguo 04/11/2011, 08:22
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Threads en Jframe

Mi problema es poder hacer uso de threads dentro de una estructura JFframe q es llamada por un japplet. El objetivo de mi jframe es poder visualizar ondas fisicas dentro de un jpanel. De manera estatica he podido realizarlo teniendo mi jpanel como una clase interna del jframe.

El problema viene a la hora de realizar el dibujo de estas ecuaciones de forma "dinamica" y xa eso obvimente eso necesito threads tanto para dibujar de manera gradual como xa pausar o parar el dibujo.

Dejo parte del codigo del jframe, lo q considero importante:

public class IUEcuacion1 extends JFrame implements Runnable {
private boolean play1pulsado = false;
private boolean play2pulsado = false;
private boolean play3pulsado = false;

private Orbita o1,o2,o3; //objetos de clase q representan 3 ondas distintas de la misma ecuacion

//threads de las 3 posibles ondas que pintar en el jpanel
private Thread thO1 = null;
private Thread thO2 = null;
private Thread thO3 = null;

//variables globales que controlan el indice del vector solucion
public static int nPuntos1 = 0;
public static int nPuntos2 = 0;
public static int nPuntos3 = 0;

// arrays q devuelven conjunto de puntos(x,y) q representar en el jpanel xa cada onda
List<Punto> listaPuntos1 = new ArrayList<Punto>();
List<Punto> listaPuntos2 = new ArrayList<Punto>();
List<Punto> listaPuntos3 = new ArrayList<Punto>();


/** Creates new form IUEcuacion1 */
public IUEcuacion1() {
initComponents();
setLocationRelativeTo(null);
}

private void initComponents() {
....
areaResultados1 = new ZonaGrafica(); //crea jpanel sobre una clase interna extendida a jpanel
}

class ZonaGrafica extends JPanel{

public void paintComponent(Graphics g){
super.paintComponent(g);
Graficar(g);
}

public void Graficar(Graphics ap){
....// Pinta ejes y lineas entre puntos
}

// metodo que al clicar en el boton START comienza la toma de valores y "comienza" cada hilo
private void play1_1MouseClicked(java.awt.event.MouseEvent evt) {
String botonText = null;
botonText = play1_1.getText();
if ("Play".equals(botonText)){
play1_1.setText("Pause");
if (!play1pulsado){
play1pulsado = true;
leerParametros(o1,1); //recoge parametros de jtextfield
listaPuntos1 = o1.getArrayPuntos(); // recoge puntos a dibujar en un array
start(thO1); //creacion del hilo y llamada a start

}
else{
thO1.notify();
}
}
else if ("Pause".equals(botonText)){
play1_1.setText("Play");
thO1.suspend();
}
}

// Metodo run de la clase runnable
public void run() {
while (true) {
try{
Thread.sleep(100);
}catch (InterruptedException e) { }

// Pinta en cada onda si el boton de START ha sido pulsado y ademas si no estan vacios los arrays que guardan los puntos (x,y)
if ((play1pulsado) && (listaPuntos1.size()>nPuntos1)){
areaResultados1.repaint();
nPuntos1++;
}
if ((play2pulsado) && (listaPuntos1.size()>nPuntos2)){
areaResultados1.repaint();
nPuntos2++;
}
if ((play3pulsado) && (listaPuntos1.size()>nPuntos1)){
areaResultados1.repaint();
nPuntos3++;
}
}
}

// metodo start de cada hilo que le meto como parametro el hilo que toke, cualkiera de los 3 posibles que controlarian cada onda
public void start(Thread hilo){
if(hilo==null){
hilo=new Thread(hilo);
hilo.start();
}
}

Este codigo no llega a enlazar los metodos start() y run() y se queda sin hacer nada (salvo la toma de parametros y puntos en los array) justo tras salido de crear el hilo en el metodo start(thO1)

Gracias de antemano
  #2 (permalink)  
Antiguo 04/11/2011, 23:48
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Threads en Jframe

Hola,

Definiste la variable de tipo Thread,

Código Java:
Ver original
  1. private Thread thO1 = null;

El método start que definiste tiene como parámetro un objeto de tipo Thread,

Código Java:
Ver original
  1. public void start(Thread hilo) {
  2.         if (hilo == null) {
  3.             hilo = new Thread(hilo);
  4.             hilo.start();
  5.         }
  6.     }

Y le pasas la variable de tipo Thread al método start,

Código Java:
Ver original
  1. start(thO1);

¿Ahora, en que momento tiene algo que ver la interface runnable?
¿Si el objeto es de tipo Thread y creas un nuevo Thread?

Para que funcione deberías definir la variable como el tipo Runnable, donde el tipo MyRunnableType es el tipo de la clase donde está definido el método run, (eso porque mencionaste que usaste la interface Runnable -- Metodo run de la clase runnable --)

Código Java:
Ver original
  1. private MyRunnableType thO1 = null;

Y el método start debería crear un Thread con el constructor que recibe un Runnable,

Código Java:
Ver original
  1. public void start(Runnable hilo) {
  2.         if (hilo == null) {
  3.             hilo = new MyRunnableType();
  4.             Thread temp = new Thread(hilo);
  5.             temp.start();
  6.         }
  7.     }

Como lo estabas haciendo era crear un hilo vacío sin método run y ejecutándolo, por consiguiente no hacía nada, de esta forma estás haciendo un hilo con el runnable MyRunnableType.

Saludos,
  #3 (permalink)  
Antiguo 09/11/2011, 08:59
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Respuesta: Threads en Jframe

Lo primero de todo, perdon por tardar en contestar...el ordenador murio. y segundo y mas importante: muchas gracias!! soy neofito en estas artes de Java y mas aun para el uso de threads. Probare esta misma tarde a ver q tal funciona "el invento" ;)
  #4 (permalink)  
Antiguo 15/11/2011, 11:27
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Respuesta: Threads en Jframe

Buenas...tengo que decir que la solución que me diste no fue directamente la que necesitaba pero si provocó que me diera cuenta de lo que de verdad tenía que usar. En este caso se me ha solventado gran parte del problema con una clase interna Thread que maneja el dibujo sobre el panel. El problema viene a la hora de pausar y reanudar el dibujo.

areaResultados1
es una clase interna extendida a JPanel
play1pulsado atributo global q dice si se pulso el PLAY
listaPuntos1.size()>nPuntos1 marca si se ha pasado del numero de puntos que puede dibujar
class Hilo extends Thread{

public void run(){
while(true){
try{
Thread.sleep(100);//se espera 0.1 segundos
}catch (InterruptedException e) { }
if ((play1pulsado) && (listaPuntos1.size()>nPuntos1)){
areaResultados1.repaint();
nPuntos1++;
}
......
}
}
}


private void play1_1ActionPerformed(java.awt.event.ActionEvent evt) {
if (est_din){//estatico
.....
}
else{//dinamico
String botonText = null;
botonText = play1_1.getText();

if ( ("Play".equals(botonText)) || ("Empezar".equals(botonText)) ){
if ("Play".equals(botonText)){
play1_1.setText("Pause");
}
if ("Empezar".equals(botonText)){
play1_1.setText("Pausa");
}

if (!play1pulsado){ // se empieza inicialmente el calculo y dibujo
play1pulsado = true;
leerParametros(o1,1); //lee parametros
listaPuntos1 = o1.getArrayPuntos(); // lista de puntos
Hilo thO1 = new Hilo();
thO1.start();
}
else{ // se reanuda el dibujo de puntos
thO1.resume();
}
}
else if ( ("Pause".equals(botonText)) || ("Pausa".equals(botonText)) ){ // se pausa el dibujo de puntos
if ("Pausa".equals(botonText)){
play1_1.setText("Empezar");
}
if ("Pause".equals(botonText)){
play1_1.setText("Play");
}
thO1.interrupt();
}
}

}

El problema recae aqui cuando vuelvo a pulsar el boton de PLAY para pausar salta una interrupcion de las chungas con interrupt y wait. Con yield no salta nada, pero no para la ejecucion. Muchas gracias si puedes aportar algo ;)
  #5 (permalink)  
Antiguo 15/11/2011, 15:24
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Threads en Jframe

Hola,

Cita:
Iniciado por ferdyjuan Ver Mensaje
... El problema recae aqui cuando vuelvo a pulsar el boton de PLAY para pausar salta una interrupcion de las chungas con interrupt y wait. Con yield no salta nada, pero no para la ejecucion. Muchas gracias si puedes aportar algo ...
El problema es que un hilo no se puede detener de esa forma, es decir, un hilo no se puede detener con 'suspend' y continuar con 'resume'. Adicionalmente estás mezclando una cosa con otra, me imagino que posiblemente estás confundido con 'interrupt' y 'resume', con la idea que puedes detener el hilo. Adicionalmente no puedes detener el hilo principal donde se está dibujando usando wait.

Hacer una aplicación en Java que realice un proceso en segundo plano mientras dibuja algo en el hilo principal o primer plano no es tan sencillo como usar wait y notify, o suspend y continue.

Posiblemente te sea de ayuda con detener y continuar:
http://download.oracle.com/javase/7/...precation.html

Y posiblemente te sea de ayuda con detener y continuar, así como pintar en el hilo principal desde un hilo alterno:
http://java.sun.com/products/jfc/tsc.../threads1.html

Saludos,
  #6 (permalink)  
Antiguo 16/11/2011, 06:46
 
Fecha de Ingreso: noviembre-2010
Mensajes: 8
Antigüedad: 14 años
Puntos: 0
Respuesta: Threads en Jframe

Muchas gracias, le echaré un vistazo largo que parece sesudo esto

Etiquetas: applet, jframe, threads
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:31.