---
category: swing
folder: SliderLabelAlignment
title: JSliderの最小・最大値を表示するLabelの揃えを変更する
tags: [JSlider, JLayer]
author: aterai
pubdate: 2023-07-17T02:20:18+09:00
description: JSliderの最小値ラベルを左揃え、最大値ラベルを右揃えで表示するよう設定します。
image: https://drive.google.com/uc?id=1Z1V476NL7dZqvYL-kIqpWcKp7yYjvOfl
---
* 概要 [#summary]
`JSlider`の最小値ラベルを左揃え、最大値ラベルを右揃えで表示するよう設定します。

#download(https://drive.google.com/uc?id=1Z1V476NL7dZqvYL-kIqpWcKp7yYjvOfl)

* サンプルコード [#sourcecode]
#code(link){{
class SliderLabelLayerUI extends LayerUI<JSlider> {
  private final JLabel min = new JLabel("Short");
  private final JLabel max = new JLabel("Long");

  @Override public void paint(Graphics g, JComponent c) {
    super.paint(g, c);
    if (c instanceof JLayer) {
      JSlider s = (JSlider) ((JLayer<?>) c).getView();
      Graphics2D g2 = (Graphics2D) g.create();
      Dimension d = c.getSize();
      Dimension d2 = min.getPreferredSize();
      FontMetrics fm = s.getFontMetrics(s.getFont());
      int yy = s.getUI().getBaseline(s, d.width, d.height) - fm.getAscent();
      int xx = 2;
      int w2 = d2.width;
      int h2 = d2.height;
      SwingUtilities.paintComponent(g2, min, s, xx, yy, w2, h2);
      Dimension d3 = max.getPreferredSize();
      int w3 = d3.width;
      int h3 = d3.height;
      SwingUtilities.paintComponent(g2, max, s, d.width - w3 - xx, yy, w3, h3);
      g2.dispose();
    }
  }
}
}}

* 解説 [#explanation]
- `Default`
-- 最小値のラベルを`Short`、最大値のラベルを`Long`と数値ではなく文字列に変更
-- 最小値と最大値のラベルを数値ではなく、それぞれ文字列の`Short`と`Long`に変更
--- [[JSliderの目盛にアイコンや文字列を追加する>Swing/SliderLabelTable]]
-- 目盛りがラベル文字列の中央になるよう配置される
--- [[JSliderの数値テキストラベルを更新する>Swing/UpdateSliderLabel]]
- `JLayer`
-- すべてのラベルに空白文字を設定して文字列は非表示で表示領域のみ確保
-- `JLayer`で最小値と最大値のラベルを独自に描画
--- 最小値ラベルの`x`軸方向座標は最小値目盛りに左揃えで配置
--- 最大値ラベルの`x`軸方向座標は最大値目盛りに右揃えで配置
--- それぞれの`y`軸方向座標は`SliderUI#getBaseline(...)`で取得可能なベースラインに合わせて配置
-- `JSlider`領域内にラベル文字列が配置されるので文字列の長さにトラックの長さが影響を受けない

* 参考リンク [#reference]
- [[JSliderの目盛にアイコンや文字列を追加する>Swing/SliderLabelTable]]
- [[JSliderの数値テキストラベルを更新する>Swing/UpdateSliderLabel]]

* コメント [#comment]
#comment
#comment