没有EventQueue的invokeLater,第一个UserTypedString没有在keyTyped(keyListener)中得到认可

时间:2015-03-05 07:39:02

标签: java multithreading jcombobox keylistener

这段代码适用于fyn。但是如果我删除了EventQueue.invokeLater(),那么键入的第一个键就没有得到认可

   public static class ListenerDemo implements KeyListener
    {
    String userString = null;
    private String getUserTypedString(KeyEvent e)
    {
        return ((JTextField) e.getSource()).getText();
    }

    @Override
    public void keyTyped(final KeyEvent e) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                userString = ((JTextField) e.getSource()).getText();
                System.out.println("User str = " +userString);


            }
        });
    }

JCombox中的输入:1,在keyTyped输出中为User str = 1

但是,如果我不使用EventQueue.invokeLater()

我键入的Jcombobox输入为1,但输出为userTyped =

然后在键入2时,我得到输出为userTyped = 1

如果所有事件都由EDT线程处理,则必须使用EventQueue.invokeLater()。为什么keyType迟到了?

1 个答案:

答案 0 :(得分:1)

我猜是这样的:在事件被触发后,JTextField的值会更新。因此,当您使用keyTyped方法阅读文本值而没有invokeLater时,您无法看到更新后的值 键入键时,在EDT中完成两项操作:

     通过调用您的方法keyTyped(打印文本的位置)
  1. fire keyTyped(final KeyEvent e)事件。
  2.  
  3. 更新文字值。
  4. 但是如果您使用Runnable安排invokeLater,则Swing会在EDT队列末尾添加此操作,因此它会变为:
       
    1. fire keyTyped事件(您安排Runnable
    2. 的地方  
    3. 更新文字值
    4.  
    5. 在调用Runnable时打印文本