View Full Version : [Java] Gestire gli eventi dei bottoni tramite tastiera
valerio65
09-07-2012, 15:10
Ciao raga! Vorrei sapere se esistono ascoltatori particolari o metodi per i bottoni per gestirli tramite tastiera... ad esempio, per premere il bottone non soltanto con il click sinistro del mouse, ma con un determinato tasto della tastiera!
Ho trovato questo, non so se può essere utile, ma non ho capito bene come usarlo :S
Key Bindings (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)
Grazie!
valerio65
10-07-2012, 18:58
Comunque, in parte ci sono riuscito, ma per esempio non riesco a far interagire le freccette direzionali, con quel rettangolino tratteggiato di selezione che spunta quando clicchi o dai invio a qualcosa... qualcuno mi può aiutare?????? Non credo sche nessuno ne sappia qualcosa :(
banryu79
11-07-2012, 09:49
Ciao raga! Vorrei sapere se esistono ascoltatori particolari o metodi per i bottoni per gestirli tramite tastiera... ad esempio, per premere il bottone non soltanto con il click sinistro del mouse, ma con un determinato tasto della tastiera!
Ho trovato questo, non so se può essere utile, ma non ho capito bene come usarlo :S
Key Bindings (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)
Grazie!
Ciao valerio65, in Swing ci sono diversi scenari e possibilità circa il fatto di rispondere ad eventi legati alla tastiera. Se hai letto con attenzione il link, la prima parte di quella pagina illustra appunto alcuni di questi scenari e indica i meccanismi più adatti nelle varie circostanze.
In particolare, se vuoi che un bottone scateni il suo evento di azione (ActionEvent) non solo quando viene cliccato con il mouse ma anche in risposta alla pressione di un tasto specifico della tastiera, allora esiste il meccanismo dei cosidetti "Mnemonics".
Ad esempio:
Button b = new JButton("Fai qualcosa");
b1.setMnemonic(KeyEvent.VK_F);
questo bottone emette un ActionEvent anche quando l'utente preme la combinazione ALT+F. Inoltre, nell'etichetta "Fai qualcosa" del bottone risulterà la prima lettera "F" risulterà sottolineata.
Per leggere dei Mnemonics puoi leggere:
- How to Use Buttons, Check Boxes, and Radio Buttons (http://docs.oracle.com/javase/tutorial/uiswing/components/button.html)
Per leggere degli Accelerators (un'altro meccanismo simile ma dedicato ai menu') puoi leggere:
-How to use menu (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#mnemonic)
I Mnemonics e gli Accelerators usano il meccanismo dei KeyBindings dietro le quinte: ma entrambi questi meccanismi offrono un'astrazione che rende più comodo il loro utilizzo per il programmatore, negli scenari per cui sono stati pensati (mnemonici per bottoni e per menu, accelerators come rapidi shortcuts a menu item specifici).
valerio65
11-07-2012, 11:50
Ciao valerio65, in Swing ci sono diversi scenari e possibilità circa il fatto di rispondere ad eventi legati alla tastiera. Se hai letto con attenzione il link, la prima parte di quella pagina illustra appunto alcuni di questi scenari e indica i meccanismi più adatti nelle varie circostanze.
In particolare, se vuoi che un bottone scateni il suo evento di azione (ActionEvent) non solo quando viene cliccato con il mouse ma anche in risposta alla pressione di un tasto specifico della tastiera, allora esiste il meccanismo dei cosidetti "Mnemonics".
Ad esempio:
Button b = new JButton("Fai qualcosa");
b1.setMnemonic(KeyEvent.VK_F);
questo bottone emette un ActionEvent anche quando l'utente preme la combinazione ALT+F. Inoltre, nell'etichetta "Fai qualcosa" del bottone risulterà la prima lettera "F" risulterà sottolineata.
Per leggere dei Mnemonics puoi leggere:
- How to Use Buttons, Check Boxes, and Radio Buttons (http://docs.oracle.com/javase/tutorial/uiswing/components/button.html)
Per leggere degli Accelerators (un'altro meccanismo simile ma dedicato ai menu') puoi leggere:
-How to use menu (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#mnemonic)
I Mnemonics e gli Accelerators usano il meccanismo dei KeyBindings dietro le quinte: ma entrambi questi meccanismi offrono un'astrazione che rende più comodo il loro utilizzo per il programmatore, negli scenari per cui sono stati pensati (mnemonici per bottoni e per menu, accelerators come rapidi shortcuts a menu item specifici).
Grazie mille, buona spiegazione! Adesso vado un po' a documentarmi :D
invece per quel fatto delle freccette direzionali, per far spostare il cursore tratteggiato (come questo in figura nel middle button) in modo da scorrere le componenti anche tramite tastiera?
http://docs.oracle.com/javase/tutorial/figures/uiswing/components/ButtonDemoMetal.png
banryu79
11-07-2012, 12:22
Grazie mille, buona spiegazione! Adesso vado un po' a documentarmi :D
invece per quel fatto delle freccette direzionali, per far spostare il cursore tratteggiato (come questo in figura nel middle button) in modo da scorrere le componenti anche tramite tastiera?
Ho evitato di rispondere al tuo secondo post, perchè la questione tira in ballo la gestione del focus, mentre il primo no.
Comunque, di default (ed è un meccanismo standard nelle UI) l'utente può dare il focus-utente al componente grafico successivo o al precedente rispetto a quello attuale che lo possiede, mediante TAB e SHIFT+TAB (sotto Windows, non so se sia platform-specific), questo binding esiste già.
Non credo esista invece una nozione condivisa e ben definita di componente a sinistra, a destra, sopra e sotto ai fini della gestione del focus-utente che tu hai ipotizzato. In questo caso spetta a te tenere traccia in qualche modo delle posizioni relative tra i componenti, mappare ognuno dei tasti freccia con un nome-azione specifico (ad ese.: il tasto "freccia su" con il nome "componente superiore", il tasto "freccia destra" con il nome "componente a destra", ecc...) nella InputMap del componente e poi mappare ogni nome-azione specifico con un'azione (Action) vera e propria nella ActionMap del componente, come spiegato nel link KeyBindings che hai postato.
Ovviamente anche le singole implementazioni delle varie Action sono a tuo carico; ciò che devono fare sostanzialmente è:
1- trovare il nuovo componente a cui dare il focus;
2- chiedere al sistema che venga dato il focus-utente a quel componente.
Come puoi intuire, si tratta di un discreto (punto 1) lavoro: si fa solo se il gioco vale la candela.
valerio65
11-07-2012, 12:38
Mh, capisco... va be, penso che l'utente possa arrangiarsi con il mouse allora! XD grazie mille comunque! :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.