JSlider 질문:좌클릭 후 위치
-
21-08-2019 - |
문제
JSlider를 클릭할 때마다 실제로 클릭한 지점으로 점프하는 대신 클릭 방향으로 하나의 majorTick이 배치됩니다.(슬라이더가 지점 47에 있고 5를 클릭하면 5 대신 37로 이동합니다.)JSliders를 사용하는 동안 이를 변경할 수 있는 방법이 있습니까? 아니면 다른 데이터 구조를 사용해야 합니까?
해결책
이상하게 보일 수도 있지만 실제로 이 동작을 제어하는 것은 Look and Feel입니다.보세요 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