Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Monitorare pressione di più tasti contemporaneamente

    Buongiorno a tutti, ho il seguente problema:

    Sto sviluppando un'app che NON DEVE assolutamente supportare la pressione di più tasti contemporaneamente, all'inizio non avevo pensato a questo piccolo particolare, ho aggiunto all'app un KeyListener e poi mi sono accorto di non aver tenuto conto di questa cosa perchè schiacciando 5 tasti il programma rispondeva 5 volte e non una sola... A me interessa che:
    • il programma si memorizzi qual è stato il primo tasto ad essere premuto (e fin qui tutto ok)
    • il programma ignori qualsiasi altra pressione di tasti (tutto ok anche fino qui)
    • il programma processi l'evento del keyReleased SOLO nel momento in cui, nel caso della pressione contemporanea di più tasti, TUTTI i tasti premuti vengono rilasciati


    Il problema che ho incontrato è che vengono generati <n> keyPressed per tutto il tempo in cui il tasto resta premuto... Avete qualche idea?

    Grazie mille in anticipo, ciao!
    L'ascensore può scendere su e giù...
    by Prof di Sistemi

  2. #2
    Puoi gestirtela con l'evento del rilascio dei tasti.
    Mi spiego meglio, quando vengono premuti i tasti aggiungi ogni evento di pressione a una lista.
    Nel momento che vengono rilasciati fai il match con quelli premuti e vedi se tra quelli premuti ne rimane più di uno.
    "Na' sedia te vojo tirà!"

  3. #3
    Originariamente inviato da Brazonet
    Puoi gestirtela con l'evento del rilascio dei tasti.
    Mi spiego meglio, quando vengono premuti i tasti aggiungi ogni evento di pressione a una lista.
    Nel momento che vengono rilasciati fai il match con quelli premuti e vedi se tra quelli premuti ne rimane più di uno.
    Ciao, quello che dici è vero, ci avevo già pensato, però il mio dubbio su questa cosa era e continua ad essere: nel caso avessi un tasto che resta premuto per troppo tempo, questa lista non diventerebbe decisamente grossa in termini di memoria?
    L'ascensore può scendere su e giù...
    by Prof di Sistemi

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da Harlandraka_94
    Ciao, quello che dici è vero, ci avevo già pensato, però il mio dubbio su questa cosa era e continua ad essere: nel caso avessi un tasto che resta premuto per troppo tempo, questa lista non diventerebbe decisamente grossa in termini di memoria?
    Se gestisci la cosa nel metodo keyPressed direi di no. Se un tasto viene premuto e mai rilasciato, quel tasto avrà generato uno ed un solo evento keyPressed (e nessun evento keyReleased).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    è qui che ti sbagli: quando tieni premuto un tasto vengono generati eventi keyPressed ogni tot di millesimi di secondo fino a quando non rilasci, te lo dico perchè ho provato stampando semplicemente una stringa sulla console alla pressione di un tasto, se tengo premuto quel tasto mi genera migliaia di stampe in console
    L'ascensore può scendere su e giù...
    by Prof di Sistemi

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da Harlandraka_94
    è qui che ti sbagli: quando tieni premuto un tasto vengono generati eventi keyPressed ogni tot di millesimi di secondo fino a quando non rilasci, te lo dico perchè ho provato stampando semplicemente una stringa sulla console alla pressione di un tasto, se tengo premuto quel tasto mi genera migliaia di stampe in console
    Sì... hai ragione, dimenticavo la frequenza della tastiera. E la cosa è comunque semplice da gestire:

    codice:
    List<Integer> listaTastiPremuti = ...
    ...
    public void keyPressed(KeyEvent ke) {
       int keyCode = ke.getKeyCode();
       if ( !listaTastiPremuti.contains(keyCode) ) {
          // Il tasto è appena stato premuto (per la prima volta)
          listaTastiPremuti.add( keyCode );
       }
    }
    Alla lista verrà aggiunto il tasto solo se questo non è già presente.

    Ovviamente, nel keyReleased() andrà gestita la rimozione dalla lista.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2025 vBulletin Solutions, Inc. All rights reserved.