这段代码适用于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迟到了?
答案 0 :(得分:1)
我猜是这样的:在事件被触发后,JTextField
的值会更新。因此,当您使用keyTyped
方法阅读文本值而没有invokeLater
时,您无法看到更新后的值
键入键时,在EDT中完成两项操作:
keyTyped
(打印文本的位置)keyTyped(final KeyEvent e)
事件。Runnable
安排invokeLater
,则Swing会在EDT队列末尾添加此操作,因此它会变为:keyTyped
事件(您安排Runnable
)Runnable
时打印文本