---
category: swing
folder: ScrollBarAsSlider
title: JScrollBarをJSliderとして使用する
tags: [JScrollBar, JSlider, JSpinner]
author: aterai
pubdate: 2008-12-15T13:23:29+09:00
description: JScrollBarをJSliderの代わりとして使用します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTSgYVysvI/AAAAAAAAAi4/5UjLktCUVb8/s800/ScrollBarAsSlider.png
hreflang:
    href: https://java-swing-tips.blogspot.com/2009/02/use-jscrollbar-as-jslider.html
    lang: en
---
* 概要 [#summary]
`JScrollBar`を`JSlider`の代わりとして使用します。

#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTSgYVysvI/AAAAAAAAAi4/5UjLktCUVb8/s800/ScrollBarAsSlider.png)

* サンプルコード [#sourcecode]
#code(link){{
int step   = 5;
int step = 5;
int extent = 20;
int min    = 0;
int max    = extent * 10; //200
int value  = 50;
int min = 0;
int max = extent * 10; // 200
int value = 50;
JScrollBar scrollbar = new JScrollBar(
  JScrollBar.HORIZONTAL, value, extent, min, max + extent);
scrollbar.setUnitIncrement(step);
scrollbar.getModel().addChangeListener(new ChangeListener() {
  @Override public void stateChanged(ChangeEvent e) {
    BoundedRangeModel m = (BoundedRangeModel) e.getSource();
    spinner.setValue(m.getValue());
  }
});
JSpinner spinner = new JSpinner(new SpinnerNumberModel(value, min, max, step));
}}

* 解説 [#explanation]
上記のサンプルでは、`JScrollBar`を`JSlider`として使用し、`JSpinner`と連動させています。

- `JScrollBar`に設定する最大値は、ノブ(`extent`はノブの幅)の右端ではなく左端になるように調整する必要がある
-- `JSpinner`の最大値とは異なり、`max`+`extent`の値が`JScrollBar`の最大値となる
-- `JSpinner`の最大値とは異なり`max`+`extent`の値が`JScrollBar`の最大値となる
- `JScrollBar`を使用することで`ArrowButton`での移動、設定によりマウスの中ボタンクリックで絶対位置移動などが可能になる
-- [[JScrollBarのトラック内でクリックした位置につまみを移動する>Swing/AllowsAbsolutePositioning]]
- 目盛りなどは自前で描画する必要がある
-- [[JScrollBarに検索結果をハイライト表示>Swing/ScrollBarSearchHighlighter]]

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JScrollBar.html JScrollBar (Java Platform SE 8)]
- [[JScrollBarのトラック内でクリックした位置につまみを移動する>Swing/AllowsAbsolutePositioning]]

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