El código que muestra parece correcto. Como referencia, aquí hay un ejemplo de trabajo.
Adición: Mientras que el JSpinner
tiene el foco, las teclas de flecha izquierda y derecha mueven el cursor. La flecha hacia arriba se incrementa y la flecha hacia abajo disminuye el campo que contiene el cursor. El cambio es (efectivamente) simultáneo tanto en la ruleta como en la etiqueta. Para acceder al JFormattedTextField
del JSpinner.DateEditor
, use el método del padre getTextField()
. Luego, se puede usar un oyente de intercalación apropiado o un oyente de entrada de texto para actualizar la etiqueta como se desee.
Adición: Actualice para usar setCommitsOnValidEdit
, como se sugiere here.
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JSpinner.DateEditor;
import javax.swing.SpinnerDateModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.DefaultFormatter;
/**
* @see https://stackoverflow.com/questions/2010819
* @see https://stackoverflow.com/questions/3949518
*/
public class JSpinnerTest extends JPanel {
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("JSpinnerTest");
f.add(new JSpinnerTest());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
});
}
public JSpinnerTest() {
super(new GridLayout(0, 1));
final JLabel label = new JLabel();
final JSpinner spinner = new JSpinner();
Calendar calendar = Calendar.getInstance();
Date initDate = calendar.getTime();
calendar.add(Calendar.YEAR, -5);
Date earliestDate = calendar.getTime();
calendar.add(Calendar.YEAR, 10);
Date latestDate = calendar.getTime();
spinner.setModel(new SpinnerDateModel(
initDate, earliestDate, latestDate, Calendar.MONTH));
DateEditor editor = new JSpinner.DateEditor(spinner, "MMM yyyy");
spinner.setEditor(editor);
JFormattedTextField jtf = editor.getTextField();
DefaultFormatter formatter = (DefaultFormatter) jtf.getFormatter();
formatter.setCommitsOnValidEdit(true);
spinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSpinner s = (JSpinner) e.getSource();
label.setText(s.getValue().toString());
}
});
label.setText(initDate.toString());
this.add(spinner);
this.add(label);
}
}
La próxima vez por favor una SSCCE (http://sscce.org) por lo podemos ver el contexto de cómo está usando el código. – camickr
Mismo problema, todavía no he visto una solución. El método ChangeListener no se llama hasta que se pierde el foco de JSpinner. He hecho una solución con keylisteners, pero eso es feo – spuas