Перезагружаемый таймер с установкой javax.swing.Timer на Java

Перезагружаемый таймер с установкой javax.swing.Timer на JavaТаймер в Java достаточно полезная штука. Касательно десктопных приложений это возможность не заморачиваться с дополнительным потоком, чтобы, например, организовать перерисовку изображения, запуск какого-либо процесса по приему-передаче данных по Ethernet, COM и др. Данный пост это какраз про это. Таймер представленный в нашем примере - это попросту говоря перезагружаемый декрементируемый счетчик с возможностью утановки длины счета в процессе его работы.

Такой счетчик вполне можно использовать в программе осуществляющей периодический обмен информацией между ПК и каким-либо электронным модулем по интерфейсу Ethernet, Com и др.

Будем использовать библиотечный класс javax.swing.Timer. Не путать с классом java.util.Timer, который работает немного по другому. Итак, прежде чем использовать Timer нужно его объявить или обозвать private Timer timer; , далее в конструкторе создать объект с параметрами timer = new Timer(timerStep, tc); . Также в конструкторе необходимо создать объект класса который будет выполнять собственно счет и перезагрузку счетчика по окончании счета  TimeClass tc = new TimeClass(timerDel);  

Далее все как обычно, форма с кнопками, окном для вывода текста спинером установки времени срабатывания таймера. Начальный период срабатывания таймера выставлен на 1000 мс. Длительность одного счетного импульса 10 мс.  Период срабатывания можно уменьшать непосредственно на панели управления с шагом в 100 мс.

Таймер на Java

Подробнее в комментариях кода приведенного ниже.


package javatimertest;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.Timer;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class JavaTimerTest extends JFrame {
    
    private int counter;
    // счетчик срабатываний таймера
    private int timerCount;
    // период срабатывания таймера мс
    private int timerDel = 100;
    // период одного импульса счета в мс
    private int timerStep = 10;
            
//----------------------------------------------------------------------
// создание объектов
    
    private JTextArea input = new JTextArea("input");
    private JScrollPane scrollPaneInput = new JScrollPane(input);
    private JPanel panel1 = new JPanel();
    private JPanel panel2 = new JPanel();
    private JButton start = new JButton("Старт");
    private JButton stop = new JButton("Стоп");
    private JLabel label1 = new JLabel("label1");
    private JLabel label2 = new JLabel("Период мс");
    private Timer timer;
    private SpinnerModel delayModel = new SpinnerNumberModel(
         1000,   //initial value
         100,    //min
         1000,   //max
         100);   //step
    private JSpinner delay = new JSpinner(delayModel);
    
    // конструктор 
    public JavaTimerTest(){

        // инициализация компонентов
        initComponents();
        // объект класса счетчика 
        TimeClass tc = new TimeClass(timerDel);
        // объект таймера
        timer = new Timer(timerStep, tc);
        
    }

    // метод инициализации компонентов формы
    private void initComponents(){
        
        // положение на экране
        setBounds(15,30,500,250);
        // размер формы
        setSize(500, 250);
        // контейнер для размещения компонентов формы
        Container container = getContentPane();

        // окно вывода текстовой информации
        input.setPreferredSize(new Dimension(300, 100));
        input.setSize(20, 20);
        // кнопка старт
        start.setPreferredSize(new Dimension(100, 100));
        // зарегистрировать экземпляр класса обработчика события start
        start.addActionListener(new startEventListener());
        // зарегистрировать экземпляр класса обработчика события delay
        delay.addChangeListener(new delayChangeLisener());                
        delay.setPreferredSize(new Dimension(100, 20));
        // кнопка стоп
        stop.setPreferredSize(new Dimension(100, 20));
        // зарегистрировать экземпляр класса обработчика события stop
        stop.addActionListener(new stopEventListener());
        
        // панель 1
        panel1.add(BorderLayout.CENTER, scrollPaneInput);
        panel1.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new TitledBorder("Gaphic")));
        panel1.setPreferredSize(new Dimension(300, 200));
        panel1.add(label1);

        // панель 2
        panel2.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new TitledBorder("Control")));
        panel2.setPreferredSize(new Dimension(150, 200));
        panel2.add(start);
        panel2.add(stop);
        panel2.add(label2);
        panel2.add(delay);

        // размещение панелей    
        container.add(BorderLayout.CENTER, panel1);
        container.add(BorderLayout.EAST, panel2);
        
    } 
//----------------------------------------------------------------------

    // клас имплементации события нажатия старт
    class startEventListener implements ActionListener {

        @Override
        // обработка события нажатия на button start
        public void actionPerformed(ActionEvent e) {
            input.setText("Hi!");
            // старт таймера с повторением
            timer.start();
            timer.setRepeats(true); 
        }      
    }
    
    
    // класс пререзагружаемого счетчика таймера 
    public class TimeClass implements ActionListener {
        
        // конструктор
        public TimeClass (int count) {
            counter = count;
        }
        
        // счет на уменьщение
        @Override
        public void actionPerformed (ActionEvent ts) {
            counter--;
            if(counter >= 1) {
                label1.setText("Осталось счетных импульсов: " + counter);
            }
            else {
                // счет срабатываний таймера
                input.setText("Цикл таймера N " + ++timerCount);
                // звук beep
                Toolkit.getDefaultToolkit().beep();
                // перезагрузка счетчика времени    
                counter = timerDel;
                
            }
        }
    } 
//----------------------------------------------------------------------
    
    // клас имплементации события нажатия стоп
    class stopEventListener implements ActionListener {

        @Override
        // обработка события нажатия на button start
        public void actionPerformed(ActionEvent e) {
            //остановка таймера
            timer.stop();
            label1.setText("Таймер остановлен");
            input.setText("Таймер остановлен");
            counter = 0;
            timerCount = 0;
        }      
    }
    
    // обработка события изменения JSpinner levelChanal
    class delayChangeLisener implements ChangeListener {
        @Override
        public void stateChanged(ChangeEvent e) {
        // установка периода срабатывания таймера    
        timerDel =  (int)delay.getValue()/10;
        }  
    }    
    
    public static void main(String[] args) {
        
        // объект графической формы
        JavaTimerTest graphic = new JavaTimerTest();
        // закрытие формы 
        graphic.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // визуализация формы
        graphic.setVisible(true);
    }
}
	

Ну и сам проект в архиве под Net Beans 7.2. Не забывайте оставлять свои комменты ...

Top.Mail.Ru