Итак, у меня есть приложение для составления отчетов, для создания которого требуется некоторое время, и пользователи жалуются, что нет визуального отклика о том, что отчет запущен.
Я написал небольшой класс, который должен быть модальным диалогом, который будет блокировать действия пользователя, показывать себя с фразой «Генерация отчета ...» до тех пор, пока отчет фактически не будет создан, а затемон будет скрыт, и регулярное использование вернется.
Проблема, с которой я столкнулся, заключается в том, что появляется диалоговое окно, появляется текст, но проблема в том, что переданный ему исполняемый файл не запускается.
Это диалоговое окно «занято»:
package com.company.utilities.busydialog;
import java.awt.BorderLayout;
import java.awt.Cursor;
import javax.swing.JDialog;
import javax.swing.JLabel;
public class BusyDialog extends JDialog {
private Runnable r;
public BusyDialog (String Message, Runnable r) {
super();
this.r = r;
this.setModal(true);
this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
this.setLayout(new BorderLayout());
this.getContentPane().add(new JLabel(Message));
this.pack();
}
public void show() {
this.setVisible(true);
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
System.out.println("running report");
r.run();
this.setCursor(Cursor.getDefaultCursor());
this.setVisible(false);
}
}
Вот метод, который я называю его:
private void dailyUsageSubmitButtonActionPerformed(java.awt.event.ActionEvent evt) {
final Date date = this.dailyUsagePicker.getDate();
final ReportController c = this.controller;
final ProductionHRClientView view = this;
BusyDialog dialog = new BusyDialog("Generating report...", new Runnable() {
public void run() {
c.generateDailyUsageReport(date, view);
}
});
dialog.setResizable(false);
dialog.setLocation(700,400);
dialog.Show();
}
EDIT: I tried this /3054843/kak-zastavit-modalnyi-jdialog-vypolnyat-kod-srazu-posle-pokaza
и в конечном итоге этот класс для BusyDialog:
package com.protocase.utilities.busydialog;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JLabel;
public class BusyDialog extends JDialog {
public BusyDialog(String Message, final Runnable r) {
super();
this.setModal(true);
this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
this.setLayout(new BorderLayout());
this.getContentPane().add(new JLabel(Message));
this.pack();
this.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
super.windowOpened(e);
// do something
doBusy(r);
}
});
}
private final void doBusy(Runnable r) {
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
r.run();
this.setCursor(Cursor.getDefaultCursor());
this.dispose();
}
}
Но это тоже не помогает.