如何使用ics文件中的数据构建日历视图?

时间:2014-02-13 00:07:26

标签: java user-interface icalendar

我正在创建一个基于iCalendar格式的PC程序。我需要能够从当前的ics文件中获取数据并将其显示为日历或至少与日历类似的内容。我知道如何从ics文件中获取数据只是不知道如何轻松地将这些数据用于显示目的。

这是我的开始代码:

public void getCalendarData(File f) throws FileNotFoundException, IOException, ParserException
{
    FileInputStream fin = new FileInputStream(f);
    builder = new CalendarBuilder();
    calendar = builder.build(fin);
}

2 个答案:

答案 0 :(得分:4)

有一件事是ical4j,它基本上是一个包装ICS格式的实用程序。

另一件事是日历/时间表的前端: - )

但是,幸运的是,有一个很好的带有Primefaces的JSF组件,如果网络界面对你来说可以使用。

http://www.primefaces.org/showcase/ui/data/schedule.xhtml

基本上,您需要的是从ICS解析数据并提供primefaces组件数据模型(上面的链接包含JSF和托管bean如何使用组件的示例)

所以你必须这样的事情

private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyyMMdd");

@PostConstruct
private void loadIcs() {
    eventModel = new DefaultScheduleModel();
    CalendarBuilder builder = new CalendarBuilder();

    try {
        net.fortuna.ical4j.model.Calendar calendar = builder.build(this.getClass().getResourceAsStream("canada.ics"));

        for (Iterator i = calendar.getComponents().iterator(); i.hasNext();) {
            Component component = (Component) i.next();
            //new event
            Date start = SDF.parse(component.getProperty("DTSTART").getValue());
            Date end = SDF.parse(component.getProperty("DTEND").getValue());
            String summary = component.getProperty("SUMMARY").getValue();

            eventModel.addEvent(new DefaultScheduleEvent(summary,
            start, end));

            System.out.println("added "+start+end+summary);

        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParserException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    }

}

答案 1 :(得分:0)

不确定您是指实际的GUI还是从icalendar获取日期列表,由于RRULE属性,该日历列表相当复杂。在第一种情况下,选择是敞开的(HTML,...),在后一种情况下,下面复制了一个示例here

// Reading the file and creating the calendar
CalendarBuilder builder = new CalendarBuilder();
Calendar cal = null;
try {
    cal = builder.build(new FileInputStream("my.ics"));
} catch (IOException e) {
    e.printStackTrace();
} catch (ParserException e) {
    e.printStackTrace();
}


// Create the date range which is desired.
DateTime from = new DateTime("20100101T070000Z");
DateTime to = new DateTime("20100201T070000Z");;
Period period = new Period(from, to);


// For each VEVENT in the ICS
for (Object o : cal.getComponents("VEVENT")) {
    Component c = (Component)o;
    PeriodList list = c.calculateRecurrenceSet(period);

    for (Object po : list) {
        System.out.println((Period)po);
    }
}