Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Applets Java y eventos rápidos de ratón: ¿fiabilidad?

Iniciado por Morgan, 14 de Mayo de 2003, 02:22:45 PM

« anterior - próximo »

Morgan

                                Hola!
  He comprobado que muchos applets de Java que dependen de clicks sucesivos del ratón no funcionan del todo bien. Lo he sentido en 'mis carnes' al hacer yo un simple applet en el que una bola se dirige al último lugar donde se hizo 'click' con el ratón.
  Muchos tutoriales de los que se encuentran por internet hacen uso del método mouseDown, y así las cosas sí van mejor, pero en la última versión de java ya está 'deprecated' (por lo que supongo que lo mejor es no usarlo) Ahora se recomienda implementar mouseListener y gestionar los eventos pertinentes, pero de esa manera de cada 10 clicks del ratón, más de la mitad son ignorados :?
  ¿Es cosa del MouseListener, de que es un Applet, del ciclo de vida del Thread que engloba todo? He aquí el código simplón para que veais a qué me refiero:


import java.applet.*;

import java.awt.event.*;

import java.awt.*;



public class BolaBoba extends Applet implements Runnable, MouseListener {

private Image dbImage; //Imagen para 'double buffering'

private Graphics dbg;  //Gráficos para 'double buffering'

private Point mouse = new Point();



int x_pos = 100;

int y_pos = 100;

int x_speed = 1;

int radius = 20;



public void init() {

}



public void start() {

     addMouseListener(this);



     Thread th=new Thread (this);

     th.start();

}



public void stop() {}

public void destroy () {}



public void run () {

Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

while (true) {  

 if (x_pos < mouse.x)

  x_pos += x_speed;

 else

  x_pos -= x_speed;

 if (y_pos < mouse.y)

  y_pos += x_speed;

 else

  y_pos -= x_speed;



 repaint();

           try {

            Thread.sleep (100);

           }

           catch (InterruptedException ex) {

 }

           Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

}

}



public void update(Graphics g) {

     int i;



// Inicializa buffer

if (dbImage == null)

{

 dbImage = createImage (this.getSize().width, this.getSize().height);

 dbg = dbImage.getGraphics ();

}



// Borra el fondo

dbg.setColor(getBackground());

dbg.fillRect(0,0,this.getSize().width, this.getSize().height);



//Dibuja todo

paint(dbg);



//Pone imagen en pantalla

g.drawImage(dbImage, 0, 0, this);

}



public void paint (Graphics g) {



g.setColor(getForeground());

g.setColor(Color.red);

g.fillOval(mouse.x,mouse.y,5,5);

g.fillOval(x_pos - radius, y_pos - radius, 2*radius, 2*radius);

}







//MOUSELISTENER METHODS



public void mousePressed(MouseEvent e) {}



public void mouseReleased(MouseEvent e) {}



public void mouseClicked(MouseEvent e) {

       mouse.x = e.getX();

       mouse.y = e.getY();

}



public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mouseDragged(MouseEvent e) {}

public void mouseMoved(MouseEvent e) {}

}

                               
asta otra,
                   M.

fiero

                                No sé si te servirá, pero como veo que hay una función mouseClicked te diré lo que me ha pasado a veces a mi.
A veces el mensaje CLICK no se manda cuando el botón se pulsa muy rápido, ya que el sistema interpreta esos clicks como DOUBLECLIK y por eso manda el mensaje DOUBLECLICK la mitad del total de las veces pulsadas. Quizás puedas interceptar esos mensajes desde java, o quizás java detecte un DOUBLECLICK como si fuera un CLICK, eso ya no se....

un saludo                                
www.videopanoramas.com Videopanoramas 3D player

Morgan

                                Andá, pues efectivamente parece que es eso! =8| Se ve que los interpreta como dobles y no hace caso, aunque la posición entre un click y otro sea completamente distinta...  Probé a hacer clicks con, digamos medio segundo entre cada uno, y responde mucho mejor :)

El problema es que sigo necesitando velocidad, porque el jueguillo necesita que puedas hacer click rápidamente en cualquier sitio (lo tengo hecho en Delphi y funciona perfectamente) ... tendré que mirar cómo hacer eso de 'ignorar el doble click'

¡Gracias!                                
asta otra,
                   M.

Morgan

                                Je, ya enconté cómo. No sé si será la mejor solución, pero funciona. En lugar de ponerlo en el mouseClicked, hago lo mismo pero en mousePressed. Así se responde al 100% de los clicks.
¡Gracias por la orientación! ;)                                
asta otra,
                   M.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.