gtiwari333
gtiwari333

Reputation: 25174

Synchronize JTextFields Values by PropertyChangeListener

I want to copy the value of a jTextField - TXTFLD1 to another jTextField -TXTFLD2 when the value at TXTFLD1 changes.
I choose propertychangelistener because i cannot detect when the value at TXTFLD1 is changed, Because it is changed by some external code which i cannot modify now.

The test code is as follows :


public class TxtFldSync extends JFrame {
    private JButton BTN1 = null;
    private JTextField TXTFLD1 = null;
    private JTextField TXTFLD2 = null;

    public static void main(String[] args) {
            TxtFldSync thisClass = new TxtFldSync();
            thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            thisClass.setVisible(true);
    }
    public TxtFldSync() {
        super();
        this.setSize(300, 200);
        BTN1 = new JButton();
        BTN1.setBounds(new Rectangle(178, 38, 67, 17));
        TXTFLD1 = new JTextField();
        TXTFLD1.setBounds(new Rectangle(32, 42, 83, 20));

        TXTFLD2 = new JTextField();
        TXTFLD2.setBounds(new Rectangle(30, 78, 83, 20));

        //listeners
        TXTFLD1.addPropertyChangeListener("value", new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent arg0) {
                TXTFLD2.setText(TXTFLD1.getText()+"set by change listener");
                //this doesnot work why ?
            }
        });
        BTN1.addActionListener( new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                TXTFLD1.setText("Action Performed");
                //i what to set same value to TXTFLD2 using property change listener
            }
        });

        this.setContentPane(new Container());
        this.getContentPane().add(BTN1);
        this.getContentPane().add(TXTFLD1);
        this.getContentPane().add(TXTFLD2);
    }
}

Why the property change listener is not working. What are the other alternatives solution for this problem?

Upvotes: 3

Views: 9263

Answers (6)

Abdul
Abdul

Reputation: 587

Write this method instead of.

Replace TXTFLD1.addPropertyChangeListener with this method:

TXTFLD1.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent arg0) {}
    @Override
    public void keyReleased(KeyEvent arg0) {
        TXTFLD2.setText(TXTFLD1.getText());
    }
    @Override
    public void keyPressed(KeyEvent arg0) {}
});

Upvotes: 0

mKorbel
mKorbel

Reputation: 109823

For example, as StanislavL +1 suggested by using DocumentListener:

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();
            }
        });
    }
}

Upvotes: 12

mre
mre

Reputation: 44250

That's because there's no one firing property change events. Read up on How to Write an Action Listener, although in order to trigger an action event, it is required that you press Enter. Otherwise, you'll need to read up on How to Write a Document Listener.

Upvotes: 1

MByD
MByD

Reputation: 137422

You should register a document listener to it's document. Taken from JTextField documentation:

In the JTextComponent based components, changes are broadcasted from the model via a DocumentEvent to DocumentListeners. The DocumentEvent gives the location of the change and the kind of change if desired. The code fragment might look something like:

 DocumentListener myListener = ??;
 JTextField myArea = ??;
 myArea.getDocument().addDocumentListener(myListener);

Upvotes: 3

Heisenbug
Heisenbug

Reputation: 39194

Change the PropertyChangeListener with an ActionListener or DocumentListener.

Upvotes: 2

StanislavL
StanislavL

Reputation: 57421

DocumentListener yourDocListener=...;
TXTFLD1.getDocument().addDocumentListener(yourDocListener);

Upvotes: 5

Related Questions