質問するログイン新規登録

回答編集履歴

4

追記

2018/08/17 11:17

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -77,10 +77,11 @@
77
77
  import java.util.stream.IntStream;
78
78
  import java.util.stream.Stream;
79
79
 
80
+ class SwingCalendar extends JPanel {
80
- private JLabel[] dayLabels;
81
+ private JLabel[] dayLabels; // 一次元配列(0オリジン)
81
82
  public SwingCalendar() {
82
- // 前略
83
+ // 前略
83
- dayPanel.setBackground(DAY_BG);
84
+ dayPanel.setBackground(DAY_BG);
84
85
  // 当月1日
85
86
  final LocalDate firstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
86
87
  // 一ヶ月間のラベルのリスト(最後に配列化)

3

追記

2018/08/17 11:17

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -61,4 +61,68 @@
61
61
  dayLabels[i][j] = new DayLabel("test");
62
62
  ```
63
63
 
64
- 曜日とコードがほぼ同じなので、コンストラクタを改良して共通化するのも一つの手かと。
64
+ 曜日とコードがほぼ同じなので、コンストラクタを改良して共通化するのも一つの手かと。
65
+
66
+ ---
67
+
68
+ LocalDateを使ったサンプルコードです、**あとは自力で頑張ってくださいな。**
69
+
70
+ ```Java
71
+ import java.time.LocalDate;
72
+ import java.time.temporal.TemporalAdjusters;
73
+ import java.util.ArrayList;
74
+ import java.util.Calendar;
75
+ import java.util.List;
76
+ import java.util.stream.Collectors;
77
+ import java.util.stream.IntStream;
78
+ import java.util.stream.Stream;
79
+
80
+ private JLabel[] dayLabels;
81
+ public SwingCalendar() {
82
+ // 前略
83
+ dayPanel.setBackground(DAY_BG);
84
+ // 当月1日
85
+ final LocalDate firstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
86
+ // 一ヶ月間のラベルのリスト(最後に配列化)
87
+ final List<JLabel> dayList = new ArrayList<>();
88
+
89
+ for (LocalDate day : getDateList(firstDay)) {
90
+ final int d = day.getDayOfMonth();
91
+ System.out.println(d);
92
+ JLabel label = new JLabel(String.valueOf(d));
93
+ label.setHorizontalAlignment(SwingConstants.CENTER);
94
+ label.setVerticalAlignment(SwingConstants.CENTER);
95
+ label.setOpaque(true);
96
+ label.setBackground(DAY_BG);
97
+ label.setPreferredSize(DAY_LABEL_SIZE);
98
+ // 土、日の判定のみなので、ここに祝日判定が必要
99
+ switch (day.getDayOfWeek()) {
100
+ case SUNDAY:
101
+ label.setForeground(Color.RED);
102
+ break;
103
+ case SATURDAY:
104
+ label.setForeground(Color.BLUE);
105
+ break;
106
+ default:
107
+ label.setForeground(Color.WHITE);
108
+ break;
109
+ }
110
+ dayList.add(label);
111
+ dayPanel.add(label);
112
+ }
113
+
114
+ // GridLayoutが7*7=49で残りをFillする。
115
+ IntStream.range(0, 49 - dayList.size()).forEach(x -> {
116
+ // GridLayoutに項目を追加する。
117
+ dayPanel.add(new JLabel(""));
118
+ });
119
+ // リストから配列に変換
120
+ dayLabels = dayList.toArray(new JLabel[0]);
121
+ JPanel monthPanel = new JPanel();
122
+ // 以下省略
123
+ }
124
+ public static List<LocalDate> getDateList(final LocalDate start) {
125
+ final int days = start.lengthOfMonth();
126
+ return Stream.iterate(start, d -> d.plusDays(1)).limit(days).collect(Collectors.toList());
127
+ }
128
+ ```

2

追記

2018/08/17 11:15

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -6,7 +6,7 @@
6
6
   //日付の配列
7
7
   for( int i=0; i<6; i++) {
8
8
    for( int j=0; j<7; j++) {
9
- // ↓ ※1
9
+ // ↓ ※1 JLabelのテキスト文字を設定していません。
10
10
  dayLabels[i][j] = new JLabel(); //String.valueOf(i),(j)
11
11
  // 中略
12
12
      if( i == 0 && j == 0 ) { // ← ※2
@@ -16,13 +16,13 @@
16
16
      }
17
17
  ```
18
18
  この3箇所が変です。`j==0`の時しか前景色が変わりません。
19
- あとi == 6と判定していますが、iが6になることは`for( int i=0; i<6; i++)`ループ上ありえないかと。
19
+ あと`i == 6`と判定していますが、変数:`i`ループの中で`6`になることは`for( int i=0; i<6; i++)`ループ上ありえないかと。
20
20
 
21
21
  というわけでこんな感じでは。
22
22
  ```Java
23
-     if(j == 0 ) {
23
+     if(j == 0) {
24
24
        dayLabels[i][j].setForeground(Color.RED);
25
-     } else if (j == 6 ) {
25
+     } else if (j == 6) {
26
26
        dayLabels[i][j].setForeground(Color.BLUE);
27
27
      }
28
28
  ```
@@ -57,6 +57,8 @@
57
57
        this.setPreferredSize(DAY_LABEL_SIZE);
58
58
     }
59
59
  }
60
+ // 使い方
61
+ dayLabels[i][j] = new DayLabel("test");
60
62
  ```
61
63
 
62
64
  曜日とコードがほぼ同じなので、コンストラクタを改良して共通化するのも一つの手かと。

1

追記

2018/08/17 08:39

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -28,9 +28,10 @@
28
28
  ```
29
29
 
30
30
  土、日の判定はこれで大丈夫ですが、
31
- 祝日を判定するにはこれではダメで祝日テーブルをどこかに持つ必要があります。
32
- [春分の日](https://ja.wikipedia.org/wiki/%E6%98%A5%E5%88%86%E3%81%AE%E6%97%A5)と秋分の日が年によって違うので
31
+ [春分の日](https://ja.wikipedia.org/wiki/%E6%98%A5%E5%88%86%E3%81%AE%E6%97%A5)と秋分の日が年によって違うので祝日を判定するにはこれではダメです。
32
+ 祝日の情報をどこかに持つ必要があります。
33
+ [LocalDate](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html)を使って、[LocalDate#plusDays
33
- LocalDate#plusDaysを1づつ加算して表を作るのをお勧めいたします。
34
+ ](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html#plusDays-long-)で日付を1づつ加算して表を作るのをお勧めいたします。
34
35
 
35
36
  ---
36
37