DocumentListener 或 KeyListener
DocumentListener or KeyListener
this question and in answers of this question的评论中提到应该使用documentListener
或documentFilter
而不是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+ 他的回答。
this question and in answers of this question的评论中提到应该使用documentListener
或documentFilter
而不是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+ 他的回答。