在文本字段中键入时同时更新文本区域

时间:2012-10-01 16:54:47

标签: java swing jtextfield jtextarea

我想更新我的文本区域以及在文本字段中键入,但是在键入时我会得到1次击键的延迟,即当我按下键时显示上一个键。这是我的片段

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

4 个答案:

答案 0 :(得分:11)

我不建议使用KeyListeners

只需将DocumentListener添加到JTextField,然后通过:

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

            @Override
            public void insertUpdate(DocumentEvent de) {
            }

            @Override
            public void removeUpdate(DocumentEvent de) {
            }

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

在每个方法(insertUpdateremoveUpdatechangedUpdate)中,只需拨打电话即可通过JTextArea设置setText()的文字:

textArea.setText(textField.getText());

这是我做的一个例子:

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

答案 1 :(得分:6)

您应该在keyReleased事件而不是keyTyped下执行该操作,并且可以根据需要使用。

答案 2 :(得分:0)

在更新TextArea之前,您需要等到处理TextField上的事件。您的代码在处理新类型字符的TextField完成之前更新TextArea。因此,TextArea中设置的文本是一个键击。

答案 3 :(得分:0)

您可以尝试通过引用方法内部的方法来使用递归(尽管避免循环)。