문제

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에서 파생됩니다. 재정의하고 사용자를 혼동하고 싶습니까? 나는 그렇게 생각하지 않습니다. ;)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top