Java: Minuteur (attendre x secondes)


J'ai une interface graphique simple qui peut enregistrer et extraire des données d'un .fichier doc.

Lorsque j'appuie sur un bouton enregistrer, j'ai une étiquette qui dit "Succès" ou "Erreur" sur les étiquettes.setText ();

Update: Le code est destiné à être exécuté dans un FXMLDocumentController (built på SceneBuilder)

Je veux que l'étiquette redevienne vide ("") après 3 secondes..

J'ai essayé:

try {
    Thread.sleep(1000);               
    } 
 catch(InterruptedException ex) {
Thread.currentThread().interrupt();

}

Mais est-ce comme, que la fonction de sommeil gèle toute l'interface graphique donc je ne peux pas interagissez avec lui pendant qu'il dort. Comment configurer une minuterie qui n'affecte pas la convivialité? :)

Author: Casper TL, 2014-12-04

6 answers

Créer un TimerTask qui est démarré après 3 secondes. Cette TimerTask doit exécuter le code qui utilise des composants gui via la plate-forme.runLater(new Runnable())

Timer timer = new Timer();
timer.schedule(new TimerTask() {

        @Override
        public void run() {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    label.setText("");
                }
            });

        }
    }, 3000);
 6
Author: Deton, 2014-12-03 22:10:51
class runnable implements Runnable {
    private Object obj;
    public runnable(Object obj)
    {
        this.obj = obj;
    }
    public void run() {
        try {
            Thread.sleep(3000);
            this.obj.setText("");//right here just execute your method
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Hello from a thread!"); //your code here
    }

}

public class Test {

    public static void main(String[] args){
        Object myObject;
        (new Thread(new runnable(myObject))).start();
    }
}

Vous pouvez lancer un autre thread pour gérer cela. Faites simplement votre traitement dans l'autre thread. Dormez pendant 3 secondes puis effacez le lbl.

Voici un exemple montrant comment cela fonctionne:

class runnable implements Runnable {
    Test test;
    public runnable(Test test)
    {
        this.test = test;
    }
    public void run() {
        try {
            Thread.sleep(3000);
            this.test.test = "test2";
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Hello from a thread!");
    }

}

public class Test {
    public String test = "test";
    public static void main(String[] args) throws InterruptedException{
        Test test = new Test();
        System.out.println(test.test);
        (new Thread(new runnable(test))).start();
        Thread.sleep(4000);
        System.out.println(test.test);
    }
}

************************************************************UPDATE*************************************************************

class runnable implements Runnable {
    Test test;
    public runnable(Test test)
    {
        this.test = test;
    }
    public void run() {
        try {
            Thread.sleep(3000);
            this.test.label.setText("This is a test.");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Hello from a thread!");
    }

}

public class Test {
    public String test = "test";
    JLabel label = new JLabel("Test");
    JFrame frame = new JFrame();
    JButton button = new JButton();
    public static void main(String[] args) throws InterruptedException{
        Test test = new Test();
        test.label.setText("Test");
        test.button.setText("Test Button");
        test.button.setSize(50, 50);
        test.frame.setSize(500, 500);
        test.frame.add(test.button);
        test.frame.add(test.label);
        test.frame.setVisible(true);
        test.button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub
                System.exit(0);
            }

        });
        (new Thread(new runnable(test))).start();
    }
}
 1
Author: brso05, 2014-12-04 13:31:11

N'utilisez pas Thread.sleep(). Instancier un javax.swing.Timer et lui faire faire un rappel d'événement. Si vous voulez le garder dans la même méthode, appelez wait(), puis demandez au gestionnaire d'événements d'appeler notify(), qui reprendra le programme. Cependant, vous n'avez probablement pas besoin de le faire; vous pouvez simplement supprimer le texte directement à l'aide du gestionnaire d'événement.

 0
Author: Epiglottal Axolotl, 2014-12-03 21:22:20

Pour ce faire, vous devrez utiliser filetage. Dans le cas où vous utilisez Swing, vous pouvez utiliser une minuterie Swing. Le code devrait ressembler à quelque chose comme ça. Mettez ce code où vous "enregistrez" le fichier.

  int delay = 3000; 
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          //Empty the label here. This code will be called once the timeout of three seconds has been passed
      }
  };
  new Timer(delay, taskPerformer).start();
 0
Author: TheDutchDevil, 2014-12-03 21:23:01

Votre problème est que vous bloquez le thread de l'interface utilisateur. Il ne peut rien mettre à jour et la boucle principale se casse. Vous pouvez atteindre votre objectif avec un objet timer comme d'autres ont répondu, ou si vous ne le souhaitez pas, vous pouvez implémenter votre propre thread pour faire de même.

 0
Author: MeetTitan, 2014-12-03 21:25:02

Vous ne pouvez pas interagir avec GUI car le code dort dans le thread de répartition des événements qui est responsable de la gestion des événements GUI et donc il est bloqué. Utilisez cette Balançoire Minuterie à la place.

L'exemple donné est simple. - Je inclure les commentaires.

  int delay = 1000; //milliseconds

  //Create action listener which listens for the event generated by the timer
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          Place here code to execute when the time runs out.
      }
  };
  //Simply create a timer with the created listener and start it.
  new Timer(delay, taskPerformer).start();
 0
Author: dev-null, 2014-12-03 21:32:30