我想将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);
}
});
我想要的只是在特定的确定时间内更改帧背景的颜色。任何帮助都会非常苛刻。
编辑:
我点击“准时”复选框,然后更改SpinnerDateModel
的值。毕竟,当我按下启动时,计时器将从SpinnerDateModel
执行更改框架颜色的任务的延迟开始。
我的代码只是改变颜色imediatly我按开始,没有延迟。
答案 0 :(得分:3)
您的初始delay
将来数千年。取而代之的是,
从微调器的值中减去当前时间以获得delay
。
将计时器的初始延迟重置为计算出的delay
值。
调用restart()
以使用新的初始延迟启动计时器。
以下示例增加Calendar.SECOND
,以便于测试。
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);
}
}