概要

JTableで作成したカレンダーの日付が休日の場合はJLabelで作成した囲み数字に変更します。

サンプルコード

class EnclosedLabel extends JLabel {
  protected EnclosedLabel() {
    super("", SwingConstants.CENTER);
  }

  @Override public void updateUI() {
    super.updateUI();
    setBorder(BorderFactory.createEmptyBorder(2, 0, 3, 1));
  }

  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    d.width = 18;
    return d;
  }

  @Override protected void paintComponent(Graphics g) {
    if (!Objects.equals(getBackground(), Color.WHITE)) {
      Graphics2D g2 = (Graphics2D) g.create();
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setPaint(getBackground());
      g2.fill(getShape());
      g2.dispose();
    }
    super.paintComponent(g);
  }

  protected Shape getShape() {
    Dimension d = getSize();
    if (Objects.equals(getBackground(), Color.BLUE)) {
      return new Ellipse2D.Double(0d, 0d, d.width - 1d, d.height - 1d);
    } else {
      return new RoundRectangle2D.Double(0d, 0d, d.width - 1d, d.height - 1d, 5d, 5d);
    }
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JTableで作成したカレンダーの日付が日曜または祝日の場合はCUD(Color Universal Design)を考慮してラウンド矩形などで囲んだ数字(JLabelで作成)に変更しています。

  • 日曜、祝日
    • RoundRectangle2DJLabelの背景を黒塗りした日付を表示
    • Adobe-Japan1の文字コレクションにはaalt異体字でラウンド矩形の囲み数字が存在するがSwingコンポーネントではCIDでグリフを取得できないので利用不可
    • 祝日は日本の20207月のみ対応
  • 土曜
    • Ellipse2DJLabelの背景を塗りつぶして日付を丸付き数字で表示
    • Unicodeには①から㊿までの白丸数字のコードポイントは用意されているが黒丸数字は⓴までなのでカレンダーの日付にはそのまま利用しづらい

参考リンク

コメント