JSliderをクリックするたびに、実際にクリックした場所にジャンプするのではなく、クリックの方向に1つのmajorTickが配置されます。(スライダーがポイント47にあり、5をクリックすると、5ではなく37にジャンプします)。JSlidersの使用中にこれを変更する方法はありますか、それとも別のデータ構造を使用する必要がありますか?
6269 次
3 に答える
17
これは奇妙に思えるかもしれませんが、実際には、この動作を制御するのはルック アンド フィールです。を見てください。BasicSliderUI
オーバーライドする必要があるメソッドは ですscrollDueToClickInTrack(int)
。
JSlider
の値を、ユーザーがトラック上でクリックした場所に最も近い値に設定するにはgetMousePosition()
、 の位置を考慮して、 から有効なトラック値へのマウス座標間の派手なパンツ変換を行う必要がありますComponent
。方向、サイズ、目盛り間の距離などです。幸いなことに、BasicSliderUI
これを行うための 2 つの便利な関数が用意されています:valueForXPosition(int xPos)
とvalueForYPosition(int yPos)
:
JSlider slider = new JSlider(JSlider.HORIZONTAL);
slider.setUI(new MetalSliderUI() {
protected void scrollDueToClickInTrack(int direction) {
// this is the default behaviour, let's comment that out
//scrollByBlock(direction);
int value = slider.getValue();
if (slider.getOrientation() == JSlider.HORIZONTAL) {
value = this.valueForXPosition(slider.getMousePosition().x);
} else if (slider.getOrientation() == JSlider.VERTICAL) {
value = this.valueForYPosition(slider.getMousePosition().y);
}
slider.setValue(value);
}
});
于 2009-02-06T00:46:43.570 に答える
3
この質問はちょっと古いですが、私はこの問題に出くわしました。これが私の解決策です:
JSlider slider = new JSlider(/* your options here if desired */) {
{
MouseListener[] listeners = getMouseListeners();
for (MouseListener l : listeners)
removeMouseListener(l); // remove UI-installed TrackListener
final BasicSliderUI ui = (BasicSliderUI) getUI();
BasicSliderUI.TrackListener tl = ui.new TrackListener() {
// this is where we jump to absolute value of click
@Override public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
int value = ui.valueForXPosition(p.x);
setValue(value);
}
// disable check that will invoke scrollDueToClickInTrack
@Override public boolean shouldScroll(int dir) {
return false;
}
};
addMouseListener(tl);
}
};
于 2009-06-01T20:50:33.083 に答える
-2
この動作は OS に由来します。再定義してユーザーを混乱させてもよろしいですか? 私はそうは思わない。;)
于 2009-02-09T07:49:25.280 に答える