Java:用于在后台线程中读取文本文件的 Activity 指示器

标签 java multithreading activity-indicator

我有一个 swing GUI 应用程序,其中包含一个框架类 MainFrame 和一个扩展 JPanel 的类 PanelPlan。我通过使用 BufferedReader 逐行读取文本文件并进行其他计算来对文本文件进行操作。它是在后台线程中完成的。我还在 MainFrame 中创建了一个带有 gif Activity 指示器的标签。因此,我想做的是让用户单击按钮,应用程序在后台读取文件,并且在执行过程中,旋转指示器变得可见(或“开始旋转”)。读取文件后,应用程序会更新某些参数,并且 Activity 指示器变得不可见(“停止旋转”)。

这就是我所拥有的:

private void btnAddDepActionPerformed(java.awt.event.ActionEvent evt) {                                          

  MainFrame mainFrame = new MainFrame();
  mainFrame.setIndicatorVisible(); // Activity indicator starts spinning

  new Thread(() -> 
  {
    //... code to read a text file and perform other operations;

    // Activity indicator stops spinning
    mainFrame.setIndicatorInvisible();

  }).start();
}

在 MainFrame 类中:

public MainFrame() {
        /* Initialize GUI components */
        initComponents();

        setIndicatorInvisible();
    }

public void setIndicatorVisible()
    {
        System.out.println("\n\nCHECK ACTIVITY INDICATOR ON\n\n");
        lblActivityIndicator.setVisible(true);
    }


    public void setIndicatorInvisible()
    {
        System.out.println("\n\nCHECK ACTIVITY INDICATOR OFF\n\n");
        lblActivityIndicator.setVisible(false);
    }

虽然 println 信息按预期显示在控制台中,但 Activity 指示器永远不可见。我知道它设置正确,因为当我使其始终可见时,指示器正在旋转(尽管在读取文件后不会停止旋转)。

我想知道这是否是我使用的正确方法。我读到GUI应该在主线程中实现。在我的情况下,我如何通知主线程后台线程中的工作已完成并且指示器标签应设置为可见?

非常感谢!

最佳答案

我对 Activity 指示器了解不多,但看起来缺乏同步。

如果您无法控制 lblActivityIndi​​cator 内部的内容,那么这应该可以解决问题:

public void setIndicatorVisible() {
    System.out.println("\n\nCHECK ACTIVITY INDICATOR ON\n\n");
    synchronized(lblActivityIndicator) {
         lblActivityIndicator.setVisible(true);
    }
}


public void setIndicatorInvisible() {
    System.out.println("\n\nCHECK ACTIVITY INDICATOR OFF\n\n");
    synchronized(lblActivityIndicator) {
        lblActivityIndicator.setVisible(false);
    }
}

关于Java:用于在后台线程中读取文本文件的 Activity 指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39689672/

相关文章:

multithreading - 从另一个线程原子地取消 asio 异步计时器

swift - DispatchGroup 会永远等待吗?

performance - jQuery 全局事件和性能?

java - 如何使 Java 和 Postgres 枚举协同工作以进行更新?

java - arraylist 中的重复项不被打印

java - GWT Strength 与其他框架相比?

c# - 如何在多任务环境中防止在azure表中重复插入?

android - 如何将加载栏添加到 View 位于另一个 Activity 中的适配器类

iphone - 事件指示器仅动画一次

Java 接口(interface)和对象