2012-10-01 86 views
4

我想在文本字段敲字更新我的文字區域,但我得到1次擊鍵的延遲,同時打字即當我按一個鍵之前的關鍵是displayed.Here是我的片段而在文本字段中鍵入同時更新文本區域

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

你往往比風改變其方向改變公認的答案。 –

+0

@丹其實我想接受這兩個答案,但不能現在最終我堅持1. – harry4

+0

沒問題,只是有趣的是,你改變了接受的答案4次。 –

回答

9

我不建議使用KeyListeners

只需通過添加DocumentListenerJTextField

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

亞它工作正常。但是它與上面發佈的有什麼不同,或者有更多的優勢。 – harry4

+0

@HarshitSharaff如果您粘貼或剪切文本,'DocumentListener'將會出現'KeyListener'的主要優點。 –

+1

非常感謝它幫助 – harry4

0

您需要等待TextField上的事件在更新TextArea之前進行處理。在TextField完成處理新輸入的字符之前,您的代碼將更新TextArea。因此,在TextArea中設置的文本是背後的一個按鍵。

+0

沒有它不是這種情況。無論我等待多久,它都不會更新,直到下一次按鍵 – harry4

+1

因爲這是您正在使用的事件,所以在時間上並不重要。 Dan的回答正是我想到的,在keyReleased被調用的時候處理了鍵擊更新TextField的事件。 –

+0

明白了你的意思 – harry4

6

你應該這樣做,根據keyReleased事件,而不是keyTyped,也將努力爲您的需要。

+0

我同意這樣可以解決他的問題,但是如果按下按鍵,他也可能想要一個循環開始。你可能只需要一個簡短的等待()或睡眠()的循環 – tcannon91

0

你可以嘗試通過引用方法內部的方法來使用遞歸(儘管避免循環)。