Java Swing Timer - PullRequest
       6

Java Swing Timer

9 голосов
/ 17 июня 2009
ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //...Perform a task...

        logger.finest("Reading SMTP Info.");
    }
};
Timer timer = new Timer(100 ,taskPerformer);
timer.setRepeats(false);
timer.start();

Согласно документации этот таймер должен срабатывать один раз, но никогда не срабатывает. Мне нужно, чтобы он выстрелил один раз.

Ответы [ 4 ]

18 голосов
/ 17 июня 2009

Эта простая программа работает для меня:

import java.awt.event.*;
import javax.swing.*;

public class Test {
    public static void main(String [] args) throws Exception{
        ActionListener taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                //...Perform a task...

                System.out.println("Reading SMTP Info.");
            }
        };
        Timer timer = new Timer(100 ,taskPerformer);
        timer.setRepeats(false);
        timer.start();

        Thread.sleep(5000);
    }
}
2 голосов
/ 09 октября 2014

Эта программа будет работать нормально ...

setRepeats(boolean flag) функция, используемая для установки вызова function(actionPerformed) повторно или только один раз, если

  1. timer.setRepeats(false) == timer вызывает метод actionperformed только один раз
  2. timer.setRepeats(true) == timer вызывает метод actionPerformed повторно в зависимости от указанного времени

Работа таймера поворота

  1. выполнить задание один раз
  2. сделать задание повторное время

шагов для создания таймера свинга:

  1. создать список действий
  2. создайте конструктор таймера, затем передайте время и actionlistener в этом
  3. реализует функцию actionPerformed(), в которой выполняет вашу задачу
  4. используйте timer.start() для запуска задачи между временем, указанным в конструкторе таймера, используйте timer.stop() для остановки задачи
* * Пример тысяча сорок-одиной: * +1042 *
ActionListener al=new ActionListener(
public void actionPerformed(ActionEvent ae)
{
 //do your task
 if(work done)
   timer.stop();//stop the task after do the work
}
);
Timer timer=new Timer(1000,al);//create the timer which calls the actionperformed method for every 1000 millisecond(1 second=1000 millisecond)
timer.start();//start the task
1 голос
/ 17 июня 2009

Я догадываюсь из оператора log, что вы выполняете какую-то операцию SMTP. Я думаю, что я прав, говоря, что java.swing.Timer предназначен для временных операций, связанных с пользовательским интерфейсом, поэтому и требует, чтобы EDT работал. Для более общих операций вы должны использовать java.util.Timer.

Эта статья связана с JavaDocs - http://java.sun.com/products/jfc/tsc/articles/timer/

1 голос
/ 17 июня 2009

Ваша задача, вероятно, должна только сообщить результаты в потоке событий (EDT), но выполнять фактическую работу в фоновом потоке с некоторой периодической скоростью.

ScheduledExecutorService - это ТОЧНО что вы хотите. Просто не забудьте обновить состояние вашего пользовательского интерфейса на EDT через SwingUtility.invokeLater (...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...