• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: SliderCurrentLabelColor
title: JSliderの現在値に対応するラベルの文字色を変更する
tags: [JSlider, JLabel, ChangeListener, BoundedRangeModel]
author: aterai
pubdate: 2014-12-15T00:11:41+09:00
description: JSliderの大目盛りなどに設定した値ラベルが現在値を表すノブにもっとも近い場合、その色を変更します。
image: https://lh3.googleusercontent.com/-QQwUIqqviTE/VI2lBcawp1I/AAAAAAAANtA/VWJPpQJoyyo/s800/SliderCurrentLabelColor.png
hreflang:
    href: https://java-swing-tips.blogspot.com/2016/06/change-color-of-label-represents.html
    lang: en
---
* 概要 [#summary]
`JSlider`の大目盛りなどに設定した値ラベルが現在値を表すノブにもっとも近い場合、その色を変更します。

#download(https://lh3.googleusercontent.com/-QQwUIqqviTE/VI2lBcawp1I/AAAAAAAANtA/VWJPpQJoyyo/s800/SliderCurrentLabelColor.png)

* サンプルコード [#sourcecode]
#code(link){{
slider.getModel().addChangeListener(new ChangeListener() {
  private int prev = -1;
  private void resetForeground(Object o, Color c) {
    if (o instanceof Component) {
      ((Component) o).setForeground(c);
    }
  }

  @Override public void stateChanged(ChangeEvent e) {
    BoundedRangeModel m = (BoundedRangeModel) e.getSource();
    int i = m.getValue();
    if ((slider.getMajorTickSpacing() == 0 ||
         i % slider.getMajorTickSpacing() == 0) && i != prev) {
      Dictionary dictionary = slider.getLabelTable();
      resetForeground(dictionary.get(i), Color.RED);
      resetForeground(dictionary.get(prev), Color.BLACK);
      slider.repaint();
      prev = i;
    }
  }
});
}}

* 解説 [#explanation]
上記のサンプルでは、`JSlider`の`BoundedRangeModel`に`ChangeListener`を追加し、ノブにもっとも近い値ラベルの文字色をハイライトするように設定しています。

- 上: デフォルト
- 中: `setMajorTickSpacing(10)`
-- 現在値をハイライトするための`ChangeListener`を追加
-- 現在値が大目盛りになったら(`model.getValue() % slider.getMajorTickSpacing() == 0`)、対応する`JLabel`を`JSlider#getLabelTable()`から取得して、文字色を変更
-- 現在値が大目盛りになったら(`model.getValue() % slider.getMajorTickSpacing() == 0`)に対応する`JLabel`を`JSlider#getLabelTable()`から取得して文字色を変更
- 下: `setMajorTickSpacing(0)`
-- 現在値をハイライトするための`ChangeListener`を追加
-- 現在値(`slider.getMajorTickSpacing()`が`0`なので)に対応する`JLabel`を`JSlider#getLabelTable()`から取得して、文字色を変更
-- `slider.getMajorTickSpacing()`が`0`なので現在値に対応する`JLabel`を`JSlider#getLabelTable()`から取得してその文字色を変更

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JSlider.html#getLabelTable-- JSlider#getLabelTable() (Java Platform SE 8)]

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