回答編集履歴

4

追記

2018/08/17 11:17

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -156,13 +156,15 @@
156
156
 
157
157
 
158
158
 
159
+ class SwingCalendar extends JPanel {
160
+
159
- private JLabel[] dayLabels;
161
+ private JLabel[] dayLabels; // 一次元配列(0オリジン)
160
162
 
161
163
  public SwingCalendar() {
162
164
 
163
- // 前略
165
+ // 前略
164
-
166
+
165
- dayPanel.setBackground(DAY_BG);
167
+ dayPanel.setBackground(DAY_BG);
166
168
 
167
169
  // 当月1日
168
170
 

3

追記

2018/08/17 11:17

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -125,3 +125,131 @@
125
125
 
126
126
 
127
127
  曜日とコードがほぼ同じなので、コンストラクタを改良して共通化するのも一つの手かと。
128
+
129
+
130
+
131
+ ---
132
+
133
+
134
+
135
+ LocalDateを使ったサンプルコードです、**あとは自力で頑張ってくださいな。**
136
+
137
+
138
+
139
+ ```Java
140
+
141
+ import java.time.LocalDate;
142
+
143
+ import java.time.temporal.TemporalAdjusters;
144
+
145
+ import java.util.ArrayList;
146
+
147
+ import java.util.Calendar;
148
+
149
+ import java.util.List;
150
+
151
+ import java.util.stream.Collectors;
152
+
153
+ import java.util.stream.IntStream;
154
+
155
+ import java.util.stream.Stream;
156
+
157
+
158
+
159
+ private JLabel[] dayLabels;
160
+
161
+ public SwingCalendar() {
162
+
163
+ // 前略
164
+
165
+ dayPanel.setBackground(DAY_BG);
166
+
167
+ // 当月1日
168
+
169
+ final LocalDate firstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
170
+
171
+ // 一ヶ月間のラベルのリスト(最後に配列化)
172
+
173
+ final List<JLabel> dayList = new ArrayList<>();
174
+
175
+
176
+
177
+ for (LocalDate day : getDateList(firstDay)) {
178
+
179
+ final int d = day.getDayOfMonth();
180
+
181
+ System.out.println(d);
182
+
183
+ JLabel label = new JLabel(String.valueOf(d));
184
+
185
+ label.setHorizontalAlignment(SwingConstants.CENTER);
186
+
187
+ label.setVerticalAlignment(SwingConstants.CENTER);
188
+
189
+ label.setOpaque(true);
190
+
191
+ label.setBackground(DAY_BG);
192
+
193
+ label.setPreferredSize(DAY_LABEL_SIZE);
194
+
195
+ // 土、日の判定のみなので、ここに祝日判定が必要
196
+
197
+ switch (day.getDayOfWeek()) {
198
+
199
+ case SUNDAY:
200
+
201
+ label.setForeground(Color.RED);
202
+
203
+ break;
204
+
205
+ case SATURDAY:
206
+
207
+ label.setForeground(Color.BLUE);
208
+
209
+ break;
210
+
211
+ default:
212
+
213
+ label.setForeground(Color.WHITE);
214
+
215
+ break;
216
+
217
+ }
218
+
219
+ dayList.add(label);
220
+
221
+ dayPanel.add(label);
222
+
223
+ }
224
+
225
+
226
+
227
+ // GridLayoutが7*7=49で残りをFillする。
228
+
229
+ IntStream.range(0, 49 - dayList.size()).forEach(x -> {
230
+
231
+ // GridLayoutに項目を追加する。
232
+
233
+ dayPanel.add(new JLabel(""));
234
+
235
+ });
236
+
237
+ // リストから配列に変換
238
+
239
+ dayLabels = dayList.toArray(new JLabel[0]);
240
+
241
+ JPanel monthPanel = new JPanel();
242
+
243
+ // 以下省略
244
+
245
+ }
246
+
247
+ public static List<LocalDate> getDateList(final LocalDate start) {
248
+
249
+ final int days = start.lengthOfMonth();
250
+
251
+ return Stream.iterate(start, d -> d.plusDays(1)).limit(days).collect(Collectors.toList());
252
+
253
+ }
254
+
255
+ ```

2

追記

2018/08/17 11:15

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
    for( int j=0; j<7; j++) {
16
16
 
17
- // ↓ ※1
17
+ // ↓ ※1 JLabelのテキスト文字を設定していません。
18
18
 
19
19
  dayLabels[i][j] = new JLabel(); //String.valueOf(i),(j)
20
20
 
@@ -34,7 +34,7 @@
34
34
 
35
35
  この3箇所が変です。`j==0`の時しか前景色が変わりません。
36
36
 
37
- あとi == 6と判定していますが、iが6になることは`for( int i=0; i<6; i++)`ループ上ありえないかと。
37
+ あと`i == 6`と判定していますが、変数:`i`ループの中で`6`になることは`for( int i=0; i<6; i++)`ループ上ありえないかと。
38
38
 
39
39
 
40
40
 
@@ -42,11 +42,11 @@
42
42
 
43
43
  ```Java
44
44
 
45
-     if(j == 0 ) {
45
+     if(j == 0) {
46
46
 
47
47
        dayLabels[i][j].setForeground(Color.RED);
48
48
 
49
-     } else if (j == 6 ) {
49
+     } else if (j == 6) {
50
50
 
51
51
        dayLabels[i][j].setForeground(Color.BLUE);
52
52
 
@@ -116,6 +116,10 @@
116
116
 
117
117
  }
118
118
 
119
+ // 使い方
120
+
121
+ dayLabels[i][j] = new DayLabel("test");
122
+
119
123
  ```
120
124
 
121
125
 

1

追記

2018/08/17 08:39

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -58,11 +58,13 @@
58
58
 
59
59
  土、日の判定はこれで大丈夫ですが、
60
60
 
61
- 祝日を判定するにはこれではダメで祝日テーブルをどこかに持つ必要があります。
61
+ [春分の日](https://ja.wikipedia.org/wiki/%E6%98%A5%E5%88%86%E3%81%AE%E6%97%A5)と秋分の日が年によって違うので祝日を判定するにはこれではダメです。
62
62
 
63
- [春分の](https://ja.wikipedia.org/wiki/%E6%98%A5%E5%88%86%E3%81%AE%E6%97%A5)と秋分年によって違うので
63
+ 日の情報をどこかに持つ必要あります。
64
64
 
65
+ [LocalDate](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html)を使って、[LocalDate#plusDays
66
+
65
- LocalDate#plusDaysを1づつ加算して表を作るのをお勧めいたします。
67
+ ](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html#plusDays-long-)で日付を1づつ加算して表を作るのをお勧めいたします。
66
68
 
67
69
 
68
70