我有一个 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 指示器了解不多,但看起来缺乏同步。
如果您无法控制 lblActivityIndicator
内部的内容,那么这应该可以解决问题:
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/