• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: UpdateSliderLabel
title: JSliderの数値テキストラベルを更新する
tags: [JSlider, JLabel]
author: aterai
pubdate: 2015-02-23T00:36:42+09:00
description: JSliderの数値テキストラベルの値を変更した場合、その位置やサイズが正しく描画されるように更新を行うメソッドを実行します。
image: https://lh5.googleusercontent.com/-xP4QgpDpRec/VOn2C7a0GLI/AAAAAAAANxQ/HQ3F4rVgoUI/s800/UpdateSliderLabel.png
---
* 概要 [#summary]
`JSlider`の数値テキストラベルの値を変更した場合、その位置やサイズが正しく描画されるように更新を行うメソッドを実行します。

#download(https://lh5.googleusercontent.com/-xP4QgpDpRec/VOn2C7a0GLI/AAAAAAAANxQ/HQ3F4rVgoUI/s800/UpdateSliderLabel.png)

* サンプルコード [#sourcecode]
#code(link){{
JSlider slider = new JSlider(0, 10000);
slider.putClientProperty("Slider.paintThumbArrowShape", Boolean.TRUE);
slider.setMajorTickSpacing(2500);
slider.setMinorTickSpacing(500);
slider.setPaintLabels(true);
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
//slider.setBorder(BorderFactory.createLineBorder(Color.WHITE, 10));
// slider.setBorder(BorderFactory.createLineBorder(Color.WHITE, 10));
Dictionary<?, ?> labelTable = slider.getLabelTable();
Enumeration<?> ed = labelTable.keys();
while (ed.hasMoreElements()) {
  Integer i = (Integer) ed.nextElement();
  JLabel label = (JLabel) labelTable.get(i);
  label.setText(String.valueOf(i / 100));
}
Collections.list(labelTable.keys()).stream()
    .filter(Integer.class::isInstance)
    .map(Integer.class::cast)
    .forEach(i -> {
      JLabel label = (JLabel) labelTable.get(i);
      label.setText(Objects.toString(i / 100));
    });
slider.setLabelTable(labelTable);
}}

* 解説 [#explanation]
- `Default`
-- 最小`0`、最大`10000`で作成した`JSlider`のラベルを、その`1/100`で表示
-- 各ラベルの文字数が変更されても、その幅が更新されないので、目盛り中央に数字(文字列)が配置されない
-- `NimbusLookAndFeel`などで、最大値の`100`が見切れて、`10`までしか表示されない
-- 最小`0`、最大`10000`で作成した`JSlider`のラベルをその`1/100`で表示
-- 各ラベルの文字数が変更されてもその幅が更新されないので目盛り中央に数字(文字列)が配置されない
-- `NimbusLookAndFeel`などで最大値の`100`が見切れて`10`までしか表示されない
- `JSlider#updateLabelUIs()`
-- `1/100`に変更後、`JSlider#updateLabelUIs()`を実行して、ラベルを更新する
-- `JSlider#updateLabelUIs()`は、`protected`なので、内部でこれを呼び出している`JSlider#setLabelTable(...)`を実行する
-- `1/100`に変更後、`JSlider#updateLabelUIs()`を実行してラベルを更新する
-- `JSlider#updateLabelUIs()`は`protected`なので内部でこれを呼び出している`JSlider#setLabelTable(...)`を実行する
-- `JSlider#updateUI()`内でも`JSlider#updateLabelUIs()`を呼び出しているので、代わりに`SwingUtilities.updateComponentTreeUI(slider);`を実行しても可

* 参考リンク [#reference]
- [https://stackoverflow.com/questions/28491041/jslider-is-drawn-incomplete-working-with-netbeans java - JSlider is drawn incomplete, Working with Netbeans - Stack Overflow]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JSlider.html#updateLabelUIs-- JSlider#updateLabelUIs() (Java Platform SE 8)]

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