سؤال

وكلما كنت فوق JSlider يحصل على وضع واحد majorTick في اتجاه النقر بدلا من القفز إلى بقعة I انقر الواقع. (إذا المنزلق هو في مرحلة 47 و I انقر 5 أنها سوف تقفز إلى 37 بدلا من 5). هل هناك أي طريقة لتغيير هذا أثناء استخدام JSliders، أو لا بد لي من استخدام بنية بيانات أخرى؟

هل كانت مفيدة؟

المحلول

وكما غريب لأن ذلك قد يبدو، انها فعلا الشكل والمظهر التي تسيطر على هذا السلوك. نلقي نظرة على BasicSliderUI، الطريقة التي تحتاج إلى تجاوز هو <وأ href = "http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/plaf/basic/BasicSliderUI.html #scrollDueToClickInTrack (دولي) "يختلط =" noreferrer "> scrollDueToClickInTrack(int) .

في أجل تعيين قيمة JSlider إلى أقرب قيمة إلى حيث ينقر المستخدم على الطريق، وكنت بحاجة إلى القيام ببعض السراويل يتوهم الترجمة بين الماوس تنسق من getMousePosition() إلى قيمة المسار صالحة، مع الأخذ بعين الاعتبار موقف Component، انها التوجه، وحجم والمسافة بين القراد <م> الخ . لحسن الحظ، BasicSliderUI يعطينا اثنين من وظائف مفيدة للقيام بذلك: <لأ href = "http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/plaf/basic/BasicSliderUI.html#valueForXPosition (دولي) "يختلط =" noreferrer "> valueForXPosition(int xPos) و <لأ href =" http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/plaf/basic/BasicSliderUI هتمل # valueForYPosition (دولي) "يختلط =" noreferrer "> 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);
    }
};

ويستمد هذا السلوك من نظام التشغيل. هل أنت متأكد أنك تريد إعادة تعريفه والخلط بين المستخدمين؟ لا أعتقد ذلك. ؛)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top