JSliderの質問:位置leftclick
-
21-08-2019 - |
質問
これをクリックしJSliderで位置づけにつmajorTickの方向をクリックの代わりにジャンプ、スポットかをクリックします。(スライダーが点47かをクリック5だそうでジャンプには37の代わりに5).方法はありますことをJSliders、を使用しなければいけないもdatastructure?
解決
として奇妙なことという見方もあるかもしれないが、これは実際に見て感じることである。見 BasicSliderUI
, 方法は、必要なものはオーバーライド scrollDueToClickInTrack(int)
.
するための値を設定します JSlider
最寄りの価値のユーザーをクリックするかが一定になるように派手なパンツの翻訳、マウスの座標から getMousePosition()
有効なトラック値を考慮の位置 Component
, ではティングソリューションとの距離とダニ など.幸運なことに、 BasicSliderUI
くつ便利な機能このためには: 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);
}
});
他のヒント
この質問は、昔のようなものですが、私は自分自身この問題に出くわしました。これは私のソリューションです:
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);
}
};
この動作は、OSに由来しています。あなたはそれを再定義し、ユーザーを混乱させるしてもよろしいですか?私はそうは思いません。 ;)
所属していません StackOverflow