为Java日历创建UI

时间:2018-02-15 20:57:57

标签: java user-interface

我正在尝试创建一个Java日历,用户输入年份,月份和日期,它将告诉它一周中的哪一天。我可以完成所有数据处理,但我遇到的问题是系统的GUI部分。因此,我们的想法是让它显示一周中的几天,然后根据用户输入的日期,每天绘制一个星号,直到达到用户定义的日期。例如,假设用户输入“2018,02,15”,日历应如下所示:

S   M   T   W   T   F   S
                *   *   *
*   *   *   *   *   *   *
*   *   *   *   *

这就是它应该是什么样子,如果它是第15个。所以我遇到的问题是我不确定如何从周六(最右边的一天)到下一行,因为日历上的每个月都可以在不同的一天开始,我也不知道如何进行初始偏移以使其进入本月的第一天,而不是仅仅从星期日开始。 到目前为止我的代码从星期日开始绘制星号,并继续在同一行。 (另外,请注意,这是在Ready To Program Java中编码的,因此它默认设置c = system.out /system.in,因此这里的一些代码与传统Java略有不同)

int days;
    days = 0;
    c.println ("Enter your day");
    days = c.readInt ();

    c.println ("   S   M   T   W   T   F   S");
    int variable;
    variable = 0;
    for (int i = 0 ; i <= days && days < 7 ; i++)
    {
        c.print ("   *");
    }

    for (

如果有人知道这个问题的解决方案,请告诉我,如果您需要更多信息,也请告诉我,因为我知道我没有那么好解释。

2 个答案:

答案 0 :(得分:0)

看起来你正在为命令提示符构建这个UI,对吗?

我认为你应该调整你的循环:

for (int i = 0 ; i <= days && days < 7 ; i++)
{
    if(i % 6 == 0)
    {
        c.print("   *\n");
    }
    else
    {
        c.print ("   *");
    }
}

此外,我建议使用\t而不是文字空格。 \t是获取制表符/ 4空格的快捷方式,并且更加统一。此外,\n可以替换为System.lineSeparator(),这允许跨平台(OS)兼容性

答案 1 :(得分:0)

可能是这样的:

public class CalendarCustom {

    public static String generateCalendarPageWithCrossedDaysToDate(LocalDate date) {
        DayOfWeek firstDayOfWeekInMonth = LocalDate.of(date.getYear(), date.getMonth(), 1).getDayOfWeek();
        StringBuilder calendarPage = new StringBuilder();
        calendarPage.append("   S   M   T   W   T   F   S");
        for (int i = 0; i < date.getDayOfMonth() + firstDayOfWeekInMonth.getValue() + 1; i++) {
            calendarPage.append(i < firstDayOfWeekInMonth.getValue() + 1 ? "    " : "   *");
            calendarPage.append(i % 7 == 0 ? "\n" : "");
        }
        return calendarPage.toString();
    }

}

或使用IntStream

public class CalendarCustom {

    public static String generateCalendarPageWithCrossedDaysToDate(LocalDate date) {
        DayOfWeek firstDayOfWeekInMonth = LocalDate.of(date.getYear(), date.getMonth(), 1).getDayOfWeek();
        StringBuilder calendarPage = new StringBuilder();
        calendarPage.append("   S   M   T   W   T   F   S");
        IntStream.iterate(0, i -> i + 1)
                .limit(date.getDayOfMonth() + firstDayOfWeekInMonth.getValue() + 1)
                .forEach(i -> {
                    calendarPage.append(i < firstDayOfWeekInMonth.getValue() + 1 ? "    " : "   *");
                    calendarPage.append(i % 7 == 0 ? "\n" : "");
                });
        return calendarPage.toString();
    }

}

用于:

public static void main(String[] args) {
    LocalDate date = LocalDate.parse("2018-02-24");
    System.out.println(CalendarCustom.generateCalendarPageWithCrossedDaysToDate(date));
}