Java: activity 后台线程读取文本文件的指标
Java: activity indicator for reading text file in the background thread
我有一个带有框架 class MainFrame 和扩展 JPanel 的 class PanelPlan 的 swing GUI 应用程序。我通过使用 BufferedReader 逐行读取文本文件并进行其他计算来对文本文件进行操作。它是在后台线程中完成的。我还在 MainFrame 中创建了一个带有 gif activity 指示符的标签。所以,我想要做的是让用户点击一个按钮,应用程序在后台读取文件,当它完成时,一个旋转的指示器变得可见(或 "starts spinning")。读取文件后,应用程序更新某些参数并且 activity 指示器变得不可见 ("stops spinning")。
这是我的:
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();
}
在主框架中class:
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);
}
}
我有一个带有框架 class MainFrame 和扩展 JPanel 的 class PanelPlan 的 swing GUI 应用程序。我通过使用 BufferedReader 逐行读取文本文件并进行其他计算来对文本文件进行操作。它是在后台线程中完成的。我还在 MainFrame 中创建了一个带有 gif activity 指示符的标签。所以,我想要做的是让用户点击一个按钮,应用程序在后台读取文件,当它完成时,一个旋转的指示器变得可见(或 "starts spinning")。读取文件后,应用程序更新某些参数并且 activity 指示器变得不可见 ("stops spinning")。
这是我的:
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();
}
在主框架中class:
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);
}
}