【问题标题】:JSpinner time constraintJSpinner 时间限制
【发布时间】:2015-04-08 15:45:33
【问题描述】:

我正在尝试创建一个有小时和分钟的微调器。分钟部分只需增加 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 ?);

【问题讨论】:

    标签: java swing user-interface jspinner


    【解决方案1】:

    SpinnerDateModel 只是使用 1 来增加您要更改的字段。

    我扩展了SpinnerDateModel,为模型添加了一个加法属性来控制增量值而不是硬编码为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;
        }
    }
    

    您应该能够像以前一样使用该模型,但需要添加一条语句:

    MySpinnerDateModel model = new MySpinnerDateModel(currentDate, currentDate, latestDate, Calendar.MINUTE); 
    model.setIncrement( 10 );
    

    【讨论】:

      【解决方案2】:

      您可以扩展 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;
              }
          };
      

      【讨论】:

      • 这不做任何范围检查。下一个/上一个值应在开始/结束范围内。另外,如果你想按天递增怎么办?
      • 谢谢 - 编辑时考虑到范围检查。刚刚看到您的答案,并且比这种快速而肮脏的替代方案更喜欢它(增量时间更灵活)。
      • 我刚刚从SpinnerDateModel 类中复制了现有代码,并对其进行了修改以使用变量作为增量/减量值。我尽量避免重写代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多