2009-09-03 26 views
5

¿Hay alguna forma, en Java, de verificar directamente si uno de los botones del mouse está caído sin usar eventos, oyentes, etc.? Me gustaría tener un hilo que, cada 100 milisegundos más o menos, compruebe si un botón del mouse está caído y luego hace algo. Entonces, si el usuario mantiene presionado un botón del mouse por un tiempo, se dispararán varias respuestas.Ratón Java presionado - sin eventos

Así que lo que estoy buscando es un método que proporciona el estado del mouse, sin pasar por el sistema de manejo de eventos habitual.

gracias

+4

Lo siento, pero ... ¿por qué? –

Respuesta

4

Creo que esto no es posible en Java. Bueno, es posible a través de JNI, pero ese es un mundo de dolor.

Hacer esto con eventos no es difícil, y se integrará mucho mejor con el resto de su aplicación. Aquí está un ejemplo de escritura a la consola cada 100 ms mientras se pulsa el botón del ratón:

import javax.swing.*; 
import java.awt.event.*; 

public class Test { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     final JLabel label = new JLabel("Click on me and hold the mouse button down"); 
     label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     frame.getContentPane().add(label); 
     label.addMouseListener(new TimingMouseAdapter()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private static class TimingMouseAdapter extends MouseAdapter { 
     private Timer timer; 

     public void mousePressed(MouseEvent e) { 
      timer = new Timer(100, new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Mouse still pressed..."); 
       } 
      }); 
      timer.start(); 
     } 

     public void mouseReleased(MouseEvent e) { 
      if (timer != null) { 
       timer.stop(); 
      } 
     } 

    } 
} 

La modificación de esta para hacer cosas diferentes (tales como el modo de pincel cambiar) después de diferentes períodos de tiempo debería ser sencilla.

+0

Guau, gracias. Trataré de usar temporizadores, entonces. –

4

No sé si esto es posible - tal vez es.

Sin embargo, siempre puede escribir un controlador de eventos cuyo único trabajo es realizar un seguimiento del estado actual del mouse. Entonces tu código de 100ms podría simplemente consultarlo.

+0

Pensé en eso, pero es un poco más complicado. Pensé que probaría y vería si alguien conocía un método para obtener directamente el estado del mouse, y si no, use un controlador de eventos. –

2

Si es posible, ¿estás seguro de que quieres hacer esto?

Me parece que es probable que pierda los clics de esa manera. 100 milisegundos es una décima de segundo. Muchos clics no duran tanto.

E incluso si hace que su ciclo de sondeo sea más corto, todo lo que hace es limitar la ventana durante la cual podría perder un clic, por lo que perderá clics con menos frecuencia. Pero todavía será una condición de carrera.

Supongo que su preocupación por las complicaciones se debe a tener que lidiar con problemas de enhebrado, pero a menos que nos brinde más información, no podemos brindarle mucha ayuda.

+0

100 millis estaba fuera de mi cabeza, planeaba experimentar con tiempos diferentes. Buen punto acerca de los clics faltantes. Estoy tratando de hacer que el mouse funcione como una herramienta de pincel para un programa de gráficos, lo que implicaría que el programa responda en función de cuánto tiempo se presiona el mouse, entre otras cosas. Lo que quiero averiguar es si es posible hacer este tipo de consultas directas de bajo nivel sobre el estado del mouse, y luego voy a experimentar, ver qué tan bien funciona y usarlo o intentar usar un controlador de eventos en lugar. –

+0

Para un programa de pintura, he usado MouseMotionListener e implementado mouseDragged() para permitir el dibujo. –

0

Debería ser fácil escribir un Oyente para controlar el estado del mouse. Consulte Global Event Listeners para obtener una introducción a AWTEventListener que le permite escuchar todos los eventos del mouse con un solo oyente.

Luego en el oyente se iniciará el temporizador.

Cuestiones relacionadas