最小値が0、最大値が100のJSliderがあります。JSliderが最初に起動したときの値は0です。
これで、50、さらには20または100でマウスをクリックしても、JSliderはクリックした場所に移動しません。右に少しジャンプするだけです。
クリックしたものに値が表示されるようにするにはどうすればよいですか?
最小値が0、最大値が100のJSliderがあります。JSliderが最初に起動したときの値は0です。
これで、50、さらには20または100でマウスをクリックしても、JSliderはクリックした場所に移動しません。右に少しジャンプするだけです。
クリックしたものに値が表示されるようにするにはどうすればよいですか?
これが、必要なことを行うクラスの始まりです。
一般的な考え方は、ユーザーがクリックした場所を検出し、その新しいスライダーの位置に合わせるために必要な値のオフセットを計算することです。
// 'E' stands for enhanced
public class EJSlider extends JSlider {
public EJSlider() {
super();
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
double percent = p.x / ((double) getWidth());
int range = getMaximum() - getMinimum();
double newVal = range * percent;
int result = (int)(getMinimum() + newVal);
setValue(result);
}
});
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new EJSlider());
f.pack();
f.setVisible(true);
}
}
サンプルを実行するだけです。スライダーは、マウスをクリックした場所にジャンプします。これは十分にテストされておらず、垂直スライダーではまだ動作しません。
これと同様の解決策は、その機能が必要なものに私のカスタムMouseListener
を追加するJSlider
ことです。
(注: まだ完璧ではないことはわかっていますが、良いスタートです。)
BasicSliderUIは、 valueForXPositionというメソッドを提供します。
x 位置の値を返します。xPos が左または右のトラックを超えている場合、このメソッドは、スライダーが反転しているかどうかに応じて、値をスライダーの最小値または最大値に設定します。
(垂直スライダーの場合はvalueForYPositionを使用)
valueForXPosition を使用して水平方向の JSlider に MouseListener を追加する例:
JSlider slider = new JSlider();
slider.setOrientation(JSlider.HORIZONTAL);
slider.setMinimum(0);
slider.setMaximum(100);
slider.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JSlider sourceSlider=(JSlider)e.getSource();
BasicSliderUI ui = (BasicSliderUI)sourceSlider.getUI();
int value = ui.valueForXPosition( e.getX() );
slider.setValue(value);
}
});