我有一个文本框,我想在文本框获得焦点时显示一个对话框。所以我写了以下代码。但是当对话框被处理后,对话框会再次出现。我尝试使用换行符进行调试和检查。那次它不会执行多次,但在正常模式下它会执行多次,因此对话框出现两次...
txt1.addFocusListener(new FocusListener(){
@Override
public void focusGained(FocusEvent e) {
myform f = new myform(null,true);
f.setLocationRelativeTo(null);
f.setVisible(true);
if("OK".equals(f.button_state)){
txt2.requestFocus();
}
}
@Override
public void focusLost(FocusEvent e) {
}
});
如果我将 txt2.requestFocus()
放在可见的对话框之前,则不会发生多次执行。但我不相信。因为我需要将光标保留在 txt1
中。
你有什么想法吗..>
最佳答案
FocusListener 不是创建修改容器的代码的正确位置
Focus 是完全异步的,因此可以保证方法的正确顺序
Swing GUI 创建必须包装到 invokeLater 中,更多信息请参阅 Oracle 教程 - 初始线程
只有这段代码被剪断才能在 FocusListener 中工作
。包装到invokeLater
if("OK".equals(f.button_state)){
txt2.requestFocus();
}
- 或
setVisible(true);
将myform
包装到invokLater
中,但我认为必须在之前准备好(每个JComponents
被添加、初始化、使用和应用LayoutManager
、打包
),否则没有任何保证,你只能在那里调用
。包装到invokeLater
f.setVisible(true);
if("OK".equals(f.button_state)){
txt2.requestFocus();
}
关于Java:文本字段 FocusListener focusGained 执行两次,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18084661/