Why is my KeyAdapter always one step behind?

I have the following code that is designed to update JTextArea every time a key is pressed, and the focus is inside the JTextField and adds the contents of the JTextField to a new line in JTextArea.

My problem is that every time I press a key, updating JTextArea is always one of the key elements where I want.

Example: I type β€œcat” in a JTextField, and only β€œca” appears in JTextArea, and not in the full String β€œcat” that I want.

Any advice is appreciated, thanks for your time reading.

import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class Testing extends JFrame {
    JTextField text;
    JTextArea textArea;

    public static void main(String[] args) {
        Testing gui = new Testing();
        gui.go();
    }

    public void go() {
        this.setLayout(new BorderLayout());
        text = new JTextField();
        text.addKeyListener(new TestKeyListener());
        textArea = new JTextArea();

        this.add(text, BorderLayout.NORTH);
        this.add(textArea, BorderLayout.CENTER);

        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setSize(300,300);
        this.setVisible(true);
    }

    private class TestKeyListener extends KeyAdapter {

        @Override
        public void keyPressed(KeyEvent evt) {
            textArea.append(text.getText() + "\n");
        }
    }
}
+4
source share
1 answer

, keyPressed , JTextField. , , "" , - JTextField .

JTextField, , , :

public class TestingTextArea extends JFrame
{
    JTextField text;
    JTextArea textArea;

    public static void main ( final String[] args )
    {
        final TestingTextArea gui = new TestingTextArea ();
        gui.go ();
    }

    public void go ()
    {
        this.setLayout ( new BorderLayout () );
        text = new JTextField ();

        // Add DocumentListener
        text.getDocument ().addDocumentListener ( new DocumentChangeListener () );

        // Or add UndoableEditListener
        text.getDocument ().addUndoableEditListener ( new UndoableEditAdapter () );

        textArea = new JTextArea ();                

        this.add ( text, BorderLayout.NORTH );
        this.add ( textArea, BorderLayout.CENTER );

        this.setDefaultCloseOperation ( WindowConstants.EXIT_ON_CLOSE );
        this.setSize ( 300, 300 );
        this.setVisible ( true );
    }

    public class DocumentChangeAdapter implements DocumentListener
    {
        @Override
        public void insertUpdate ( final DocumentEvent e )
        {
            documentChanged ( e );
        }

        @Override
        public void removeUpdate ( final DocumentEvent e )
        {
            documentChanged ( e );
        }

        @Override
        public void changedUpdate ( final DocumentEvent e )
        {
            documentChanged ( e );
        }

        public void documentChanged ( final DocumentEvent e )
        {
            textArea.append ( text.getText () + "\n" );
        }
    }

    public class UndoableEditAdapter implements UndoableEditListener
    {
        @Override
        public void undoableEditHappened ( final UndoableEditEvent e )
        {
            textArea.append ( text.getText () + "\n" );
        }
    }
}
+5

Source: https://habr.com/ru/post/1547943/


All Articles