• title: JSliderの現在値に対応するラベルの文字色を変更する tags: [JSlider, JLabel] author: aterai pubdate: 2014-12-15T00:11:41+09:00 description: JSliderの大目盛りなどに設定した値ラベルが現在値を表すノブにもっとも近い場合、その色を変更します。

概要

JSliderの大目盛りなどに設定した値ラベルが現在値を表すノブにもっとも近い場合、その色を変更します。

サンプルコード

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

解説

上記のサンプルでは、JSliderBoundedRangeModelChangeListenerを追加し、ノブにもっとも近い値ラベルの文字色をハイライトするように設定しています。

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

コメント