【问题标题】:Java: Text Field FocusListener focusGained executes two times, why?Java:Text Field FocusListener focusGained 执行两次,为什么?
【发布时间】:2023-04-05 07:40:01
【问题描述】:

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

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

你有什么想法吗..>

【问题讨论】:

    标签: java swing focus jtextfield focuslistener


    【解决方案1】:
    • FocusListener 不适用于创建已修改容器的代码

    • Focus 是相当异步的,因此方法的正确排序有任何保证

    • Swing GUI 创建必须包含在 invokeLater 中,更多信息请参见 Oracle 教程 - 初始线程

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

    。封装在 invokeLater 中

    if("OK".equals(f.button_state)){
         txt2.requestFocus();   
    }
    
    • setVisible(true);myform包装成invokLater,但我认为必须在之前准备好(每个JComponents都被添加,初始化,使用和应用LayoutManagerpacked),否则没有任何保证什么都可以,只能打电话

    。封装在 invokeLater 中

    f.setVisible(true);
    if("OK".equals(f.button_state)){
          txt2.requestFocus();   
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多