我有一个文本框,当文本框是焦点增益时,我想显示一个对话框。所以我写了下面的代码。但是当对话框出现时,再次出现对话框。我尝试使用换行符进行调试和检查。那个时候它不会执行多次,但在正常模式下它会执行多次,因此对话框会出现两次......
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
。
你有什么想法吗?>
答案 0 :(得分:1)
FocusListener不适合创建修改容器的代码
焦点是非常异步的,然后对方法的正确排序有任何保证
Swing GUI创建必须包装到invokeLater中,更多信息请参见Oracle教程 - 初始线程
只有此代码剪切才能在FocusListener
。包装到invokeLater
if("OK".equals(f.button_state)){
txt2.requestFocus();
}
setVisible(true);
已将myform
包含在invokLater
中,但我认为必须先准备好(每{{}}}添加,初始化,使用和应用JComponents
LayoutManager
},packed
),否则没有任何保证,只能打电话。包装到invokeLater
f.setVisible(true);
if("OK".equals(f.button_state)){
txt2.requestFocus();
}