2014-07-10 3 views
4

키를 누를 때마다 포커스가 JTextField 내에 있고 JTextField의 내용을 JTextArea의 새 줄에 추가 할 때마다 JTextArea를 업데이트하는 다음 코드가 있습니다.내 KeyAdapter가 항상 한 걸음 뒤로 물러납니다.

내 문제는 내가 키를 누를 때마다 JTextArea 업데이트가 항상 내가 원하는 곳의 핵심이라는 것입니다.

예 :"cat"을 JTextField에 입력하고 "ca"만 JTextArea에 표시합니다. 원하는 문자열 인 "cat"대신 "cat"만 사용하십시오.

언제든지 읽어 주셔서 감사합니다. 입력 된 문자가 JTextField를 문서로 저장하기 전에 keyPressed도 발생하기 때문에 발생

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

답변

5

. 따라서 텍스트를 검색하려고 할 때 실제 값보다 한 걸음 더 나아 보이지만 실제로는 그렇지 않습니다. 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"); 
     } 
    } 
} 
+0

감사를 마치 마법처럼 작동합니다

나는 당신이 달성하려고하는 물건을 할 JTextField를 문서의 변경을들을 수있는 두 가지 방법을 알고, 그들 각각이 특정한 경우에 적용됩니다. 하나가 다른 것보다 더 적절한가요? – James

+0

JavaDoc의 차이점에 대한 특별한 코멘트를 실제로 찾지는 못했지만, 단순히 다릅니다 만 다른 이벤트와 옵션을 제공합니다. 예를 들어 UndoableEditListener를 사용하면 문서에 대한 변경 사항을 취소 할 수 있습니다. –

+0

그리고 DocumentListener는 문서에서 정확히 무엇이 바뀌 었는지 말합니다. 그 정보를 필요로 할 때 유용합니다. –

관련 문제