package org.limewire.ui.swing.components; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.text.ParseException; import javax.swing.JFormattedTextField; import javax.swing.JSpinner; import javax.swing.Timer; /** * An implementation of {@link KeyListener} that will attempt to validate, and if needed, * reset invalid input of a {@link JSpinner} between pauses in typing. */ public class PeriodicFieldValidator implements KeyListener { private final Timer timer = new Timer(600, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int position = field.getCaretPosition(); String orignalString = field.getText(); if (!"".equals(field.getText())) { try { field.commitEdit(); field.setText(orignalString); field.setCaretPosition(position); } catch (ParseException e1) { field.setValue(field.getValue()); field.setCaretPosition(field.getText().length()); } } } }); private final JFormattedTextField field; public PeriodicFieldValidator(JFormattedTextField field) { this.field = field; timer.setRepeats(false); } @Override public void keyTyped(KeyEvent e) { timer.stop(); timer.start(); } @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } }