DocumentListener 或 KeyListener

DocumentListener or KeyListener

this question and in answers of this question的评论中提到应该使用documentListenerdocumentFilter而不是keyListener。这是为什么?

在我前几天写的一个简单的 Hangman 游戏中,我做了类似下面的代码:

public class Hangman extends JFrame implements KeyListener, ActionListener{
    private JTextField guess;
    private JButton b1;
    private void addComponentsToPane(){
        b1 = new JButton("New Game");
        b1.addActionListener(this);
        guess = new JTextField(2);
        guess.addKeyListener(this);

稍后在代码中,我使用 keyTyped(KeyEvent ke)JTextField 获取文本输入,并使用 actionPerformed(ActionEvent ae) 获取 JButton 的文本输入。

我的问题是,应该使用 documentListener/documentFilter 而不是 keyListener,以及 why or why不是?

我将回答一个问题:如果您 运行 您的程序在使用鼠标中键作为 "paste" 命令的系统上,会发生什么情况?例如,Linux 的某些版本就是这样做的。

在这种情况下,用户可以将文本粘贴到 JTextField 中,而您的程序将不会检测到它。

有很多像这样的极端情况,所以尽管您的 KeyListener 可能大部分时间都在工作,但您不应该依赖它来处理重要的事情 - 否则您会有一群困惑和恼火的用户.

  • KeyListener -- 您几乎 永远不要 将其与文本组件一起使用,因为它是一个低级结构,可能会扰乱文本组件的功能。
  • DocumentListener -- 如果您不打算过滤输入 -- 如果您要接受所有显示的输入但只想跟踪输入,请使用它。
  • DocumentFilter -- 如果您要在显示之前过滤输入,请使用。

我自己,我会使用 DocumentFilter,因为这样我可以忽略非字母输入。我也支持 Kevin 提到的所有内容。 1+ 他的回答。