【问题标题】:Increase week count by click通过点击增加周数
【发布时间】:2016-07-06 23:01:18
【问题描述】:

我想每次点击一个按钮增加 1 周,我想在 Jlabel1 显示一周的第一天,在 JLabel2 显示一周的结束。

我已经完成了第一步,显示第一天知道周数和最后一天(见代码),但第二步是下周增加 1 例如本周(开始> 04-07-2016 结束> 10-07-2016),当我点击一个按钮时,它会增加两周(开始> 11-07-2016 结束> 17-07-2016)

 public void gestion_date() {
    Date date = new Date();
    Calendar maDate = new java.util.GregorianCalendar();
    maDate.setTime(date);
    // On se positionne sur le Lundi de la semaine courante :
    maDate.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    dat = df.format(maDate.getTime());
    jLabel3.setText(dat);
    maDate.add(Calendar.DATE, 6);
    dat = df.format(maDate.getTime());
    jLabel5.setText(dat);
}

The screen of my Jlabel and button and the example

【问题讨论】:

    标签: java date calendar dayofweek


    【解决方案1】:

    删除的答案是正确的。我不明白为什么它被撤回了。

    java.time

    问题使用了麻烦的旧日期时间类,这些类已被 Java 8 及更高版本中内置的 java.time 框架所取代。见Oracle Tutorial。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

    您需要一个时区来获取当前日期。

    ZoneId zoneId = ZoneId.of( "America/Montreal" );
    LocalDate today = LocalDate.now( zoneId );
    

    使用TemporalAdjusters 获取前一个星期一。 DayOfWeek 是一种方便的方式来表示一周中的每一天。

    LocalDate previousOrSameMonday = today.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) );
    

    如果您需要一周的最后一天用于其他目的,您可以执行以下操作。但是对于问题中描述的显示,不需要存储这个nextSunday 对象。您可以随时计算它,因为您知道它总是在一周开始后六天。

    LocalDate nextSunday = previousOrSameMonday.with( TemporalAdjusters.next( DayOfWeek.SUNDAY ) );
    

    现在您必须将一周的开始日期存储在班级成员中,以便留在内存中。在您的 gestion_date 方法中定义的局部变量在每次执行完成后都会消失。您可以在某个地方存储当前显示在 Swing 表单中的数据。我不知道那个地方在哪里,因为你在你的问题中没有提到。所以在这里我发明了一个虚构的名称modelBehindMySwingForm,其中“模型”的意思是“我的应用的业务数据”。

    modelBehindMySwingForm.weekStart = previousOrSameMonday;
    

    每次单击加法或减法按钮时,将该成员变量增加一周。

    modelBehindMySwingForm.weekStart = modelBehindMySwingForm.weekStart.plusWeeks( 1 ); // Or minusWeeks
    

    并使用代表LocalDate 对象值的字符串更新JLabel 小部件。您可以通过调用toString 获取ISO 8601 格式的日期。最好让 java.time 使用 DateTimeFormatter 为您本地化。将格式化程序对象存储在某处,例如您的modelBehindMySwingForm,因为重新创建它没有任何意义。

    Locale locale = Locale.CANADA_FRENCH;
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT );
    formatter = formatter.withLocale( locale );
    

    如上所示递增modelBehindMySwingForm.weekStart 后,使用格式化程序生成字符串以显示在您的 JLabel 对象中。

    String start = modelBehindMySwingForm.weekStart.format( modelBehindMySwingForm.formatter );  // Monday
    String stop = modelBehindMySwingForm.weekStart.plusDays( 6 ).format( modelBehindMySwingForm.formatter ); // Following Sunday.
    

    【讨论】:

    • 你所说的 (( modelBehindMySwingForm )) 是什么意思??
    • 您可以在某个地方存储当前显示在 Swing 表单中的数据。我不知道那在哪里,因为您在问题中没有提及。所以我发明了一个虚构的名字modelBehindMySwingForm,其中“模型”的意思是“我的应用的业务数据”。
    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多