harry4
harry4

Reputation: 189

Simultaneously update text area while typing in text field

I want to update my text area along with typing in the text field but i get a delay of 1 keystroke while typing i.e when i press a key the previous key is displayed.Here is my snippet

private void jTextField1KeyTyped(java.awt.event.KeyEvent evt)
{         
    String a = jTextField1.getText();
    jTextArea1.setText(a);            
}  

Upvotes: 4

Views: 12692

Answers (4)

David Kroukamp
David Kroukamp

Reputation: 36423

I would not recommend using KeyListeners

Simply add a DocumentListener to your JTextField via:

textField.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void insertUpdate(DocumentEvent de) {
            }

            @Override
            public void removeUpdate(DocumentEvent de) {
            }

            @Override
            public void changedUpdate(DocumentEvent de) {
            }
        });

Inside each of the methods ( insertUpdate,removeUpdate and changedUpdate) simply put in a call to set the text of your JTextArea via setText():

textArea.setText(textField.getText());

Here is an example I made:

import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().createAndShowUI();
            }
        });
    }

    private void createAndShowUI() {
        final JFrame frame = new JFrame("Test");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        initComponents(frame);

        frame.setResizable(false);
        frame.pack();
        frame.setVisible(true);
    }

    private void initComponents(JFrame frame) {
        final JTextField jtf = new JTextField(20);
        final JTextArea ta = new JTextArea(20,20);

        ta.setEditable(false);

        jtf.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void insertUpdate(DocumentEvent de) {
                ta.setText(jtf.getText());
            }

            @Override
            public void removeUpdate(DocumentEvent de) {
                ta.setText(jtf.getText());
            }

            @Override
            public void changedUpdate(DocumentEvent de) {
            //Plain text components don't fire these events.
            }
        });

        frame.getContentPane().add(jtf, BorderLayout.WEST);
        frame.getContentPane().add(ta, BorderLayout.EAST);
    }
}

Upvotes: 11

AqueousSnake
AqueousSnake

Reputation: 23

You could try using recursion by referencing the method inside the method (avoid loops though).

Upvotes: 0

Dan D.
Dan D.

Reputation: 32391

You should do that under the keyReleased event instead of the keyTyped and it will work as you need.

Upvotes: 6

Jonathan Drapeau
Jonathan Drapeau

Reputation: 2610

You need to wait till the event on your TextField is processed before updating the TextArea. Your code update the TextArea before the TextField is done processing the new typed character. Hence the text set in the TextArea is one keystroke behind.

Upvotes: 0

Related Questions