Показване на списък с дата, избрана във Vaadin?

Изискване: има две полета за дата, които помагат при избора на начална и крайна дата. Списъкът с дати между този диапазон трябва да се покаже в таблица.

Помогнете ми с решение за vaadin 7.

 public List<Date> getDatesBetween(final Date date1, final Date date2) {
        List<Date> dates = new ArrayList<Date>();

        Calendar calendar = new GregorianCalendar() {{
            set(Calendar.YEAR, date1.getYear());
            set(Calendar.MONTH, date1.getMonth());
            set(Calendar.DATE, date1.getDate());
        }};

        while (calendar.get(Calendar.YEAR) != date2.getYear() && calendar.get(Calendar.MONTH) != date2.getMonth() && calendar.get(Calendar.DATE) != date2.getDate()) {
            calendar.add(Calendar.DATE, 1);
            dates.add(new Date(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE)));
        }

        return dates;
    }

След това този списък се показва с помощта на:

    table=new Table("Employee dates!");
    table.removeAllItems();

   /// ...... within the loop 
    table.addItem();
  /// ...... within the loop 

 NOTE: an alternative way of getting the list of dates is appreciated.

person sabby    schedule 29.10.2014    source източник
comment
Опитах се да използвам календара Calendar calendar = new GregorianCalendar() и зададох годината месец и дата на списък с дати и създадох цикъл while: while (calendar.get(Calendar.YEAR) != date2.getYear() && calendar .get(Calendar.MONTH) != date2.getMonth() && calendar.get(Calendar.DATE) != date2.getDate()) и това влиза във функция, която ще върне този списък с дати и ще го добави към таблицата .   -  person sabby    schedule 29.10.2014
comment
Моля, редактирайте въпроса си и напишете целия си код, по-лесно е за четене!   -  person Krayo    schedule 29.10.2014


Отговори (2)


Ако съм разбрал правилно, искате да поставите в таблица списъка с датите (ден по ден, предполагам) между две дати. Бихте могли да направите нещо като

public List<Date> getDatesBetween(final Date date1, final Date date2) {
    List<Date> dates = new ArrayList<Date>();
    Calendar c = Calendar.getInstance();
    c.setTime(date1);

    //dates.add(date1); //use it if you need the first day
    while(c.getTime().compareTo(date2) < 0) { //date1 is lesser than date2, use <= if you need the last day
        c.add(Calendar.DATE, 1);
        dates.add(c.getTime());
    }

    return dates;
}

Сега, за да поставите тези стойности правилно в таблица, тъй като не са чисти "елементи".

Table tableDates = new Table("Dates from ... to ...");
tableDates.setSizeFull();
tableDates.setImmediate(true);
tableDates.addContainerProperty("date", Date.class, null);
tableDates.setColumnHeader("date", "Date");

И тогава за всяка дата можете да направите

Object[] tableRow = new Object[] {date}; //date is a Date object..you can merge this in the "getDatesBetween" method above
tableDates.addItem(tableRow , null); //null -> autogenerated id
person MarcelloGarini    schedule 29.10.2014
comment
Мисля, че вашият оператор while е безкраен цикъл, date1 никога не се променя. - person Krayo; 29.10.2014
comment
Добра точка...трябваше да използвам c.getTime(). Ще го коригирам. Благодаря - person MarcelloGarini; 29.10.2014

Основният проблем е, че методите на клас Date са остарели (и подвеждащи).
getYear() javadoc пише: годината, представена от тази дата, минус 1900.
Освен това трябва да замените && с || в израза на оператора while.

Моето предложение:

public static List<Date> getDatesBetween(final Date date1, final Date date2) {
    List<Date> dates = new ArrayList<Date>();

    Calendar cal1 = new GregorianCalendar();
    cal1.setTime(date1);
    Calendar cal2 = new GregorianCalendar();
    cal2.setTime(date2);

    while (cal1.get(Calendar.YEAR) != cal2.get(Calendar.YEAR)
            || cal1.get(Calendar.MONTH) != cal2.get(Calendar.MONTH)
            || cal1.get(Calendar.DATE) != cal2.get(Calendar.DATE)) {
        cal1.add(Calendar.DATE, 1);
        dates.add(cal1.getTime());
    }

    return dates;
}
person Krayo    schedule 29.10.2014