概要

JSliderの最小値ラベルを左揃え、最大値ラベルを右揃えで表示するよう設定します。

サンプルコード

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();
    }
  }
}
View in GitHub: Java, Kotlin

解説

  • Default
  • JLayer
    • すべてのラベルに空白文字を設定して文字列は非表示で表示領域のみ確保
    • JLayerで最小値と最大値のラベルを独自に描画
      • 最小値ラベルのx軸方向座標は最小値目盛りに左揃えで配置
      • 最大値ラベルのx軸方向座標は最大値目盛りに右揃えで配置
      • それぞれのy軸方向座標はSliderUI#getBaseline(...)で取得可能なベースラインに合わせて配置
    • JSlider領域内にラベル文字列が配置されるので文字列の長さにトラックの長さが影響を受けない

参考リンク

コメント