与Java Swing计时器混淆

与Java Swing计时器混淆,java,swing,user-interface,timer,jframe,Java,Swing,User Interface,Timer,Jframe,我真的对Java swing计时器感到困惑。它需要一个动作监听器吗?谁能给我举个例子吗?谢谢 以下是一个使用的示例: 下面是一个使用的示例: 设置计时器涉及创建计时器对象,在其上注册一个或多个动作侦听器,并使用启动方法启动计时器。例如,以下代码创建并启动一个计时器,该计时器每秒触发一次操作事件(由计时器构造函数的第一个参数指定)。计时器构造函数的第二个参数指定接收计时器操作事件的侦听器计时器是通过同时指定延迟参数和ActionListener来构造的。() 此外,计时器的计时是在不同于事件分

我真的对Java swing计时器感到困惑。它需要一个动作监听器吗?谁能给我举个例子吗?谢谢

以下是一个使用的示例:


下面是一个使用的示例:


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

此外,计时器的计时是在不同于事件分派线程(或EDT)的线程中完成的,事件分派线程是在ActionListener中运行代码的线程。因此,即使actionPerformed代码很慢,计时器仍将继续启动,并将其actionPerformed代码排队到事件队列中,事件队列可能会被备份,事件线程将被阻塞,应用程序将无响应或响应不良,取消您设置为
true
()的设置


下面是一个很好的教程

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

此外,计时器的计时是在不同于事件分派线程(或EDT)的线程中完成的,事件分派线程是在ActionListener中运行代码的线程。因此,即使actionPerformed代码很慢,计时器仍将继续启动,并将其actionPerformed代码排队到事件队列中,事件队列可能会被备份,事件线程将被阻塞,应用程序将无响应或响应不良,取消您设置为
true
()的设置


这里有一句很好的训诫:“我真的被……弄糊涂了。”这样行吗?小费。做一些研究,展示你的努力。所以不是服务台或你的私人导师。投票以“不是真实的…”结束。我已经做了研究,在编程时出现混乱是可以的。我自学成才,在提问之前做了大量的研究。“在提问之前做大量的研究。”所以展示出来。不要以为我们能读懂你的心思,看看你做了什么。它有助于说明你发现了什么,这样人们就不必重复他们自己。它有助于说明你在哪里找到的,这样人们就可以看到“java教程”好,“Rose印度”坏…考虑显示[当前]代码-使这些问题变得更好:“我真的与……混淆了……这样的方式有效吗?”小费。做一些研究,展示你的努力。所以不是服务台或你的私人导师。投票以“不是真实的…”结束。我已经做了研究,在编程时出现混乱是可以的。我自学成才,在提问之前做了大量的研究。“在提问之前做大量的研究。”所以展示出来。不要以为我们能读懂你的心思,看看你做了什么。它有助于说明你发现了什么,这样人们就不必重复他们自己。它有助于说明你在哪里找到它,这样人们就可以看到“java教程”好,“Rose印度”坏…考虑显示[当前]代码-使这些问题变得更好:当你把这个“新”定时器,这是否意味着它所处的空白?@user1832583
指向扩展了
ActionListener
SimpleTimer
的当前实例。我更新了我的答案以便更清楚。当你在新计时器中添加“this”时,它是否意味着它所处的空白?@user1832583
this
指向扩展了
ActionListener
SimpleTimer
的当前实例。我更新了我的答案,使其更清晰。“这可能会被备份,事件线程将被阻塞,应用程序将无响应或响应不良”,除非您将coalesce设置为
true
;)+1为了提及EDT思想谢谢,我刚刚添加了您提供给我的附加信息:)“这可能会被备份,事件线程将被阻塞,应用程序将无响应或响应不良”,除非您将coalesce设置为
true
;)+1提及EDT想法谢谢,我刚刚添加了您提供给我的附加信息:)
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();
            }
        });
    }
}