PDA

View Full Version : [JAVA]Scorciatoie da tastiera


paolo206
07-11-2009, 19:58
Ciao ragazzi, mi sono avvicinato alla programmazione da poco ed ho scelto Java per iniziare. Naturalmente ho molte domande da fare ma una in particolare vorrei creare le solite scorciatoie da tastiera (CRTL+E per intenderci) ma non saprei come fare. Siccome sono fresco fresco, vorrei dei piccoli esempi.

fero86
07-11-2009, 21:25
se programmi interfacce grafiche in Swing le scorciatoie da tastiera sono delle combinazioni di tasti associati alle varie actions del tuo programma, dove una action é un oggetto della classe Action* che rappresenta un comando che l'utente da al programma e si manifesta all'interno della GUI sotto forma di bottone in una toolbar, menu item o altro; se ci fai caso ad esempio JButton ha un costruttore che vuole un solo argomento di tipo Action e lo stesso vale per JMenuItem.

per associare una combinazione da tastiera ad una Action devi mettere un oggetto di tipo KeyStroke sotto la chiave Action.ACCELERATOR_KEY usando il metodo Action.putValue. l'oggetto KeyStroke lo istanzi ad esempio col metodo KeyStroke.getKeyStroke, che accetta una stringa che rispetta una semplice sintassi che ti permette di esprimere combinazioni di tasti. ti rimando ai javadoc per tutti i dettagli :p

*a voler essere proprio precisi Action é un'interfaccia, non una classe; AbstractAction é una classe astratta che implementa Action e fornisce una tipica implementazione parziale.

paolo206
08-11-2009, 19:30
Perfetto infatti sono riuscito a indicare quali tasti premere per la scociatoia da me preferita, in questo modo:
JMenuItem exit = new JMenuItem("Chiudi");
exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
Quello che non capisco è come indicare ed implementare ActionListener per la mia combinazione. Scrivo di seguito quello che ho fatto, ma probabilmente la classe da me utilizzata non va bene:

public void actionPerformed( ActionEvent e )
{
Object obj = e.getSource();

if( obj == exit || obj == exit.getKeyStrokeForEvent(VK_C,CTRL_MASK)){
System.exit(0);

}

fero86
08-11-2009, 19:48
io in genere non uso un listener unico che cerca di distinguere tra tutte le possibili actions ma implemento ogni singola action estendendo AbstractAction (é anche piu efficiente).

paolo206
08-11-2009, 21:27
Gentilmente potresti elencarmi un piccolo esempio per capire meglio, te ne sarei grato.

fero86
08-11-2009, 22:55
per esempio io un JButton di solito lo istanzio cosi:
new JButton(new AbstractAction("Prova")
{
private static final long serialVersionUID = ...;

@Override
public void actionPerformed(ActionEvente event)
{
System.out.println("Hello, World!");
}
});

paolo206
09-11-2009, 19:59
Bene ci sono riuscito, alla fine la scorciatoia è implementata in modo corretto basta collegare il metodo addActionListener sulla variabile e premere i pulsanti da me indicati.

JMenuItem exit = new JMenuItem("Chiudi");
exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
exit.addActionListener( this );

public void actionPerformed( ActionEvent e )
{
Object obj = e.getSource();

if( obj == exit){
System.exit(0);
}
}


Grazie "fero86" per la tua spiegazione.