Java JSpinner时间约束

Java JSpinner时间约束,java,swing,user-interface,jspinner,Java,Swing,User Interface,Jspinner,我正在尝试创建一个有小时和分钟的微调器。分钟部分只需增加10分钟,时间范围必须从当前时间到结束时间。我还需要最小值(以前的当前时间)来更新到当前时间 我试着玩弄它,但就是没法让它发挥作用 JSpinner spinner1 = new javax.swing.JSpinner(); SpinnerDateModel spinnermodel = new SpinnerDateModel(); spinnermodel.setCalendarField(Calendar.MINUT

我正在尝试创建一个有小时和分钟的微调器。分钟部分只需增加10分钟,时间范围必须从当前时间到结束时间。我还需要最小值(以前的当前时间)来更新到当前时间

我试着玩弄它,但就是没法让它发挥作用

JSpinner spinner1 = new javax.swing.JSpinner();
    SpinnerDateModel spinnermodel = new SpinnerDateModel();
    spinnermodel.setCalendarField(Calendar.MINUTE);
    spinner1.setModel(spinnermodel);
    spinner1.setEditor(new JSpinner.DateEditor(spinner1, "hh:mm"));

SpinnerModel model = new SpinnerDateModel(currentDate, currentDate, latestDate, Calendar.MINUTE * 10 ?);

SpinnerDateModel
仅使用1来增加要更改的字段

我扩展了
SpinnerDateModel
,向模型添加了一个addition属性,以控制增量值,而不是硬编码为1:

import java.util.*;
import javax.swing.*;

public class MySpinnerDateModel extends SpinnerDateModel
{
    private int increment = 1;

    public MySpinnerDateModel(Date value, Comparable start, Comparable end, int calendarField)
    {
        super(value, start, end, calendarField);
    }

    public MySpinnerDateModel()
    {
        this(new Date(), null, null, Calendar.DAY_OF_MONTH);
    }

    public void setIncrement(int increment)
    {
        this.increment = increment;
    }

    public int getIncrement()
    {
        return increment;
    }

    @Override
    public Object getNextValue()
    {
        Calendar cal = Calendar.getInstance();
        Date value = (Date)getValue();
        cal.setTime(value);
        cal.add(getCalendarField(), increment);
        Date next = cal.getTime();
        Comparable end = getEnd();

        return ((end == null) || (end.compareTo(next) >= 0)) ? next : null;
    }

    @Override
    public Object getPreviousValue()
    {
        Calendar cal = Calendar.getInstance();
        Date value = (Date)getValue();
        cal.setTime(value);
        cal.add(getCalendarField(), -increment);
        Date prev = cal.getTime();
        Comparable start = getStart();

        return ((start == null) || (start.compareTo(prev) <= 0)) ? prev : null;
    }
}

可以扩展SpinnerDateModel以指定行为。下面是一个示例,其中getNextValue和getPreviousValue被覆盖以返回+/-10分钟的值:

    Date now = new Date();
    Date start = now;
    final long tenMinutesInMillis = 1000 * 60 * 10;
    Date end = new Date(now.getTime() + tenMinutesInMillis * 60);
    SpinnerModel model = new SpinnerDateModel(now, start, end, Calendar.MINUTE){
        @Override
        public Object getNextValue(){
            Date newDate = new Date(getDate().getTime() + tenMinutesInMillis);
            Date endDate = (Date)getEnd();
            return newDate.getTime() > endDate.getTime() ? endDate : newDate;
        }

        @Override
        public Object getPreviousValue(){
            Date newDate = new Date(getDate().getTime() - tenMinutesInMillis);
            Date startDate = (Date)getStart();
            return newDate.getTime() < startDate.getTime() ? startDate : newDate;
        }
    };
datenow=新日期();
日期开始=现在;
最终长十分钟,单位为毫=1000*60*10;
日期结束=新日期(now.getTime()+tenMinutesInMillis*60);
SpinnerModel model=新SpinnerDateModel(现在、开始、结束、日历.分钟){
@凌驾
公共对象getNextValue(){
Date newDate=新日期(getDate().getTime()+十分钟单位毫秒);
Date endDate=(Date)getEnd();
返回newDate.getTime()>endDate.getTime()?endDate:newDate;
}
@凌驾
公共对象getPreviousValue(){
Date newDate=新日期(getDate().getTime()-tenMinutesInMillis);
日期开始日期=(日期)getStart();
返回newDate.getTime()
这不会进行任何范围检查。下一个/上一个值应在开始/结束范围内。另外,如果你想按天递增怎么办?谢谢-编辑时考虑了范围检查。我刚刚看到了你的答案,我更喜欢它,而不是这个又快又脏的选择(增量时间更灵活)。我只是从
SpinnerDateModel
类复制了现有代码,并对其进行了修改,以使用一个变量作为增量/减量值。我尽可能避免重写代码。
    Date now = new Date();
    Date start = now;
    final long tenMinutesInMillis = 1000 * 60 * 10;
    Date end = new Date(now.getTime() + tenMinutesInMillis * 60);
    SpinnerModel model = new SpinnerDateModel(now, start, end, Calendar.MINUTE){
        @Override
        public Object getNextValue(){
            Date newDate = new Date(getDate().getTime() + tenMinutesInMillis);
            Date endDate = (Date)getEnd();
            return newDate.getTime() > endDate.getTime() ? endDate : newDate;
        }

        @Override
        public Object getPreviousValue(){
            Date newDate = new Date(getDate().getTime() - tenMinutesInMillis);
            Date startDate = (Date)getStart();
            return newDate.getTime() < startDate.getTime() ? startDate : newDate;
        }
    };