Java Swing How to - Create JFormattedTextfield which only does validation when pressed enter








Question

We would like to know how to create JFormattedTextfield which only does validation when pressed enter.

Answer

import java.awt.Color;
import java.text.NumberFormat;
//www  . j a va2s .com
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {
  static String lastValidValue;
  public static void main(String... args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel contentPane = new JPanel();

    JFormattedTextField ftf = new JFormattedTextField(
        NumberFormat.getNumberInstance());
    ftf.setColumns(10);
    ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);
    ftf.setValue(100);
    lastValidValue = "100";
    ftf.addCaretListener(e->{
        System.out.println("Last Valid Value : " + lastValidValue);
        if (ftf.isEditValid()) {
          String latestValue = ftf.getText();
          System.out.println("Latest Value : " + latestValue);
          if (!(latestValue.equals(lastValidValue)))
            ftf.setBackground(Color.YELLOW.darker());
          else {
            lastValidValue = ftf.getText();
            ftf.setBackground(Color.WHITE);
          }
        } else {
          System.out.println("Invalid Edit Entered.");
        }
    });
    contentPane.add(ftf);
    frame.setContentPane(contentPane);
    frame.pack();
    frame.setVisible(true);
  }
}