2012-11-28 29 views
0

我想要做的是按下键盘的那一刻,无论写在文本框上的什么都会显示在System.out.printLn()中。但是对于我制作的每种类型,只有在按下另一个键时才会显示。KeyListener - 为什么keyPressed方法延迟一种类型?

例如..我按'A'...然后会显示一个空白区域。 我按'B'...然后会显示'A'。 我按'C'...然后'AB'将会显示。

我想要的是如果我按'A'...然后'A'将显示...等 这有可能吗?我也试过这个上的keyTyped(),但结果是一样的..

这是我这么短的代码...

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 

public class NewClass extends JFrame implements KeyListener{ 
JTextField tf = new JTextField(); 
NewClass(){ 
    this.setLayout(null); 
    tf.setBounds(50, 50, 200, 30); 

    add(tf); 
    tf.addKeyListener(this); 
} 

public static void main(String[] args) { 
    NewClass r = new NewClass(); 
    r.setVisible(true); 
    r.setSize(300, 200); 
    r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

@Override 
public void keyTyped(KeyEvent e) { 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    System.out.println(tf.getText()); 
} 

@Override 
public void keyReleased(KeyEvent e) { 
} 

} 

有什么建议?在此先感谢:)

+1

如果您试图过滤进入该字段的文本,请使用'DocumentFilter'而不是 – MadProgrammer

+0

@MadProgrammer yes。我将在后面实际使用它作为搜索框。我会尝试该文件过滤器。谢谢 – Katherine

回答

5

问题是keyPressed被称为之前 TextBox更新。

而不是

tf.addKeyListener(this); 

尝试使用这样的:

tf.getDocument().addDocumentListener(new DocumentListener() { 
public void changedUpdate(DocumentEvent e) { 
    printIt(); 
} 
public void removeUpdate(DocumentEvent e) { 
    printIt(); 
} 
public void insertUpdate(DocumentEvent e) { 
    printIt(); 
} 

public void printIt() { 
    System.out.println(tf.getText()); 
} 

你需要导入javax.swing.event.DocumentEventjavax.swing.event.DocumentListener

+0

谢谢^^ ... – Katherine