Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102

    [Java] Gestire gli eventi dei bottoni tramite tastiera

    Salve! 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

    Link

    Grazie!

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    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
    Registrato dal
    Feb 2012
    Messaggi
    102
    Grazie, ma non capisco bene come usarlo... con i normali ascoltatori, creo una classe apposita implementando l'interfaccia e facendo l'overiding del metodo getActionPerformed, qui invece vuole un oggetto di classe Action, ma dovrei andare a fare l'overiding di tutti gli altri metodi, e se li lascio in bianco il compilatore mi da vari errori... dov'è che sbaglio?

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da valerio65
    Grazie, ma non capisco bene come usarlo... con i normali ascoltatori, creo una classe apposita implementando l'interfaccia e facendo l'overiding del metodo getActionPerformed, qui invece vuole un oggetto di classe Action
    E perché dovresti usare direttamente un Action, vuoi riscriverne il comportamento?
    E' richiesto una Action per il polimorfismo, se apri la documentazione vedrai che Action ha dozzine e dozzine di sottoclassi, in particolare AbstractAction ecc.

    Originariamente inviato da valerio65
    qui invece vuole un oggetto di classe Action, ma dovrei andare a fare l'overiding di tutti gli altri metodi, e se li lascio in bianco il compilatore mi da vari errori... dov'è che sbaglio?
    Rileggi meglio la pagina che ti avevo linkato, c'è TUTTO quello che ti serve...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    Guardando questa parte

    codice:
    Here is an example of specifying that a component should react to the F2 key:
    
    component.getInputMap().put(KeyStroke.getKeyStroke("F2"),
                                "doSomething");
    component.getActionMap().put("doSomething",
                                 anAction);
    //where anAction is a javax.swing.Action
    Ho capito che così si intercetta l'evento di pressione del tasto F2, ma per gestirlo poi cosa dovrei fare? Creare un oggetto di classe Action? E il mio algoritmo di gestione dove lo metto?

    Nella documentazione c'è questo quando non si vuole far nulla alla pressione del tasto

    codice:
    Action doNothing = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            //do nothing
        }
    };
    component.getInputMap().put(KeyStroke.getKeyStroke("F2"),
                                "doNothing");
    component.getActionMap().put("doNothing",
                                 doNothing);
    ma, questo non lo vorrei mettere nel metodo main, ma in una classe del package dove risiedono tutti gli algoritmi degli avvenimenti degli eventi, e non posso farlo siccome per richiamarlo l'oggetto devo prima crearlo e definire il metodo actionPerformed...

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da valerio65
    Nella documentazione c'è questo quando non si vuole far nulla alla pressione del tasto

    codice:
    Action doNothing = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            //do nothing
        }
    };
    component.getInputMap().put(KeyStroke.getKeyStroke("F2"),
                                "doNothing");
    component.getActionMap().put("doNothing",
                                 doNothing);
    ma, questo non lo vorrei mettere nel metodo main, ma in una classe del package dove risiedono tutti gli algoritmi degli avvenimenti degli eventi, e non posso farlo siccome per richiamarlo l'oggetto devo prima crearlo e definire il metodo actionPerformed...
    Vuoi ad esempio chiamare il metodo algoritmoX in seguito alla pressione di un tasto?
    Una cosa del genere:

    codice:
    public class MyClass ... {
    
      private ClasseConAlgoritmi cca:
      private Action doAlgoritmoX;
    
      public MyClass(final ClasseConAlgoritmi  cca) {
        doAlgoritmoX = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                cca.algoritmoX():
            }
         };
      }
    
      ... setter/getter   
    }
    
    ...
    
    public class MyOtherClass ... {
    
       private MyClass mc;
       ...
    
       private void init() {
        component.getInputMap().put(KeyStroke.getKeyStroke("F2"),  "doAlgoritmoXAction");
        component.getActionMap().put("doAlgoritmoXAction", mc.getDoAlgoritmoX());
       }
    
    }
    Non ho compilato, ho scritto di getto ma come scheletro mi pare ok
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    No scusami non capisco, forse perché studiando dal libro non ho una visuale completa, comunque ti sarei grato se mi daresti chiarimenti...

    In questa parte:

    codice:
    public class MyClass ... {
    
      private ClasseConAlgoritmi cca:
      private Action doAlgoritmoX;
    
      public MyClass(final ClasseConAlgoritmi  cca) {
        doAlgoritmoX = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                cca.algoritmoX():
            }
         };
      }
    
      ... setter/getter   
    }
    Ci sono:

    - cca, che prima lo dichiari all'inizio, ma poi ne viene ricevuto un altro dal costruttore, quindi il primo dichiarato non so a che serva

    Qui:

    codice:
    public class MyOtherClass ... {
    
       private MyClass mc;
       ...
    
       private void init() {
        component.getInputMap().put(KeyStroke.getKeyStroke("F2"),  "doAlgoritmoXAction");
        component.getActionMap().put("doAlgoritmoXAction", mc.getDoAlgoritmoX());
       }
    
    }
    - non capisco perché inserire nel meotodo init() (che non ne conosco l'utilità)
    - component non dovrebbe essere il bottone a cui collegare il metodo?
    - getDoAlgoritmoX() non hai fatto riferimento in nessun posto a questo metodo...


    Comunque, facendo delle piccole modifiche, secondo le mie conoscenze, l'unico errore che mi spunta è questo:

    codice:
    C:\Users\Valerio\Desktop\java\GUI\Swing>javac Last.java
    Last.java:20: error: method put in class ActionMap cannot be applied to given ty
    pes;
                    x.getActionMap().put("pressed",new Azione2(new Azione(a)));
                                    ^
      required: Object,Action
      found: String,Azione2
      reason: actual argument Azione2 cannot be converted to Action by method invoca
    tion conversion
    1 error
    
    C:\Users\Valerio\Desktop\java\GUI\Swing>
    per questo parlavo di passargli necessariamente un oggetto Action, e non di una classe mia (da te citata MyClass) ... Grazie!

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da valerio65
    Ci sono:

    - cca, che prima lo dichiari all'inizio, ma poi ne viene ricevuto un altro dal costruttore, quindi il primo dichiarato non so a che serva
    Hai ragione, svista mia. L'attributo è in più e non serve.


    Originariamente inviato da valerio65
    - non capisco perché inserire nel meotodo init() (che non ne conosco l'utilità)
    init(), pippo(), topolino()... chiamalo come vuoi, è un metodo qualsiasi, puoi mettere il codice di quel metodo dove vuoi (in modo logico ovviamente)


    Originariamente inviato da valerio65
    - component non dovrebbe essere il bottone a cui collegare il metodo?
    Il mio era solo una bozza, usa il componente che ti serve


    Originariamente inviato da valerio65
    - getDoAlgoritmoX() non hai fatto riferimento in nessun posto a questo metodo...
    Ho creato un attributo doAlgoritmoXe ho lasciato scritto "getter/setter" in quanto mi pareva inutile scrivertene il codice visto che si tratta di fare un semplice return di quell'attributo.


    Originariamente inviato da valerio65
    per questo parlavo di passargli necessariamente un oggetto Action, e non di una classe mia (da te citata MyClass) ... Grazie!

    Action è un interfaccia e come tale non è istanziabile. Al massimo puoi avere un riferimento.

    L'AbstractAction che ho usato è una Action (guarda la gerarchia delle classi) quindi può essere usata ovunque è richiesta una Action.

    Nel mio esempio la Action non è MyClass ma doAlgoritmoX!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    Perfetto! Grazie mille funziona adesso , mancava il getter XD

    Però per far reagire il programma alle freccette direzionali (che sposta il cursore tratteggiato rettangolare tra i vari campi) non funziona, o meglio ci sarà sicuramente un altro modo, però se vado off topic fa nulla...

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.