Java Swing How to - Handle PropertyChangeListener and requestFocus for JFormattedTextField








Question

We would like to know how to handle PropertyChangeListener and requestFocus for JFormattedTextField.

Answer

import java.text.NumberFormat;
//  w  ww  .  j  ava2s.c o m
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.NumberFormatter;

public class Main {
  
  NumberFormatter formatter = new NumberFormatter(NumberFormat.getNumberInstance());
  DocumentListener listener;
  JFormattedTextField input = new JFormattedTextField(formatter), 
      input2 = new JFormattedTextField(formatter);
  public Main() {
    listener = new DocumentListener() {
      Document source = null;
      protected void update(Document doc) {
        if (source == null) {
          System.out.println("Update");
          source = doc;
          if (source.equals(input.getDocument())) {
            input2.setText(input.getText());
          } else if (source.equals(input2.getDocument())) {
            input.setText(input2.getText());
          }
          source = null;
        }
      }

      @Override
      public void insertUpdate(DocumentEvent e) {
        update(e.getDocument());
      }

      @Override
      public void removeUpdate(DocumentEvent e) {
        update(e.getDocument());
      }

      @Override
      public void changedUpdate(DocumentEvent e) {
        update(e.getDocument());
      }
    };

    input.getDocument().addDocumentListener(listener);
    input2.getDocument().addDocumentListener(listener);

    input.setColumns(4);
    input2.setColumns(4);

    input.setValue(0.0);
    JPanel panel = new JPanel();
    panel.add(input);
    panel.add(input2);

    JOptionPane.showMessageDialog(null, panel);
  }
  public static void main(String[] args) {
    new Main();
  }
}