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

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条回答 默认 最新

  • 东离与糖宝 Java领域优质创作者 2023-08-08 11:29
    关注

    根据你提供的代码,可以看出您希望在点击开始安装按钮后,先切换到第二个tab页签,然后再执行修改配置文件等三个方法。然而,你可能遇到了事件处理的延迟问题。
    通常情况下,Swing事件处理是按照顺序依次执行的。但是,涉及到耗时操作(如生成配置文件、移动文件等),这些操作可能会阻塞事件线程,导致界面未能及时刷新。
    你可以尝试使用多线程来解决这个问题,将耗时操作放到单独的线程中执行,以确保界面能够及时刷新。示例代码如下:

    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());
    
        // 在单独的线程中执行耗时操作
        Thread thread = new Thread(() -> {
            // 修改配置文件
            generateConfiguration(tomcat_dir_path, project_dir_path, mysql_username, mysql_password);
            // 移动项目至指定位置
            movProjectDir(project_dir_path);
            // 启动tomcat
            // startTomcat(tomcat_dir_path);
    
            // 切换到事件调度线程执行界面刷新相关代码
            SwingUtilities.invokeLater(() -> {
                progressBar.setValue(100);
                // 关闭窗口
                frame.dispose();
            });
        });
        thread.start();
    }
    
    

    通过在单独的线程中执行耗时操作,可以避免阻塞事件线程,确保界面能够及时刷新。在耗时操作完成后,使用SwingUtilities.invokeLater()将界面更新的相关代码放到事件调度线程中执行。
    以上示例代码仅供参考,可能需要根据实际情况进行调整。

    评论

报告相同问题?

悬赏问题

  • ¥15 华为手机备份nas,airdisk,遇到的空间不足问题。求个详细的解决方案。
  • ¥20 Cknife无法使用
  • ¥15 这个结构体为什么会出错呢?
  • ¥15 ROH绘图及近交系数的计算
  • ¥15 手动下载基因拼接数据库的渠道
  • ¥30 微机原理相关问题,求解
  • ¥15 多种类数据输入的语义分割模型方法有吗
  • ¥15 cesium二维地图绘制实体rectangle颜色问题
  • ¥15 网络分析仪面板参数解释
  • ¥15 车载image sensor的 datasheet