当前位置: 首页 > 面试题库 >

在多任务应用程序中管理GUI和EDT

唐法
2023-03-14
问题内容

我开发了一个Java应用程序,用于创建和提取类似于WinRAR的存档。您可以同时使用多线程创建多个档案。最近,我想在归档创建期间以每次创建的新JFrame中的JProgressBar形式添加信息状态。

但是我的问题是在新的状态框架和创建档案的线程中生成信息。这就是为什么我在存档线程中创建JFrame以便当前更新进度条。

但是就像我可以在各种信息源中以及您的答案/评论中阅读它一样,它与Java
Swing和性能背道而驰;我不能在EDT的其他地方创建swing对象。

但是,我该如何解决我的问题呢?如何建立归档文件及其状态JFrame(使用JProgressBar)之间的通信?

编辑:

我实现了SwingWorker来管理应用程序中的GUI。现在完成了,我还有另一个问题:

使用SwingWorker,如何通过状态框架按钮上的事件来执行后台任务?(例如:暂停压缩或停止压缩。)


问题答案:

正如其他人所建议的,最好的方法是使用SwingWorker

SwingWorker 属性是可监听的,并且总是在EDT中调用监听器,因此,您可以执行以下操作:

public class ArchivingWorker extends SwingWorker<Void, Void> {
    JProgressBar progressBar = null;
    // Other members here...
    ...

    public ArchivingWorker(...) {
        // Any specific initialization here (in EDT)
        addPropertyChangeListener(new PropertyChangeListener() {
            @Override void propertyChange(PropertyChangeEvent e) {
                if (    "state".equals(e.getPropertyName())
                    &&  e.getNewValue() == StateValue.STARTED) {
                    // Background thread has just started, show a progress dialog here
                    progressBar = new JProgressBar();
                    ...
                }
                else if ("progress".equals(e.getPropertyName())) {
                    // Update progress bar here with e.getNewValue()
                    ...
                }
            }
        });
    }

    @Override protected Void doInBackground() {
        // Archiving process here and update progress from time to time
        setProgress(progress);

        return null;
    }

    @Override protected void done() {
        // Ensure that archiving process worked correctly (no exception)
        try {
            get();
        } catch (Exception e) {
            // Handle exception (user feedback or whatever)
        } finally {
            // Close progress dialog
            ...
        }
    }
}

然后,您可以ArchivingWorker根据需要使用:

ArchivngWorker worker = new ArchivingWorker(...);
worker.execute();


 类似资料:
  • 要在控制台应用程序中开始使用Hangfire,您需要首先将Hangfire包安装到控制台应用程序。因此,使用您的软件包管理器控制台窗口进行安装: PM> Install-Package Hangfire.Core 然后添加任务存储安装所需的软件包。例如,使用SQL Server: PM> Install-Package Hangfire.SqlServer 仅需 Hangfire.Core 软件包

  • 下载应用程序、共享文件、查找字体和库存图片等 — 全部通过 Creative Cloud 桌面应用程序完成。 注意:  Typekit 现已更名为 Adobe Fonts,包含在 Creative Cloud 和其他订阅中。了解详情。 注意:在您安装 Creative Cloud 桌面应用程序的过程中,本文中介绍的某些选项卡可能不可用。 Adobe Creative Cloud 桌面应用程序可供您

  • 在上一章中,我们创建了一个示例RMI应用程序。 在本章中,我们将解释如何创建RMI应用程序,其中客户端调用显示GUI窗口(JavaFX)的方法。 定义远程接口 在这里,我们使用名为animation()的方法定义一个名为Hello的远程接口。 import java.rmi.Remote; import java.rmi.RemoteException; // Creating Remote

  • Windows NT Option Pack 提供了在 Web 服务器上的 ASP 应用程序管理服务。例如,Internet 服务管理器为应用程序开发人员提供了一个使用简便的管理工具来设置应用程序的属性。另外,Active Server Pages 提供了允许用户的应用程序存储全局数据的脚本功能。本主题简要介绍部分应用程序管理功能,并提供到详细信息的链接。 启动和结束应用程序 当 Web 服务器第

  • 我创建了一个JavaFX应用程序并设置了窗口标题。阶段本身有一个标题,但是当我在运行应用程序时将鼠标悬停在dock或view任务管理器中的图标上时,我会得到类的包名。 示例: 当我将鼠标悬停在图标上而不是显示包名(本例中为authentication.EmployeeLogin)时,如何显示阶段标题? 该应用程序是使用Launch4J为windows部署的。

  • 我尝试在一个应用程序中运行Eureka服务器和Spring Boot Admin服务器(SBA Docu说这是可能的)。尤里卡正按预期工作,但管理应用程序仍显示零应用程序。 Spring Boot Version 2.0.3,Spring Boot Admin Version 2.0.1 Eureka和SBA服务器 客户端应用程序。yml