2012-08-29 5 views
0

Je voudrais afficher le bouton « OK » de ce JOptionPane seulement après un certain laps de temps (disons par exemple 5 sec). (Mon but est en fait de laisser terminer un travail de fil derrière cet autre fil)JOptionPane: bouton d'affichage « Ok » après un certain laps de temps

JOptionPane jop2 = new JOptionPane(); 
jop2.showMessageDialog(null, "Please wait 5s", "WAIT", JOptionPane.INFORMATION_MESSAGE); 

Je ne sais pas du tout comment faire, pourriez-vous me fournir un travail de code qui répondra à ce problème? Merci beaucoup d'avance!

+0

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. –

+1

_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

Répondre

4

Il n'existe pas de méthode spécifique pour cela en utilisant JOptionPane. Vous devrez créer une boîte de dialogue personnalisée et révéler le bouton OK après un délai fixe. Vous pouvez utiliser une passe d'un Swing timer.

ActionListener taskPerformer = new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     button.setVisible(true); 
    } 
}; 

Timer timer = new Timer(0, taskPerformer); 
timer.setInitialDelay(5000); 
timer.setRepeats(false); 
timer.start(); 
+0

Pourriez-vous me montrer une petite partie du code s'il vous plait? Merci beaucoup d'avance – user1633807

-1

vous pouvez utiliser quelque chose comme ça pour arrêter le code pendant 5 secondes

 try { 
      Thread.sleep(5000); // do nothing for 5000 miliseconds (5 seconds) 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
+0

Je veux seulement afficher le bouton de ce volet JOption après 5 sec, pas pour arrêter le code entier. – user1633807

+2

Bloquer l'EDT pendant 5 secondes permettra en effet de s'assurer que l'utilisateur ne peut pas disposer de la fenêtre. Il va probablement aussi s'assurer que vous ne pouvez pas lire le contenu de la boîte de dialogue (ou d'autres effets secondaires désagréables). On devrait ** jamais ** bloquer l'EDT – Robin

1

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); 
      } 
     }); 
    } 


} 
Questions connexes