【问题标题】:How to trigger keyReleased event in java swing如何在 java swing 中触发 keyReleased 事件
【发布时间】:2014-05-13 06:33:08
【问题描述】:

我正在尝试在 java swing 中触发按键释放事件。

txtEmailId.addKeyListener(new KeyAdapter() {
            // override keyReleased listener on the Email TextField
            @Override
            public void keyReleased(KeyEvent e) {

                                System.out.println("ok");
            }
        });

上面的代码现在运行成功了,我想在txtEmailId.setText("hello");之后手动调用这个keyReleased事件怎么可能?

【问题讨论】:

  • 你的意思是如何通过代码手动触发keyReleased?
  • 是的,怎么可能?
  • 您不能以编程方式调用 keyReleased,请查看Documentation
  • 那我该如何解决我的问题呢?有什么办法吗?
  • 1) 对于 Swing,通常在基于 AWT 的较低级别 KeyListener 上使用键绑定。有关如何使用它们的详细信息,请参阅How to Use Key Bindings。 2) 这是经典的XY problem。

标签: java swing events keylistener jtextcomponent


【解决方案1】:

使用DocumentListener 代替KeyAdapter。试试下一个例子:

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;

public class TestFrame extends JFrame{

    public TestFrame(){
        init();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    private void init() {
        JTextField f = new JTextField();
        f.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent e) {
                validate(e);
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                validate(e);
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                validate(e);
            }

            private void validate(DocumentEvent e) {
                try {
                    String text = e.getDocument().getText(0, e.getDocument().getLength());
                    if(text.equals("hello")){
                        System.out.println("ok");
                    }
                } catch (BadLocationException e1) {
                    e1.printStackTrace();
                }
            }
        });
        f.setText("hello");
        add(f);
    }

    public static void main(String... s){
        new TestFrame();
    }

}

【讨论】:

  • 这是怎么解决我的问题的?
  • 我建议你用另一种方法在你的 JTextField 上触发事件,而无需手动触发事件。
  • @user3363563 不建议使用文本组件的 KeyListener,因为如果您在关键事件通知期间尝试修改字段,则事件可能会在它们到达您的侦听器之前被消耗或导致突变错误,它也没有考虑文本何时持续到该字段中。推荐使用 DocumentListener 来监控字段/文档内容的更改,使用 DocumentFilter 来在提交到文档/字段之前过滤内容
  • @user3363563 该解决方案直接解决了您的问题,因为它会在调用 setText 时收到通知,全面地解决您的问题,因为它克服了您尚未遇到的许多问题,并且您遇到的问题不应该被否决。 +1
  • 好吧,既然你似乎问了一个 XY 问题,那么这个答案似乎试图猜测你在做什么,并提供一个更好的方法。不需要太多经验就能知道任何将 Swing 和 KeyListener 混合的东西都有更好的解决方案,但很难知道最好的解决方案是什么,直到您说明您要实现的目标(与您尝试做的事情相反)。
猜你喜欢
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多