Olá:
Estou fazendo um teste com JSpinner. Quando clico em “Seta para Cima” ou em “Seta para Baixo” o valor do JSpinner é incrementado ou decrementado em uma unidade. Meu objetivo final é “acelerar” a variação do valor: Quando clicar CTRL + “Seta para Cima” ou CTRL + “Seta para Baixo” o valor deve ser incrementado ou decrementado em 10 unidades, por exemplo. Entretanto as coisas não estão saido como esperado. Se eu Adicionar um KeyListener para o JSpinner nada acontece. Tentei ainda usar este exemplo e este outro no Example Depot (outrora Java Alamanac), usando KeyStroke mas de novo não aconteceu nada. Abaixo, segue-se o código de teste que fiz (feito no NetBeans 6.8 ):
package testeswing;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
/**
*
* @author rafael
*/
public class TestaSpinner extends javax.swing.JFrame {
public static final String CTRL_UP = "CTRL_UP";
public static final String CTRL_DOWN = "CTRL_DOWN";
private Action action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.out.println(e);
}
};
/** Creates new form TestaSpinner */
public TestaSpinner() {
initComponents();
System.out.println(this.spnValor.getInputMap());
System.out.println(Arrays.toString(this.spnValor.getRegisteredKeyStrokes()));
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
lblValor = new javax.swing.JLabel();
spnValor = new javax.swing.JSpinner();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Teste de JSpinner");
getContentPane().setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 20, 5));
lblValor.setFont(new java.awt.Font("Tahoma", 0, 48));
lblValor.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
lblValor.setMaximumSize(new java.awt.Dimension(100, 58));
lblValor.setMinimumSize(new java.awt.Dimension(100, 58));
lblValor.setPreferredSize(new java.awt.Dimension(100, 58));
getContentPane().add(lblValor);
spnValor.setFont(new java.awt.Font("Tahoma", 0, 48)); // NOI18N
spnValor.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(0), null, Integer.valueOf(50), Integer.valueOf(1)));
spnValor.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spnValorStateChanged(evt);
}
});
// Adicionando KeyListeners
spnValor.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
spnValorKeyPressed(evt);
}
public void keyReleased(java.awt.event.KeyEvent evt) {
spnValorKeyReleased(evt);
}
public void keyTyped(java.awt.event.KeyEvent evt) {
spnValorKeyTyped(evt);
}
});
// Adicionando KeyStrokes
getContentPane().add(spnValor);
InputMap inputMap = new InputMap();
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, KeyEvent.CTRL_DOWN_MASK), CTRL_UP);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP, KeyEvent.CTRL_DOWN_MASK), CTRL_UP);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.CTRL_DOWN_MASK), CTRL_DOWN);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, KeyEvent.CTRL_DOWN_MASK), CTRL_DOWN);
inputMap.setParent(this.spnValor.getInputMap(JComponent.WHEN_FOCUSED));
spnValor.setInputMap(JComponent.WHEN_FOCUSED, inputMap);
spnValor.getActionMap().put(CTRL_DOWN, this.action);
spnValor.getActionMap().put(CTRL_UP, this.action);
pack();
}// </editor-fold>
private void spnValorStateChanged(javax.swing.event.ChangeEvent evt) {
this.lblValor.setText(this.spnValor.getValue().toString());
}
private void spnValorKeyPressed(java.awt.event.KeyEvent evt) {
System.out.println("KeyPressed: " + evt);
}
private void spnValorKeyReleased(java.awt.event.KeyEvent evt) {
System.out.println("KeyReleased: " + evt);
}
private void spnValorKeyTyped(java.awt.event.KeyEvent evt) {
System.out.println("KeyTyped: " + evt);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TestaSpinner().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JLabel lblValor;
private javax.swing.JSpinner spnValor;
// End of variables declaration
}
No construtor do JFrame mando imprimir os KeyStrokey registrados. O que aparece é
Bem, alguém tem idéia do que está faltando para que o JSpinner consiga ouvir “meus” eventos?
Grato,
Rafael U. C. Afonso