Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    intercettare la pressione di un tasto

    ciao
    come da titolo, in un programma java desktop, vorrei intercettare la pressione di alcuni tasti ed associargli un evento
    per questo ho definito un KeyListener e lo ho associato a tutti i componenti grafici sul frame (mi salva il fatto che sono pochi)
    sembra che cio sia indispensabile infatti , se mi dimentico di associare un componente , e se poi questo riceve il focus il keylistner smette di funzionare
    anche se funziona mi sembra un sistema poco elegante
    ci sarebbe una soluzione alternativa???


    KeyListener keyListener = new KeyListenerFrame();
    this.addKeyListener(keyListener); // associa al Frame
    this.resetButton.addKeyListener(keyListener); // associa ad un JButton
    .... // associa a tutti gli altri componenti grafici

    class KeyListenerFrame implements KeyListener {
    .....
    int keyCode = e.getKeyCode(); if(keyCode==48){...}
    .....
    }
    semplicità ... al sol nominarla sembra svanire

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: intercettare la pressione di un tasto

    Originariamente inviato da biagiopas
    ci sarebbe una soluzione alternativa???
    codice:
    public class MyFrame extends JFrame {
    
    ...
    
        public MyFrame() {
    
            ...
    
            getRootPane().registerKeyboardAction(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    FRAME.setVisible(false);
                }
            }, KeyStroke.getKeyStroke(KeyEvent.VK_W, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), JComponent.WHEN_IN_FOCUSED_WINDOW);
    
            ...
        }
    }
    Io uso questo metodo per chiudere la finestra alla pressione di Command + W.
    getRootPane() è un metodo presente in JFrame e JDialog

    Toolkit.getDefaultToolkit().getMenuShortcutKeyMask () restituisce il "pulsante corretto": Command su mac, CTRL sugli altri sistemi.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: intercettare la pressione di un tasto

    Originariamente inviato da Alex'87
    Io uso questo metodo per chiudere la finestra alla pressione di Command + W.
    getRootPane() è un metodo presente in JFrame e JDialog
    Scusa ma a dire il vero la documentazione dice che registerKeyboardAction() (e unregisterKeyboardAction()) sono obsoleti (ma non sono "deprecati"). E suggerisce di usare l'accoppiata di InputMap e ActionMap.


    Esempio:

    codice:
    JRootPane rootPane = getRootPane();
    InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap actionMap = rootPane.getActionMap();
    
    inputMap.put(KeyStroke.getKeyStroke("F2"), "hello_f2");
    
    actionMap.put("hello_f2", new AbstractAction()
    {
        public void actionPerformed(ActionEvent e)
        {
            // .... fai qualcosa se premuto F2
        }
    });
    Al posto di "hello_f2" ci può essere tecnicamente qualunque tipo di oggetto (prende Object), ma in genere è una stringa.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    ciaoalex e andbin grazie per le risposte
    riguardo a quanto suggerito da andbin non riesco ad intercettare il tasto control

    inputMap.put(KeyStroke.getKeyStroke( ? ), "hello_ctrl");

    ho provato senza successo con : "CONTROL" , "CTRL" ,"ctrl" ,
    "control" , "CONTROL_LEFT" , "CONTROL_RIGHT", (char)17,
    semplicità ... al sol nominarla sembra svanire

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da biagiopas
    non riesco ad intercettare il tasto control
    Control in combinazione a che cosa?? O lo volevi da "solo"???

    Se lo volevi da solo, puoi usare:
    KeyStroke.getKeyStroke (KeyEvent.VK_CONTROL, InputEvent.CTRL_DOWN_MASK)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    ... si volevo intercettare CONTROL a solo
    e KeyStroke.getKeyStroke (KeyEvent.VK_CONTROL, InputEvent.CTRL_DOWN_MASK)
    funziona pero si verifica una cosa spiacevole solo con il tasto control e che con il sistema che usavo all'inizio (quello di apertura del tread) non si verificava
    e cioe' quando il tasto control si tiene premuto non vengono intercettati gli altri tasti

    invece tenendo premuto un qualsiasi altro tasto (es. INVIO) vengono intercettati gli altri tasti compreso Ctrl
    (i tasti che voglio intercettare sono ( 0, 1, INVIO, Ctrl))
    ciao
    semplicità ... al sol nominarla sembra svanire

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da biagiopas
    invece tenendo premuto un qualsiasi altro tasto (es. INVIO) vengono intercettati gli altri tasti compreso Ctrl
    (i tasti che voglio intercettare sono ( 0, 1, INVIO, Ctrl))
    Puoi spiegare meglio cosa vorresti fare?? Perché a questo punto non ti seguo più molto .... vuoi avere più key binding globali? o solo uno?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    ciao andbin
    quello che voglio realizzare è un'applicazione desk nella quale ci sono due bottoni che si premono alternativamente per passare il turno : control e invio


    per evitare confusione diciamo che voglio intercettare solo i tasti invio e control e
    ad ognuno dei due tasti associare un metodo diverso : hello_control e hello_invio
    succede che se si preme invio mentre control è ancora premuto il metodo hello_invio non si verifica (comportamento non desiderabile)
    al contrario se si preme control mentre invio è premuto il metodo hello_control si verifica (comportamento corretto)

    spero di non avere fatto ancora piu confusione ... adesso dovrebbe essere chiaro
    semplicità ... al sol nominarla sembra svanire

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da biagiopas
    per evitare confusione diciamo che voglio intercettare solo i tasti invio e control e
    ad ognuno dei due tasti associare un metodo diverso : hello_control e hello_invio
    succede che se si preme invio mentre control è ancora premuto il metodo hello_invio non si verifica (comportamento non desiderabile)
    al contrario se si preme control mentre invio è premuto il metodo hello_control si verifica (comportamento corretto)
    Semplice:

    codice:
    inputMap.put (KeyStroke.getKeyStroke (KeyEvent.VK_ENTER, 0), "action_enter");
    inputMap.put (KeyStroke.getKeyStroke (KeyEvent.VK_ENTER, InputEvent.CTRL_DOWN_MASK), "action_enter");
    inputMap.put (KeyStroke.getKeyStroke (KeyEvent.VK_CONTROL, InputEvent.CTRL_DOWN_MASK), "action_ctrl");
    Chiaramente poi nella ActionMap devi fare le 2 associazioni tra le stringhe e le due action!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    funziona !
    semplicità ... al sol nominarla sembra svanire

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.