Java:文本字段 FocusListener focusGained 执行两次,为什么?

标签 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 中。

你有什么想法吗..>

最佳答案

  • 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/

相关文章:

java - 图像未显示在 jPanel 中

wpf - 选择选项卡项内容时如何聚焦 WPF 选项卡项?

java - 防止进一步实例化 Java 类的最佳实践

java - 使用递归方法查找字符串中的单词数

java - 我应该使用 HttpURLConnection 还是 RestTemplate

jquery - 无法将焦点设置在 Excel 加载项中的 ui-ace 上

java - 如何在Swing中同步请求焦点?

java - ScheduledThreadPoolExecutor,如何停止可运行类JAVA

java - 是否有不同的方法来编写此代码,使其不使用循环

java - 如何在滚动 Pane 上放置多个标签以及为什么该标签放置在中心?