我的想法是:有两个jtextarea,jtextarea1用于输入,jtextarea2用于输出,但是我想在jtextarea2组件上可以移动光标,而不改变它的内容。(效果像qq的聊天窗口)
我的一个解决方法是:在jtextarea2上注册key监听器,然后将焦点转移给jtextarea1。
textArea1.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
textArea2.grabFocus();//当在textArea1上面有键盘输入时,自动将焦点转移到textArea2;
}
});
可是这样子的话总会有一个字符出现在jtextarea2上面!请教各位如何解决这个问题

解决方案 »

  1.   

    不知道下面的三种,有没有你想要的,或者是某两种的组合版本(下面这段是1,3的组合版)
    (仅限功能,具体代码的优化,美化,就留给你了)
    1. ctrl+enter  把jtextarea1的值放到jtextarea2
    2. jtextarea1输入的同时,jtextarea2跟着变
    3. 光标
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.GridLayout;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;import javax.swing.JFrame;
    import javax.swing.JTextArea;public class Test4TextArea extends JFrame { /**
     * @param args
     */
    public static void main(String[] args) {
    new Test4TextArea();
    } public Test4TextArea() {
    setSize(500, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container c = this.getContentPane();
    c.setLayout(new GridLayout(0, 1)); final JTextArea jta1 = new JTextArea();
    jta1.setSize(400, 200);
    jta1.setWrapStyleWord(true);
    final JTextArea jta2 = new JTextArea();
    jta2.setBackground(Color.LIGHT_GRAY);
    jta2.setSize(400, 200);
    jta2.setWrapStyleWord(true);
    jta2.setEditable(false); // * ************* 3 BEGIN *************************
    jta2.setEditable(true);
    jta2.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub } public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub } public void keyTyped(KeyEvent e) {
    if (e.getKeyCode() != KeyEvent.VK_UP
    && e.getKeyCode() != KeyEvent.VK_DOWN
    && e.getKeyCode() != KeyEvent.VK_LEFT
    && e.getKeyCode() != KeyEvent.VK_RIGHT) {
    e.consume();
    }
    }
    });
    // ************* 3 END **************************/ // *********************** 1 BEGIN *******************************
    jta1.addKeyListener(new KeyListener() {
    public void keyPressed(KeyEvent e) {
    if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER) {
    jta2.setText(jta2.getText() + "\n" + jta1.getText());
    jta1.setText("");
    }
    } public void keyReleased(KeyEvent e) {
    } public void keyTyped(KeyEvent e) {
    }
    });
    // *********************** 1 END ******************************* // *********************** 2 BEGIN *******************************
    // jta1.getDocument().addDocumentListener(new DocumentListener() {
    //
    // public void changedUpdate(DocumentEvent e) {
    // jta2.setText(jta1.getText());
    // }
    //
    // public void insertUpdate(DocumentEvent e) {
    // jta2.setText(jta1.getText());
    // }
    //
    // public void removeUpdate(DocumentEvent e) {
    // jta2.setText(jta1.getText());
    // }
    // });
    // *********************** 2 END ******************************* c.add(jta2);
    c.add(jta1); setVisible(true);
    }
    }
      

  2.   

    楼主的监听实现的方法是keyPressed,换成keyReleased(KeyEvent e) 试试