Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    5

    Visualizzare le coordinate del mouse in tempo reale

    Buongiorno a tutti. Innanzitutto voglio chiarire che non sono un esperto di Java e non lo usavo pi� da almeno 4 anni, per cui le mie poche nozioni sono finite chiss� dove. Ora ho bisogno di realizzare una semplice appicazione che mi visualizzi in tempo reale le coordinate del mouse su 2 jLabel ( xRead e yRead). La parte relativa alla lettura della posizione del mouse l'ho gi� realizzata e funziona. Questa legge le coordinate del mouse per i prossimi 10 secondi poi termina:
    int i = 0;
    while (i < 10) {
    Point location = MouseInfo.getPointerInfo().getLocation();
    double x = location.getX();
    double y = location.getY();
    xRead.setText(Integer.toString((int) x));
    yRead.setText(Integer.toString((int) y));
    xRead.repaint();
    yRead.repaint();
    xRead.validate();
    yRead.validate();


    try {
    Thread.sleep(1000);
    i++;
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    Ho 2 problemi che vorrei risolvere con il vostro aiuto:

    1. la jLabel non visualizzano il valore letto prima della fine del ciclo. Ho inserito .repaint() e .validate() ma non � sufficiente. Come posso far si che queste visualizzino in tempo reale il loro contenuto?
    2. se volessi fare lo stesso, ma non tramite questo ciclo, per esempio visualizzare costantemente le coordinate del mouse che si pu� muovere per tutto lo schermo , anche fuori dell'applicazione, cosa devo aggiungere al mio codice.


    Spero che qualcuno mi dia le dritte per risolvere questi problemi nel modo pi� semplice possibile.
    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giovi61 Visualizza il messaggio
    la jLabel non visualizzano il valore letto prima della fine del ciclo. Ho inserito .repaint() e .validate() ma non � sufficiente. Come posso far si che queste visualizzino in tempo reale il loro contenuto?
    La questione (che forse non sai) è: in quale contesto, e per essere più precisi nel contesto di quale thread, stai eseguendo quel codice mostrato?
    Perché se lo hai fatto nel contesto del Event Dispatch Thread, allora è "normale" che non vedi nulla. Ci sono concetti su Swing che vanno compresi: se stai tenendo tu "impegnato" il EDT, allora il framework non può aggiornare nulla a video.

    Quote Originariamente inviata da giovi61 Visualizza il messaggio
    se volessi fare lo stesso, ma non tramite questo ciclo, per esempio visualizzare costantemente le coordinate del mouse che si pu� muovere per tutto lo schermo , anche fuori dell'applicazione, cosa devo aggiungere al mio codice.
    Innanzitutto quello che stai facendo è solo un "polling", cioè ad intervalli di tempo ottieni informazioni su dove è il puntatore, e con MouseInfo la informazione è globale (ovunque si trovi il puntatore, anche fuori dalla tua applicazione).
    Se ti va bene così, ok. Invece di fare un ciclo con sleep interna, magari ti conviene usare un javax.swing.Timer, che dispaccia eventi ActionEvent (al/ai ActionListener associato/i al Timer) nel contesto del EDT, e quindi non ci sono problemi ad aggiornare le due label.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Invece di fare un ciclo con sleep interna, magari ti conviene usare un javax.swing.Timer, che dispaccia eventi ActionEvent (al/ai ActionListener associato/i al Timer) nel contesto del EDT, e quindi non ci sono problemi ad aggiornare le due label.
    Grazie mille è sei stato utilissimo. Ho risolto inserendo questo codice invece del ciclo:
    int delay = 100; //milliseconds
    ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    Point location = MouseInfo.getPointerInfo().getLocation();
    double x = location.getX();
    double y = location.getY();
    xRead.setText(Integer.toString((int) x));
    yRead.setText(Integer.toString((int) y));
    xRead.repaint();
    yRead.repaint();
    xRead.validate();
    yRead.validate();
    }
    };
    new Timer(delay, taskPerformer).start();

    Grazie mille di nuovo!!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giovi61 Visualizza il messaggio
    xRead.repaint();
    yRead.repaint();
    xRead.validate();
    yRead.validate();
    Puoi togliere repaint/validate .. sono completamente inutili in quel contesto lì (non danneggiano nulla ma non servono e non danno nulla in più).
    Il setText è assolutamente sufficiente affinché poi le label si aggiornino dopo che il actionPerformed è terminato e appena il framework deduce che deve ridisegnare le label.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Puoi togliere repaint/validate .. sono completamente inutili in quel contesto lì (non danneggiano nulla ma non servono e non danno nulla in più).
    Il setText è assolutamente sufficiente affinché poi le label si aggiornino dopo che il actionPerformed è terminato e appena il framework deduce che deve ridisegnare le label.
    Perfettamente vero. Grazie mille di nuovo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.