Il ressemble à ce que vous cherchez est une combinaison des SwingWorker
et ProgressMonitor
. Le SwingWorker
va préformer votre tâche de longue durée (le 5 secondes), et informer l'utilisateur de la façon dont il progresse en utilisant le ProgressMonitor
. Un exemple vous montrant comment obtenir les deux travailler ensemble se trouve ici: getting the cancel event of Java ProgressMonitor
Bien sûr, si vous êtes convaincu que vous voulez prendre l'approche de l'affichage du bouton Continuer une fois que le travail est fait, voici un exemple Cela devrait vous aider à démarrer dans la bonne direction. Vous utiliserez un SwingWorker
pour alerter votre boîte de dialogue que la tâche d'arrière-plan en cours d'exécution est terminée.
import java.awt.*;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import javax.swing.*;
public class TempProject extends Box{
public TempProject(){
super(BoxLayout.Y_AXIS);
//Contains the content of the Alert Dialog
Box info = Box.createVerticalBox();
info.add(new Label("Please wait 5 seconds"));
final JButton continueButton = new JButton("Continue");
info.add(continueButton);
//The alert to wait 5 seconds
final JDialog d = new JDialog();
d.setTitle("WAIT");
d.setModalityType(ModalityType.APPLICATION_MODAL);
d.setContentPane(info);
d.pack();
//The action of the "Continue Button"
continueButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
d.dispose();
}
});
continueButton.setVisible(false);
//Thread That Does Work
final SwingWorker sw = new SwingWorker<Integer, Integer>()
{
protected Integer doInBackground() throws Exception {
//Do long running thread work here
int i = 0;
while (i++ < 100) {
System.out.println(i);
Thread.sleep(100);
}
return null;
}
@Override
protected void done(){
// What to do when the long runnng thread is done
continueButton.setVisible(true);
}
};
//Button to start the long running task
JButton button = new JButton("Click Me");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
sw.execute();
d.setVisible(true);
}});
add(button);
}
public static void main(String args[])
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new TempProject());
frame.setPreferredSize(new Dimension(500, 400));
frame.pack();
frame.setVisible(true);
}
});
}
}
L'utilisateur peut toujours ignorer 'JOptionPane' dans les 5 secondes (même avant que le bouton n'apparaisse). Il semble aussi que '5 secondes' est assez arbitraire. L'option de fermeture doit être déclenchée par l'achèvement du thread. –
_propos-moi du code_ ce n'est pas comme ça que ce site fonctionne: son idée est de vous aider _you_ à fournir le code vous-même :-) – kleopatra