【问题标题】:DocumentListener or KeyListenerDocumentListener 或 KeyListener
【发布时间】:2015-07-02 01:43:47
【问题描述】:

this question 的cmets 和this question 的答案中提到应该使用documentListenerdocumentFilter 而不是keyListener。这是为什么呢?

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

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)JTextFieldactionPerformed(ActionEvent ae) 获取文本输入,用于JButton

我的问题是,应该使用documentListener/documentFilter 而不是keyListener,以及为什么为什么不

【问题讨论】:

    标签: java swing jtextfield keylistener documentlistener


    【解决方案1】:
    • KeyListener -- 你几乎应该从不将它与文本组件一起使用,因为它是一个低级构造并且可能会弄乱文本组件的功能。
    • DocumentListener -- 如果您不打算过滤输入,请使用它 -- 如果您要接受所有显示的输入但只想跟踪输入。
    • DocumentFilter -- 如果要在显示之前过滤输入,则使用此过滤器。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-18
        • 2013-04-28
        • 2013-07-03
        • 2018-11-11
        • 2013-01-20
        • 1970-01-01
        • 2011-06-03
        • 2013-05-23
        • 2014-12-11
        相关资源
        最近更新 更多