Java Swing Timer запускается только один раз - PullRequest
2 голосов
/ 16 января 2012

Может кто-нибудь сказать мне, почему этот таймер работает только один раз?

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

public class TimerTest implements ActionListener{

    private Robot r;
    private Timer t;
    private int i;

    public TimerTest(){     
        i = 0;  
        try {
            r = new Robot();
        } catch (AWTException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
        t = new Timer(1000, this);  
        t.setRepeats(true);
        t.start();  
    }

    public static void main(String [] args){
        new TimerTest();        
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        i++;
        System.out.println("Action..." + i);        
    }

Самое смешное, что, если я уменьшу задержку таймера до 100, он будет работать, как и ожидалось.И что еще забавнее, если я удаляю код, в котором я инициализирую робота, он вообще не работает, программа завершается, как только я его запускаю.

Я пробовал это в Windows 7и в Ubuntu (хотя в Ubuntu я вообще не мог использовать робота, поскольку получаю исключение. Возможно, что-то связано с правами).

Ответы [ 2 ]

5 голосов
/ 17 января 2012

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

JFrame testFrame = new JFrame();
testFrame.setVisible(true);
testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

То, что JFrame не дает финишу закрыться, когда вы закрываете фрейм, заканчивается TimerTest. Который завершает ваш главный, который заставляет основной финш. Завершение программы и остановка вашего таймера.

2 голосов
/ 17 января 2012

См. "Главные выходы до того, как javax.swing. Запуск таймера () может начинаться" в базе данных ошибок.


Оценка

Описанное поведение - когдаприложение закрывается до запуска таймера Swing - правильно.Вот что происходит потом:

  1. Создан таймер качания.
  2. Запущен отдельный поток для таймера качания.Когда истечет время ожидания, он уведомит подключенные actionListeners, отправив экземпляр InvocationEvent в EDT.
  3. Выход из основного потока.
  4. На данный момент нет запущенных потоков, не являющихся демонами в JVM.Приложение прекращено.

.. оценщик продолжает добавлять ..

.. Это похоже на RFE, а не на дефект.


Один верный способ заставить его вести себя - создать элемент GUI и отобразить его.Вот почему я спросил ранее ..

.. почему именно вы создаете таймер без каких-либо элементов графического интерфейса?Это для повторных снимков экрана?

Чтобы справиться с этой ситуацией, я обычно создаю и показываю кадр, позволяющий пользователю настраивать скорость и область для снимков экрана, затем сверните кадр и начните обработку, когда пользователь нажимает:

Снимок экрана!

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