weixin_43776392 2020-03-21 16:07 采纳率: 0%
浏览 216

swing里tab切换的执行顺序问题?

想要的顺序是先切换到第二个tab页签,然后在执行下面的修改配置文件等三个方法。目前情况是执行完三个方法后,才切换到第二个tab页签,明明tabPane.setSelectedIndex(1);在方法前面,为什么却没执行呢?

    //开始安装按钮
    if (e.getSource().equals(button3)) {

        //点击确认进入安装的tab页
        tabPane.setSelectedIndex(1);
        tabPane.setEnabledAt(0, false);

        //进度条开始
        progressBar.setValue(1);

        mysql_username = text3.getText();
        mysql_password = new String(text4.getPassword());

        //修改配置文件
        generateConfiguration(tomcat_dir_path, project_dir_path, mysql_username, mysql_password);
        //移动项目至指定位置
        movProjectDir(project_dir_path);
        //启动tomcat
        //startTomcat(tomcat_dir_path);
        progressBar.setValue(100);

        // 关闭窗口
        //frame.setVisible(false);//隐藏
        frame.dispose();        //销毁

    }
  • 写回答

1条回答 默认 最新

  • 科技梦想家 2024-09-25 19:22
    关注

    以下内容由AIGC 及 gpt.4o 科技梦想家编程波士 共同为您回答解决方案、有用望采纳☀️☀️:

    在 Swing 中,UI 事件和更新是通过事件调度线程(EDT)处理的。当你调用 tabPane.setSelectedIndex(1) 时,切换 tab 页的操作会被安排在 EDT 中,但不会立即执行,后续的代码(如修改配置文件的方法)会继续执行。

    要确保在切换到第二个 tab 页之后再执行其他操作,可以使用 SwingUtilities.invokeLater 来安排这些方法的执行,确保切换操作首先完成。示例代码如下:

    
    if (e.getSource().equals(button3)) {
        // 点击确认进入安装的tab页
        tabPane.setSelectedIndex(1);
        tabPane.setEnabledAt(0, false);
    
        // 进度条开始
        progressBar.setValue(1);
        
        mysql_username = text3.getText();
        mysql_password = new String(text4.getPassword());
    
        // 使用invokeLater确保UI更新后再执行方法
        SwingUtilities.invokeLater(() -> {
            // 修改配置文件
            generateConfiguration(tomcat_dir_path, project_dir_path, mysql_username, mysql_password);
            // 移动项目至指定位置
            movProjectDir(project_dir_path);
            // 启动tomcat
            // startTomcat(tomcat_dir_path);
            progressBar.setValue(100);
            
            // 关闭窗口
            // frame.setVisible(false); // 隐藏
            frame.dispose(); // 销毁
        });
    }
    
    

    这样可以确保 setSelectedIndex(1) 的效果在后续的操作之前显示出来。

    评论

报告相同问题?