0

我有一个文本框,我想在文本框获得焦点时显示一个对话框。所以我写了以下代码。但是当对话框设置好后,对话框又出现了。我尝试调试并检查换行符。那个时候它不会执行多次,但在正常模式下它会执行多次,所以对话框出现两次......

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.

你有什么想法..>

4

1 回答 1

1
  • FocusListener 不适用于创建修改容器的代码

  • 焦点是相当异步的,那么方法的正确排序有任何保证

  • Swing GUI 创建必须包装到 invokeLater 中,更多请参见 Oracle 教程 - 初始线程

  • 只有这段代码被剪断才能在 FocusListener 中工作

. 包装到 invokeLater

if("OK".equals(f.button_state)){
     txt2.requestFocus();   
}
  • setVisible(true);for myformWrapped into invokLater,但我认为必须在之前准备好(每个JComponents都添加,初始化,使用和应用LayoutManagerpacked),否则没有任何保证,你只能调用

. 包装到 invokeLater

f.setVisible(true);
if("OK".equals(f.button_state)){
      txt2.requestFocus();   
}
于 2013-08-06T16:03:12.907 回答