Swing/CalendarViewTable のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/CalendarViewTable へ行く。
- 1 (2018-01-29 (月) 15:00:50)
- 2 (2018-01-29 (月) 16:16:31)
- 3 (2018-01-30 (火) 13:10:45)
- 4 (2018-02-01 (木) 20:21:48)
- 5 (2018-02-02 (金) 17:40:26)
- 6 (2018-02-02 (金) 20:11:40)
- 7 (2018-02-05 (月) 16:07:58)
- 8 (2018-02-15 (木) 14:23:42)
- 9 (2018-03-02 (金) 17:44:10)
- 10 (2018-03-13 (火) 16:29:32)
- 11 (2020-03-17 (火) 18:32:28)
- 12 (2021-09-24 (金) 14:51:03)
- 13 (2024-03-01 (金) 19:11:43)
- 14 (2024-09-05 (木) 20:43:02)
- category: swing
folder: CalendarViewTable
title: JTableにLocaleを考慮したLocalDateを適用してカレンダーを表示する
tags: [JTable, LocalDate, Locale, Calendar]
author: aterai
pubdate: 2018-01-29T14:57:32+09:00
description: JTableに週の最初の曜日がLocaleに応じて変化するカレンダーを表示します。
image: https://drive.google.com/uc?id=1jXZtiYFaA5ABWsdaRBnPUKqS2_VBDkFqQA
hreflang:
href: https://java-swing-tips.blogspot.com/2018/01/apply-localdate-considering-locale-to.html lang: en
概要
JTable
に週の最初の曜日がLocale
に応じて変化するカレンダーを表示します。
Screenshot
Advertisement
サンプルコード
class CalendarViewTableModel extends DefaultTableModel {
private final LocalDate startDate;
private final WeekFields weekFields = WeekFields.of(Locale.getDefault());
public CalendarViewTableModel(LocalDate date) {
super();
LocalDate firstDayOfMonth = YearMonth.from(date).atDay(1);
int dowv = firstDayOfMonth.get(weekFields.dayOfWeek()) - 1;
startDate = firstDayOfMonth.minusDays(dowv);
}
@Override public Class<?> getColumnClass(int column) {
return LocalDate.class;
}
@Override public String getColumnName(int column) {
return weekFields.getFirstDayOfWeek().plus(column)
.getDisplayName(TextStyle.SHORT_STANDALONE, Locale.getDefault());
}
@Override public int getRowCount() {
return 6;
}
@Override public int getColumnCount() {
return 7;
}
@Override public Object getValueAt(int row, int column) {
return startDate.plusDays(row * getColumnCount() + column);
}
@Override public boolean isCellEditable(int row, int column) {
return false;
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、Java 8
からjava.time
パッケージに追加されたLocalDate
をJTable
のモデルとして使用し、月のカレンダーを表示しています。
- WeekFields#getFirstDayOfWeek()メソッドで
Locale
に応じた週の最初の曜日を取得してJTable
の0
列目を設定- 例: 週の最初の曜日はロケールがフランスや
ISO-8601
標準の場合は月曜日、アラビアなら土曜日になる
- 例: 週の最初の曜日はロケールがフランスや
java -Duser.language=fr -jar example.jar
java -Duser.language=ar -jar example.jar
- 土曜と日曜の位置も
6
列目と0
列目固定ではないので、以下のようにLocalDate.getDayOfWeek()
メソッドで曜日を確認してその背景色を変更する必要がある
private class CalendarTableRenderer extends DefaultTableCellRenderer {
@Override public Component getTableCellRendererComponent(
JTable table, Object value, boolean selected, boolean focused,
int row, int column) {
super.getTableCellRendererComponent(table, value, selected, focused, row, column);
setHorizontalAlignment(SwingConstants.CENTER);
if (value instanceof LocalDate) {
LocalDate d = (LocalDate) value;
setText(String.valueOf(d.getDayOfMonth()));
if (YearMonth.from(d).equals(YearMonth.from(currentLocalDate))) {
setForeground(Color.BLACK);
} else {
setForeground(Color.GRAY);
}
DayOfWeek dow = d.getDayOfWeek();
if (d.isEqual(realLocalDate)) {
setBackground(new Color(220, 255, 220));
} else if (dow == DayOfWeek.SUNDAY) {
setBackground(new Color(255, 220, 220));
} else if (dow == DayOfWeek.SATURDAY) {
setBackground(new Color(220, 220, 255));
} else {
setBackground(Color.WHITE);
}
}
return this;
}
}
参考リンク
- WeekFields#getFirstDayOfWeek() (Java Platform SE 8)
- Local Date Combo « Java Tips Weblog
- JListで月のカーソルキー移動や、週を跨いた日付を範囲選択が可能なカレンダーを作成する
JTable
ではなく、JList
を使用すると上下カーソルキーで週を跨いだ日付の範囲選択が可能