2009-09-03 10 views
5

c'è un modo, in Java, per controllare direttamente se uno dei pulsanti del mouse è inattivo senza utilizzare eventi, ascoltatori, ecc.? Mi piacerebbe avere un thread che, ogni 100 millisecondi o giù di lì, controlla se un pulsante del mouse è inattivo e quindi fa qualcosa. Quindi, se l'utente tiene premuto un pulsante del mouse per un po ', attiverà diverse risposte.Mouse Java premuto - senza eventi

Quindi quello che sto cercando è un metodo che dà lo stato del mouse, senza passare attraverso il consueto evento - sistema di gestione.

grazie

+4

Scusa, ma ... perché? –

risposta

4

Credo che questo non sia possibile in Java. Beh, è ​​possibile attraverso JNI ma è un mondo di dolore.

Fare questo con eventi non è difficile, e integrerà molto meglio con il resto della vostra applicazione. Ecco un esempio di scrittura sulla console ogni 100 ms, mentre si tiene premuto il pulsante del mouse:

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(); 
      } 
     } 

    } 
} 

modifica di questa per fare cose diverse (come ad esempio la modalità pennello cambiando) dopo il tempo di differenti periodi dovrebbe essere diretto.

+0

Wow, grazie. Proverò ad usare i timer, quindi. –

4

Non so se questo è possibile - forse lo è.

Tuttavia, si può sempre scrivere un gestore di eventi il ​​cui unico compito è quello di tenere traccia dello stato corrente del mouse. Quindi il tuo codice 100ms potrebbe solo interrogarlo.

+0

Ci ho pensato, ma è un po 'più complicato. Ho pensato di provare a vedere se qualcuno conosceva un metodo per ottenere direttamente lo stato del mouse e, in caso contrario, utilizzare un gestore di eventi. –

2

Se è possibile o no, sei sicuro di volerlo fare?

Mi sembra che è molto probabile che perdere scatti in quel modo. 100 millisecondi sono un decimo di secondo .. Molti clic non durano a lungo.

E anche se si effettua il ciclo di polling più breve, tutto quello che stai facendo è di restringere la finestra durante la quale si poteva mancare uno scatto, quindi mancherà clic meno spesso. Ma sarà ancora una condizione di gara.

Sto indovinando che la sua preoccupazione per complicazione deriva dal dover affrontare problemi di threading, ma a meno che non ci danno ulteriori informazioni, non possiamo dare molto aiuto.

+0

100 millis erano appena in cima alla mia testa, stavo progettando di sperimentare con tempi diversi. Buon punto per i clic mancanti. Sto cercando di far funzionare il mouse come strumento per il pennello per un programma di grafica, il che implica che il programma risponda in base alla durata del mouse, tra le altre cose. Quello che voglio scoprire è se è possibile eseguire questo tipo di query diretta di basso livello sullo stato del mouse, quindi eseguirò un esperimento, vedrò come funziona e usarlo o provare a utilizzare un gestore di eventi anziché. –

+0

Per un programma di disegno, ho utilizzato MouseMotionListener e implementato mouseDragged() per consentire il disegno. –

0

Dovrebbe essere abbastanza semplice scrivere un listener per gestire lo stato del mouse. Vedere Global Event Listeners per un'introduzione a AWTEventListener che consente di ascoltare tutti gli eventi del mouse con un singolo listener.

Quindi nell'ascoltatore si avvia il timer.

Problemi correlati