2010-10-28 26 views
1

J'ai une boîte de dialogue qui est:Comment créer une boîte de dialogue qui apparaîtra après 5 minutes d'inactivité par l'utilisateur? (Java)

JOptionPane.showMessageDialog(null,"Once medicine is given, measure temperature within 5 minutes." ,"Medication" ,JOptionPane.PLAIN_MESSAGE); 

Quand les il va droit à une Jframe utilisateur presse « ok », qui demande à l'utilisateur d'entrer la température à l'aide d'un curseur puis en appuyant sur un bouton cela l'amène à la prochaine série de choses. De toute façon, je veux créer un peu de compte à rebours inivisble après que l'utilisateur appuie sur 'ok', donc après 5 minutes d'inactivité dans le menu Jframe, une boîte de dialogue d'avertissement devrait apparaître sur le JFrame et dire quelque chose comme "BESOIN" ATTENTION".

Cela me rappelle d'actionListener. mais il sera invoqué par un élément non-physique, 5 minutes, (pas par un clic de bouton).

Peut-être le code devrait ressembler:

JOptionPane.showMessageDialog(null,"Once medicine is given, measure temperature within 5 minutes." ,"Medication" ,JOptionPane.PLAIN_MESSAGE); 


temperature_class temp = new temperature_class(); // going to a different class where the the Jframe is coded 

    if (time exceeds 5 minutes) { JOptionPane.showMessageDialog(null, "NEED attention", JOptionPane.WARNING_MESSAGE);} 
    else { (do nothing) } 

Code est:

JOptionPane.showMessageDialog(null,"measure temp" ,"1" ,JOptionPane.PLAIN_MESSAGE); 

int delay = 3000; //milliseconds 
ActionListener taskPerformer = new ActionListener() { 
public void actionPerformed(ActionEvent evt) { 

JOptionPane.showMessageDialog(null,"hurry." ,"Bolus Therapy Protocol" ,JOptionPane.PLAIN_MESSAGE); } }; 
new Timer(delay, taskPerformer).start(); 

temperature_class temp = new temperature_class(); 

Cependant, je le veux le faire qu'une seule fois. Alors, comment invoquer set.Repeats (false)?

Répondre

1

Essentiellement, une fois le volet d'options initial affiché, commencez un Timer. (A javax.swing un)

Vous aurez également besoin d'une variable de niveau de classe indiquant si la température a été saisie pour le moment.

JOptionPane.showMessageDialog(...); 
tempHasBeenEntered = false; 
Timer tim = new Timer(5 * 60 * 1000, new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        if (!tempHasBeenEntered) 
         JOptionPane.showMessageDialog("Hey, enter the temp!!"); 
       } 
} 
tim.setRepeats(false); 
tim.start(); 

Vous aurez besoin de retourner le drapeau une fois qu'un utilisateur entre une température dans le formulaire.

+0

Merci de fournir les liens Timer .. Cela fonctionne! Je suppose que pour l'instant swing Timer devrait être un bon moyen de faire les choses. – razshan

+0

Cependant, je le veux pour le faire seulement une fois ... Je sais que je dois utiliser cela sur le timer setRepeats (faux), mais où – razshan

+0

@Faraz, je vais mettre à jour ma réponse. Vous devrez sauvegarder la minuterie dans une variable, vous verrez. – jjnguy

2

Vous pouvez utiliser un TimerTask avec un Timer:

class PopTask extends TimerTask { 
    public void run() { 
    JOptionPane.show... 
    } 
} 

alors où vous souhaitez planifier votre tâche:

new Timer().schedule(new PopTask(), 1000*60*5); 

Ce genre de minuteries peut aussi être annulé par cancel() méthode

+1

Je ne suis pas d'accord avec l'utilisation d'une minuterie et de timertasks 'java.util'. Lorsque vous traitez avec des applications swing, il est généralement préférable d'utiliser le swing Timer. – jjnguy

+1

dans cette situation il n'y aura pas de différence précieuse entre l'utilisation d'un 'java.util.Timer' ou d'un' javax.swing.Timer' car ils auront besoin d'un thread chacun. En tout cas, il est possible d'utiliser 'invokeLater' si vous voulez vraiment imiter le comportement. De mon expérience personnelle j'ai utilisé plusieurs fois 'TimerTask' pour déclencher des choses diverses sans problèmes, mais c'est aussi une question de goût :) – Jack

+0

Je suis d'accord avec Jinguy, Swing a été conçu pour que le code s'exécute sur l'EDT. Rappelez-vous que vous donnez des conseils à un débutant. Oui, la plupart du temps vous n'aurez pas de problème mais pourquoi prendre le risque de devoir déboguer un problème aléatoire? – camickr

1

Lisez la section du tutoriel Swing sur How to Use Timers. Lorsque la boîte de dialogue est affichée, vous démarrez la minuterie. Lorsque la boîte de dialogue est fermée, vous arrêtez le minuteur. Un temporisateur d'oscillation devrait être utilisé, pas un TimerTask de sorte que si le temporisateur se déclenche le code sera exécuté sur l'EDT.