我正在尝试创建一个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 (
如果有人知道这个问题的解决方案,请告诉我,如果您需要更多信息,也请告诉我,因为我知道我没有那么好解释。
答案 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));
}