Grazie Alex, adesso funziona nel modo corretto e con il minor dispendio di energie e di codiceOriginariamente inviato da Alex'87
http://java.sun.com/docs/books/tutor...eybinding.html![]()
Grazie Alex, adesso funziona nel modo corretto e con il minor dispendio di energie e di codiceOriginariamente inviato da Alex'87
http://java.sun.com/docs/books/tutor...eybinding.html![]()
al volante son nervoso
Se volevi usare il key binding, ti bastava fare una ricerca sul forum e trovavi questo mio post.Originariamente inviato da Rubox
con il minor dispendio di energie e di codice![]()
![]()
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Avevo fatto una ricerca, come sempre prima di postare, ma mi era sfuggito.Originariamente inviato da andbin
Se volevi usare il key binding, ti bastava fare una ricerca sul forum e trovavi questo mio post.![]()
Colgo l'occasione per chiedere questo: nel link messo da Alex, il key binding viene richiamato per un "contenitore". Io come contenitore ho preso il JRootPane. E' corretto? Oppure quei metodi getInputMap e getActionMap si devono richiamare per un altro oggetto, per ottenere che quando si preme invio su di un JFrame, qualunque sia il componente con il focus, la funzione richiamata sia quella del key binding?
al volante son nervoso
Non mi pare parli di "contenitori". Parla di "componenti" e infatti: Each JComponent has one action map and three input maps..Originariamente inviato da Rubox
il key binding viene richiamato per un "contenitore".
A questo punto mi sorge il dubbio che non hai compreso come funziona il key binding.Originariamente inviato da Rubox
Io come contenitore ho preso il JRootPane. E' corretto? Oppure quei metodi getInputMap e getActionMap si devono richiamare per un altro oggetto, per ottenere che quando si preme invio su di un JFrame, qualunque sia il componente con il focus, la funzione richiamata sia quella del key binding?
Come ho anche riportato prima, ogni componente ha 3 InputMap e 1 ActionMap.
Un InputMap fornisce una "mappatura" tra 1 KeyStroke e 1 qualunque "oggetto" (Object, che poi generalmente viene usato un String)
Un ActionMap fornisce una "mappatura" tra quel qualunque oggetto e 1 Action (che estende ActionListener quindi ha il actionPerformed che esegue "qualcosa" cioè la azione vera e propria).
Per un JButton per default c'è una mappatura nel InputMap WHEN_FOCUSED del tipo:
KeyStroke per spazio premuto ---> "pressed"
KeyStroke per spazio rilasciato ---> "released"
E nella ActionMap del JButton c'è una mappatura:
"pressed" ---> una certa Action per la pressione
"released" ---> una certa Action per il rilascio
Io nell'esempio che avevo postato ho semplicemente aggiunto una coppia di mappature "a monte" (quindi nel InputMap) per gestire l'INVIO.
Quindi per tornare alla tua domanda se va bene usare il JRootPane. Beh, dipende. Se usavi la sua InputMap WHEN_ANCESTOR_OF_FOCUSED_COMPONENT e impostavi una "tua" Action, allora potevi fare "qualcosa" quando viene premuto INVIO qualunque sia il componente che ha il focus!!
Più chiaro?codice:JRootPane rootPane = getRootPane(); InputMap im = rootPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), "miaAzione"); ActionMap am = rootPane.getActionMap(); am.put("miaAzione", new AbstractAction() { public void actionPerformed(ActionEvent e) { System.out.println("Ho premuto invio su un qualunque componente!!!"); } });
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Beh è il codice che ho scritto per fare questa operazione.
Non ho capito bene il significato delle costanti WHEN_ANCESTOR_OF_FOCUSED_COMPONENT e le altre.
Mi leggo un po' di documentazione e poi al massimo mi rifaccio vivo.
Sul fatto che non abbia capito il key binding, beh qualcosina sì.
PS: volevo scrivere componente e m'è uscito contenitore.
al volante son nervoso
WHEN_FOCUSED = Quando il componente ha il focusOriginariamente inviato da Rubox
Non ho capito bene il significato delle costanti WHEN_ANCESTOR_OF_FOCUSED_COMPONENT e le altre.
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT = Quando il componente è quello con il focus oppure contiene il componente che ha il focus. "contiene" nel senso proprio che fa da contenitore, es. un JPanel che contiene un JButton.
WHEN_IN_FOCUSED_WINDOW = Quando la finestra dove c'è il componente ha il focus oppure la finestra contiene il componente con il focus.
E c'è una sequenza che viene usata per scansionare i vari InputMap.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet