Как скопировать текст из одной Jtextarea в другую jtextarea?

Мне нужно скопировать содержимое jtextarea в другую jtextarea. Как это можно сделать. Я сделал следующее: Но эта программа записывает текстовую форму из одной области jtext в другую посимвольно. Я хочу, чтобы он копировал его, когда пользователь нажимает клавишу ввода (carage returm. Как мне это сделать? Заранее спасибо.

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;

public class JtextareaTest {

    static JTextComponent jtextArea1;
    static JTextArea jtextArea2;

    public static void main(String[] args) {
        jtextArea1 = new JTextArea(10, 20);
        jtextArea2 = new JTextArea(10, 20);
        jtextArea1.setEditable(true);
        jtextArea2.setEditable(true);
        MyDocListen listener = new MyDocListen();
        jtextArea1.getDocument().addDocumentListener(listener);
        JFrame frame = new JFrame("JTextArea");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Create and set up the content pane.
        Container newContentPane = frame.getContentPane();
        JPanel jpanel = new JPanel();
        jpanel.add(jtextArea1);
        jpanel.add(jtextArea2);
        newContentPane.add(jpanel, BorderLayout.CENTER);
        frame.setContentPane(newContentPane);
        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
}

class MyDocListen implements DocumentListener {

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

    }

    @Override
    public void removeUpdate(DocumentEvent e) {
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
    }

    public void getText() {
        StringBuffer sb = new StringBuffer();
        String str = JtextareaTest.jtextArea1.getText();
        sb.append(str);
        JtextareaTest.jtextArea2.setText(sb.toString());
    }
}

person star    schedule 08.10.2013    source источник
comment
Клавиша ENTER реализована как новая строка в JTextArea, вам нужно будет удалить встроенные KeyBindings, но тогда возникает вопрос, как создать новую строку, не путайте пользователей   -  person mKorbel    schedule 08.10.2013
comment
Вы создаете ненужный StringBuffer. Строки неизменяемы, поэтому вы можете назначить их непосредственно jtextArea2 из jtextArea1.   -  person Piro says Reinstate Monica    schedule 08.10.2013


Ответы (2)


DocumentListener используется для обнаружения изменений в текстовом документе. Вы хотите использовать его, когда хотите, чтобы что-то происходило каждый раз, когда текст меняется.

Вы сказали, что хотите, чтобы что-то происходило каждый раз, когда пользователь нажимает клавишу ввода. Из-за этого, как справедливо указал @camickr, вам следует рассмотреть возможность использования Key Вместо этого связывание. Читайте на странице документа, так как это самый правильный способ обработки горячих клавиш в JComponent.

Быстрый и грязный способ сделать это — использовать KeyListener вместо этого прослушивает нажатия клавиш на низком уровне. Обратите внимание, что это не самый правильный способ сделать это, и это может затруднить сопровождение вашего кода.

Если вы хотите использовать KeyListener, сделайте следующее: измените свой класс MyDocListen на другой класс, который реализует KeyListener, и реализуйте KeyListener.keyTyped(), чтобы проверить, была ли нажата клавиша ввода, и если да, вызвать getText():

class MyKeyListener implements KeyListener {
    public void getText()
    {
        StringBuffer sb = new StringBuffer();
        String str = JtextareaTest.jtextArea1.getText();
        sb.append(str);
        JtextareaTest.jtextArea2.setText(sb.toString());
    }

    @Override
    public void keyPressed(KeyEvent e) {}

    @Override
    public void keyReleased(KeyEvent e) {}

    @Override
    public void keyTyped(KeyEvent e) {
    if (e.getKeyChar() == KeyEvent.VK_ENTER) {
            getText();
        }
    }
}

Тогда просто измените строку

MyDocListen listener= new MyDocListen();

to

MyKeyListener listener = new MyKeyListener();

и обязательно добавьте KeyListener в сам JTextArea, а не в его документ. Для этого замените эту строку:

jtextArea1.getDocument().addDocumentListener(listener);

с этим:

jtextArea1.addKeyListener(listener);

и это должно решить вашу проблему.

person Rebecca Nelson    schedule 08.10.2013
comment
@star, `вместо этого вам следует рассмотреть возможность использования KeyListener` - нет, не следует. Вам СЛЕДУЕТ использовать привязки клавиш, как уже упоминалось мКорбель. Кроме того, поведение по умолчанию для JTextArea заключается в добавлении новой строки в текстовую область. Если вы добавите эту функциональность, то как пользователь сможет добавить новую строку в текстовую область? Если вам не нужны новые строки, вам следует использовать JTextField, а затем просто добавить ActionListenr в текстовое поле, которое будет вызываться при нажатии Enter. - person camickr; 08.10.2013
comment
@camickr Я отказываюсь от своего предыдущего комментария; Я идиот, неправильно прочитал страницу и попытался опровергнуть вас, показав вам вашу собственную точку зрения. Я отредактирую этот ответ, чтобы включить вашу точку зрения. - person Rebecca Nelson; 08.10.2013
comment
Я буду использовать приведенный выше код для связи между двумя пользователями в коммуникаторе. Итак, здесь мне нужно использовать привязки клавиш или прослушиватель ключей? Текст будет отображаться в текстовых областях коммуникатора. - person star; 09.10.2013

или используйте это->

private void jButtonKeyTyped(java.awt.event.KeyEvent evt) {     
    char c == evt.getKeyChar();
    if(c==KeyEvent.VK_ENTER){
    yoursecondtextarea.setText(yourfirsttextarea.getText());
    }
}
person user3271166    schedule 04.02.2014