I\'ve got an interface with 2 JFormattedTextFields for which I need the values (not just the displayed text) to be identical. Ideally they should both be editable, with a chang
I need the values (not just the displayed text) to be identical. Ideally they should both be editable, with a change in one being mirrored in the other.
use DocumentListener,
for example (only the one directions)

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class TextLabelMirror {
    private JPanel mainPanel = new JPanel();
    private JTextField field = new JTextField(20);
    private JTextField field1 = new JTextField(20);
    public TextLabelMirror() {
        field.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void changedUpdate(DocumentEvent e) {
                updateLabel(e);
            }
            @Override
            public void insertUpdate(DocumentEvent e) {
                updateLabel(e);
            }
            @Override
            public void removeUpdate(DocumentEvent e) {
                updateLabel(e);
            }
            private void updateLabel(DocumentEvent e) {
                java.awt.EventQueue.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        field1.setText(field.getText());
                    }
                });
            }
        });
        mainPanel.setLayout(new GridLayout(1, 0, 10, 0));
        mainPanel.add(field);
        mainPanel.add(field1);
    }
    public JComponent getComponent() {
        return mainPanel;
    }
    private static void createAndShowUI() {
        JFrame frame = new JFrame("TextLabelMirror");
        frame.getContentPane().add(new TextLabelMirror().getComponent());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}
You can use a key listener. You simply add a key listener to both fields using the below code. the reason you need the other events is it will throw errors unless you have them in the code.
import javax.swing.*;   
import java.awt.*;  
import java.awt.event.*;
public class CreateGrid 
{    
    JFrame thisframe;
    JFormattedTextField jFormattedTextField1, jFormattedTextField2;
    public CreateGrid()
    {
        GridLayout thislayout = new GridLayout(0,2);
        thisframe = new JFrame();
        thisframe.setLayout(thislayout);
        jFormattedTextField1 = new JFormattedTextField();
        jFormattedTextField2 = new JFormattedTextField();
        jFormattedTextField1.addKeyListener(new KeyAdapter()
        {
            public void keyReleased(KeyEvent e) 
            {                
                JFormattedTextField textField = (JFormattedTextField) e.getSource();
                String text = textField.getText();
                jFormattedTextField2.setText(text);
            }
            public void keyTyped(KeyEvent e) 
            {
            }
            public void keyPressed(KeyEvent e) 
            {
            }            
        });
        jFormattedTextField2.addKeyListener(new KeyAdapter()
        {
            public void keyReleased(KeyEvent e) 
            {                
                JFormattedTextField textField = (JFormattedTextField) e.getSource();
                String text = textField.getText();
                jFormattedTextField1.setText(text);
            }
            public void keyTyped(KeyEvent e) 
            {
            }
            public void keyPressed(KeyEvent e) 
            {
           }            
       });
       thisframe.add(jFormattedTextField1);
       thisframe.add(jFormattedTextField2);
       thisframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       thisframe.setVisible(true);
       thisframe.pack();
   }
public static void main(String args[])
{
    new CreateGrid();
}    
} I have tested this out and it works perfectly what ever you type into one field will show up in the other as you type it.