与Java Swing Timer混淆

1 java user-interface swing timer jframe

我真的很困惑Java swing计时器.它需要一个动作监听器吗?有人可以举个例子吗?谢谢!

Eng*_*uad 11

以下是使用示例javax.swing.Timer:

在此输入图像描述

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class SimpleTimer extends JFrame
{
    private JLabel label;
    private Timer timer;
    private int counter = 10; // the duration
    private int delay = 1000; // every 1 second
    private static final long serialVersionUID = 1L;

    public SimpleTimer()
    {
        super("Simple Timer");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        label = new JLabel("Wait for " + counter + " sec", JLabel.CENTER);
        JPanel contentPane = (JPanel) getContentPane();
        contentPane.add(label, BorderLayout.CENTER);
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        pack();

        ActionListener action = new ActionListener()
        {   
            @Override
            public void actionPerformed(ActionEvent event)
            {
                if(counter == 0)
                {
                    timer.stop();
                    label.setText("The time is up!");
                }
                else
                {
                    label.setText("Wait for " + counter + " sec");
                    counter--;
                }
            }
        };

        timer = new Timer(delay, action);
        timer.setInitialDelay(0);
        timer.start();

        setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new SimpleTimer();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


dre*_*ash 5

设置计时器包括创建Timer对象,在其上注册一个或多个动作侦听器,以及使用start方法启动计时器.例如,以下代码创建并启动一个计时器,该计时器每秒触发一次动作事件(由Timer构造函数的第一个参数指定).Timer构造函数的第二个参数指定一个侦听器来接收计时器的操作事件.通过指定延迟参数和ActionListener来构造计时器.(来源)

此外,计时器的计时是在与事件派发线程(或EDT)不同的线程中完成的,事件派发线程是在ActionListener中运行代码的线程.因此,即使actionPerformed代码很慢,计时器也将继续触发,并将其actionPerformed代码排队在事件队列上,这可能会被备份,事件线程将被阻塞,应用程序将无法响应或响应不佳,unsell你将coalesce设置为true(source).

这是一个很好的tuturial 如何使用摆动定时器