Вопрос по swing, java – Java Swing Timer

9
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   ответа
1

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

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

2

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

timer.setRepeats(false) == timer calls the actionperformed method for only one time timer.setRepeats(true) == timer calls the actionPerformed method repeatedly based on specified time

Swing Timer Work

do the task one time do the task repeated time

steps to create swing timer:

create the actionlistener create the timer constructor then pass time and actionlistener in that implement the actionPerformed() function in which do your task use timer.start() for start the task between the time specified in timer constructor, use timer.stop() for stop the task

Пример:

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
18

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);
    }
}
Правда. Я никогда не пробовал Timer без графического интерфейса.
Я думаю, что люблю тебя прямо сейчас! : D Спасибо большое!
IIRC, вы не должны использовать javax.swing.Timer вне EDT.
Спасибо, я обнаружил, что мой регистратор проблем инициализируется после запуска этого кода, поэтому я никогда не видел свои тестовые сообщения. Помогло переключение регистратора с println. Hamza Yerlikaya
Этот ответ предполагает, что основной поток завершал работу до того, как закончился таймер. Поскольку основной поток является специальным, все остальные потоки, не являющиеся демонами, также будут прерваны после завершения main (). Чтобы избежать этого (без использования потоков демона), вы должны получить ссылку на поток таймера, а в вызове main ()<timer thread object>.join();
1

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

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

Похожие вопросы