Java:Text Field FocusListener focusGained执行两次,为什么?

时间:2013-08-06 15:42:56

标签: java swing focus jtextfield focuslistener

我有一个文本框,当文本框是焦点增益时,我想显示一个对话框。所以我写了下面的代码。但是当对话框出现时,再次出现对话框。我尝试使用换行符进行调试和检查。那个时候它不会执行多次,但在正常模式下它会执行多次,因此对话框会出现两次......

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

你有什么想法吗?>

1 个答案:

答案 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();   
}