Reputation: 747
I have a method register() that takes a lot of time to complete. So i've placed it in doInBackGround() of swingworker. In a meantime i want to display dialog that is modal and has indeterminate progressbar on it.
private void registerPopupItemActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
WaitDialog dialog = new WaitDialog(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
});
dialog.setVisible(true);
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
register();
return 0;
}
};
dialog.dispose();
}
But everything freezes. In debugger i see that regester() is not invoked. Where did i messed up? Any help would be appreceiteed! Thanks !
Upvotes: 2
Views: 2428
Reputation: 285403
Your dialog.dispose is called after calling setVisible(true) on the modal dialog, so dispose may never be called. Instead have dispose called in the done override in the SwingWorker and call execute on the SwingWorker before calling setVisible(true) on the dialog.
Something like so (caveat, code not tested):
private void registerPopupItemActionPerformed(java.awt.event.ActionEvent evt) {
WaitDialog dialog = new WaitDialog(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
});
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
register();
return 0;
}
@Override
protected void done() {
dialog.dispose();
}
};
worker.execute();
dialog.setVisible(true);
}
Upvotes: 5