2015-04-08 6 views
1

Я пытаюсь создать счетчик, который имеет часы и минуты. Часть минут должна увеличиваться только на 10 минут, а время должно находиться в диапазоне от текущего времени до конечного времени. Мне также нужно минимальное значение (ранее текущее время) для обновления до текущего времени.Ограничение времени JSpinner

Я попытался поиграть с ним, но я просто не мог заставить его работать.

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 ?); 

ответ

3

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); 
0

Вы можете расширить 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; 
     } 
    }; 
+1

Это не делать какие-либо проверки диапазона. Следующие/предыдущие значения должны находиться в пределах диапазона начала/конца. Кроме того, что, если вы хотите увеличить количество дней? – camickr

+0

Спасибо - отредактирован с учетом диапазона. Просто видел ваш ответ и предпочитал его по этой быстрой и грязной альтернативе (более гибкой с увеличением времени). – copeg

+1

Я просто скопировал существующий код из класса 'SpinnerDateModel' и изменил его, чтобы использовать переменную для значения increment/decment. Я стараюсь избегать переписывания кода, когда это возможно. – camickr

 Смежные вопросы

  • Нет связанных вопросов^_^