简体   繁体   中英

Take JTextField text and display it on JTextarea in real time

I made this program for discord. This program takes your text and puts it in this 'format' that allows discord to convert it to fancy letters. My problem is that while typing the text lags behind by 1 character. I am only a beginner and I don't know what to do to fix it.

Ps. I do not feel like using a button to convert the text!

My Code :

textField = new JTextField();
    textField.addKeyListener(new KeyAdapter() {
        @Override
        public void keyTyped(KeyEvent e) {

            textArea.setText("");
            separatedText = textField.getText().toLowerCase().toCharArray();

            for(int i = 0; i < separatedText.length; i++) {
                textArea.append(separate ? ":regional_indicator_" + separatedText[i] + ":\n" : ":regional_indicator_" + separatedText[i] + ":");                        
            }

        }
    });

You can achieve this by adding a Document Listener to your JTextField. You don't give us what the "separate" boolean is, so i made the example in case this boolean is always true .

Small Preview:

在此处输入图片说明

Source Code:

package test;

import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class DocListenerTest extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            DocListenerTest r = new DocListenerTest();
            r.setVisible(true);
        });
    }

    public DocListenerTest() {
        super("test");
        getContentPane().setLayout(new GridLayout(5, 2));
        JTextField textField = new JTextField();
        textField.setBorder(BorderFactory.createTitledBorder("TextField"));
        getContentPane().add(textField);
        JTextArea textArea = new JTextArea();
        textArea.setBorder(BorderFactory.createTitledBorder("TextArea"));
        JScrollPane sp = new JScrollPane(textArea);
        getContentPane().add(sp);
        setSize(400, 400);
        textField.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent e) {
                addTextToArea();

            }

            private void addTextToArea() {
                textArea.setText("");
                char[] separatedText = textField.getText().toLowerCase().toCharArray();
                boolean separate = true; //Don't know the value of this.
                for (int i = 0; i < separatedText.length; i++) {
                    textArea.append(separate ? ":regional_indicator_" + separatedText[i] + ":\n"
                            : ":regional_indicator_" + separatedText[i] + ":");
                }
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                addTextToArea();

            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                addTextToArea();

            }
        });
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM