У меня есть приложение Swing GUI с классом фрейма MainFrame и классом PanelPlan, который расширяет JPanel. Я делаю манипуляции с текстовым файлом, читая его построчно с помощью BufferedReader и выполняя другие вычисления. Это делается в фоновом потоке. Я также создал метку с индикатором активности gif в MainFrame. Итак, что я пытаюсь сделать, так это заставить пользователя нажать кнопку, приложение читает файл в фоновом режиме, и пока это делается, индикатор вращения становится видимым (или «начинает вращаться»). Когда файл прочитан, приложение обновляет некоторые параметры и индикатор активности становится невидимым ("перестает крутиться").
Вот что у меня есть:
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 отображается в консоли, как и ожидалось, индикатор активности никогда не отображается. Я знаю, что он настроен правильно, так как, когда я делаю его постоянно видимым, индикатор крутится (хотя и не перестает крутиться, когда файл прочитан).
Интересно, это правильный подход, который я использую. Я читал, что графический интерфейс должен быть реализован в основном потоке. Как мне уведомить основной поток в моем случае о том, что работа в фоновом потоке завершена и метка индикатора должна быть установлена видимой?
Большое спасибо!