如何在Timer中使用SpinnerDateModel的更改值来执行任务?

时间:2016-06-30 07:27:40

标签: java swing timer jspinner

我想将spinnerdatemodel的更改值和当前日期之间的差异作为计时器的延迟。这是JSpinner

Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, 5);
Date max = cal.getTime();
SpinnerDateModel sdm = new SpinnerDateModel(cal.getTime(),null, max,Calendar.HOUR_OF_DAY);
jSpinner1 = new javax.swing.JSpinner(sdm);
jSpinner1 .setEditor(new JSpinner.DateEditor(jSpinner1 , "hh:mm:ss"));

这是我尝试但无法正常工作的代码:

jSpinner1.addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                    JSpinner jSpinner = (JSpinner)e.getSource();
                    Date time = (Date) jSpinner.getValue();

         if(jCheckBox1.isSelected())
         {     
                delay = 1000 * (int) time.getTime();

         }
         }
                                            });
 timer = new Timer(delay, new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent evt) {

            f.getContentPane().setBackground(c);

                                                      }               

        });

我想要的只是在特定的确定时间内更改帧背景的颜色。任何帮助都会非常苛刻。

编辑:

Image

我点击“准时”复选框,然后更改SpinnerDateModel的值。毕竟,当我按下启动时,计时器将从SpinnerDateModel执行更改框架颜色的任务的延迟开始。

我的代码只是改变颜色imediatly我按开始,没有延迟。

1 个答案:

答案 0 :(得分:3)

您的初始delay将来数千年。取而代之的是,

  • 从微调器的值中减去当前时间以获得delay

  • 将计时器的初始延迟重置为计算出的delay值。

  • 调用restart()以使用新的初始延迟启动计时器。

以下示例增加Calendar.SECOND,以便于测试。

image

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * @see http://stackoverflow.com/a/38120036/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Calendar cal = Calendar.getInstance();
        SpinnerDateModel sdm = new SpinnerDateModel(cal.getTime(), null, null, Calendar.SECOND);
        JSpinner spinner = new JSpinner(sdm);
        spinner.setEditor(new JSpinner.DateEditor(spinner, "yyyy-MM-dd hh:mm:ss"));
        JPanel p = new JPanel();
        p.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        p.add(spinner);
        f.add(p);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        Timer timer = new Timer(Integer.MAX_VALUE, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                p.setBackground(Color.getHSBColor((float) Math.random(), 1, 1));
            }
        });
        spinner.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                JSpinner jSpinner = (JSpinner) e.getSource();
                Date date = (Date) jSpinner.getValue();
                long delay = date.getTime() - System.currentTimeMillis();
                if (delay > 0) {
                    timer.setInitialDelay((int) delay);
                    timer.restart();
                }
            }
        });
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}