Aggiornamento:
Dopo le solite ricerche e prove varie, ero riuscito a far funzionare la gestione dei tasti di scelta rapida attraverso il Key Binding sul JRootPane e già esultavo...
ma poi mi sono accorto che se nella JFrame faccio una qualsiasi semplice operazione come pigiare il tasto <TAB> o fare un click su di un campo di testo, il meccanismo non funziona più.
Riporto il codice di una semplice Form in cui ho inserito il minimo indispensabile per fare la prova.
Io uso NetBeans come ambiente di sviluppo, quindi le dichiarazioni degli oggetti grafici sono opera sua.
In questo esempio intercetto il tasto <Escape> e la combinazione <Ctrl><Enter>
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JRootPane;
import javax.swing.KeyStroke;
public class ProvaRP extends javax.swing.JFrame {
// Costruttore.
public ProvaRP() {
initComponents();
JRootPane myRP = this.getRootPane();
myRP.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "Esc");
myRP.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.CTRL_DOWN_MASK), "CtrlEnt");
myRP.getActionMap().put("Esc", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ee) {
System.out.println(this.getClass().getName() + "actionPerformed: Pigiato <ESC>");
dispose();
}
});
myRP.getActionMap().put("CtrlEnt", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ee) {
System.out.println(this.getClass().getName() + "actionPerformed: Pigiato <CtrlEnt>");
}
});
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
TxtTesto = new javax.swing.JTextField();
BtnShow = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
TxtTesto.setHorizontalAlignment(javax.swing.JTextField.LEFT);
BtnShow.setMnemonic('m');
BtnShow.setText("Mostra il testo");
BtnShow.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
BtnShowActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(38, 38, 38)
.addComponent(TxtTesto, javax.swing.GroupLayout.PREFERRED_SIZE, 243, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(81, 81, 81)
.addComponent(BtnShow)))
.addContainerGap(34, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(24, 24, 24)
.addComponent(TxtTesto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(BtnShow)
.addContainerGap(28, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void BtnShowActionPerformed(java.awt.event.ActionEvent evt) {
System.out.println(this.getClass().getName() + "Testo inserito: " + TxtTesto.getText());
}
// Variables declaration - do not modify
private javax.swing.JButton BtnShow;
private javax.swing.JTextField TxtTesto;
// End of variables declaration
}
La attivo dalla form principale con il comando:
new ProvaRP().setVisible(true);
Come mai succede questo?
Per caso sto usando il Key Binding o il JRootPane in modo improprio?