ฉันจะเพิ่มความเร็วในการเลื่อนใน JScrollPane ได้อย่างไรเมื่อใช้ล้อเลื่อนของเมาส์


96

ฉันเห็นวิธีJScrollPane.setWheelScrollingEnabled(boolean)การเปิดหรือปิดการเลื่อนล้อเลื่อนของเมาส์ มีวิธีใดในการปรับความเร็วของการเลื่อนหรือไม่? ในความคิดของฉันช้าอย่างน่าหัวเราะ ไม่ว่าฉันจะสร้างหน้าต่างขนาดใดการเลื่อนจะอยู่ที่ประมาณสามพิกเซลต่อคลิก ฉันอยากให้เป็นมากกว่านั้น

ความคิดใด ๆ ?


4
หมายเหตุ: สำหรับใครที่กำลังมองหา Java Scriptเทียบเท่านี้ดูความเร็วล้อเมาส์ใน JScrollPane (jQuery)
Boann

คำตอบ:


196

คุณสามารถลองสิ่งนี้:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

2
สวย. ฉันสังเกตว่าสิ่งนี้มีผลต่อลูกศรขึ้นและลงในแถบเลื่อนซึ่งเป็นที่ต้องการมากเช่นกัน
Erick Robertson

1
@AlizainPrasla - เมื่อเริ่มต้นแผงเลื่อนนี้
StKiller

คุณจะทำให้สิ่งนี้มีผลต่อการคลิกในพื้นที่ระหว่างกล่องเลื่อนและลูกศรขึ้นหรือลงในแถบเลื่อนอย่างไร
Rune

@Rune - ดูเหมือนว่าแถบเลื่อนถูกตั้งค่าไว้ที่ตำแหน่งเมาส์โดยไม่สนใจค่าการเพิ่มหน่วย
StKiller

@ AndreiPodoprîgoraคุณควรทราบว่าการเปลี่ยนค่านี้จะเปลี่ยนความเร็วในการเลื่อนเมื่อเลื่อนด้วยล้อเลื่อนของเมาส์ (หรืออุปกรณ์อื่นที่อนุญาตให้เลื่อนได้) ปุ่มลูกศรและลูกศรแถบเลื่อน ค่านี้จะไม่ส่งผลต่อความเร็วที่บานหน้าต่างเลื่อนกำลังเคลื่อนที่ไปด้วยเมื่อลากปุ่มแถบเลื่อนไปรอบ ๆ มันยากมากที่จะเปลี่ยนค่านี้ หากคุณต้องการบรรลุสิ่งนี้คุณควรเพิ่มตัวฟังการปรับแต่งแบบกำหนดเองลงในแถบเลื่อนและเปลี่ยนค่า
Tim Visée

12

วิธีหนึ่งคือการตั้งค่าการเพิ่มหน่วยของแถบเลื่อนเป็นจำนวนที่มากขึ้น:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

10

หากคุณต้องการที่จะตั้งล้อเมาส์เลื่อนจำนวน indepedent ของหน่วยแถบเลื่อน amout คุณสามารถใช้ล้อเมาส์ควบคุม


ข้อเสนอนี้มีข้อดีอะไรบ้างที่ฉันควรรวมคลาสพิเศษไว้ในโครงการแทนที่จะเขียนโค้ดบรรทัดเดียว
Erick Robertson

2
@ErickRobertson มันตั้งใจที่จะเพิ่มความยืดหยุ่นให้กับคุณ ค่าเริ่มต้นคือการเลื่อนเป็น 3 เท่าของค่าการเพิ่มหน่วย ตัวอย่างเช่นด้วย JTable ค่าเริ่มต้นการเพิ่มหน่วยเป็นความสูงของแถวและการเลื่อนเริ่มต้นจะเป็น 3 แถว หากด้วยเหตุผลบางประการความต้องการของคุณคือการเลื่อนทีละหน้าหรือครั้งละ 5 แถวคุณไม่สามารถทำได้โดยเพียงแค่จัดการกับมูลค่าหน่วย นอกจากนี้ความสูงของแถวเริ่มต้นอาจแตกต่างกันไปสำหรับแต่ละ LAF ด้วยการจัดการปริมาณการเลื่อนบนพื้นฐานที่สัมพันธ์กันคุณจะได้รับการสนับสนุนข้ามแพลตฟอร์มที่ดีขึ้น
camickr

ค่า '3' (หน่วยที่จะเลื่อน) มาจากแผงควบคุมระบบซึ่ง Java ให้เกียรติซึ่งช่วยให้คุณสามารถแก้ไขได้ทั้งระบบ
Luke Usherwood


2

ค้นหาอย่างรวดเร็วนำขึ้นหน้านี้: วิธีการเพิ่มความเร็วในการเลื่อน JScrollPane สำหรับผู้ใช้เมาส์วีล ปรากฎว่าการเพิ่มขึ้นของการเลื่อนเป็นคุณสมบัติของแถบเลื่อนเอง ( JScrollBar.setUnitIncrement) ไม่ใช่บานหน้าต่างเลื่อน


0

ฉันพยายามหาวิธีที่ดีกว่าในการอ่าน 32000 บรรทัดใน ScrollPane ของฉัน

ลองดู

scrollPane.getVerticalScrollBar().setUnitIncrement(100); scrollPane.getViewport().putClientProperty("EnableWindowBlit", Boolean.TRUE); scrollPane.getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);


0

เพื่อการควบคุมที่แม่นยำยิ่งขึ้นส่วนประกอบที่กำลังเลื่อนสามารถใช้อินเทอร์เฟซแบบเลื่อนได้ สิ่งนี้ช่วยให้คุณคำนวณขนาดหน่วยการเลื่อนแบบไดนามิก (ปุ่มลูกศรและปุ่มลูกศร) และขนาดบล็อกการเลื่อน (ล้อเลื่อนของเมาส์)

วิธีใช้ Scroll Panes


-1

คุณยังสามารถใช้สิ่งนี้

SwingUtil.setScrollUnitIncrement(yourScrollPane);


อืม ... SwingUtil คืออะไร? สมมติว่าวิธีการตั้งค่าการเพิ่มขึ้นของ scrollPane ที่กำหนด - เป็นค่าใดและสำหรับ scrollBar ใด
kleopatra

-1

วิธีแก้ปัญหาของฉันในการเร่งความเร็วในการเลื่อน:

  1. เพิ่มพารามิเตอร์ของแถบเลื่อน:

    scrollPane.getVerticalScrollBar (). putClientProperty ("JScrollBar.fastWheelScrolling" จริง);

  2. ติดตั้งตัวฟังล้อ (บนส่วนประกอบภายใน jViewport):

    public void mouseWheelMoved(MouseWheelEvent e) {
        boolean isCtrl = (e.getModifiersEx() & MouseWheelEvent.CTRL_DOWN_MASK) != 0;
        boolean isShift = (e.getModifiersEx() & MouseWheelEvent.SHIFT_DOWN_MASK) != 0;
    
        MouseWheelEvent eventToDispatch = e;
        if (isCtrl || isShift) {
            int amountMulti = 1;
            int rotMulti = 1;
            if (isCtrl) {
                amountMulti *= 10;
                if (isShift) {
                    amountMulti *= 5;
                    rotMulti *= 2;
                }
            }
            int mod = e.getModifiers() & ~InputEvent.CTRL_MASK & ~InputEvent.SHIFT_MASK;
            int modEx = e.getModifiersEx() & ~MouseWheelEvent.CTRL_DOWN_MASK & ~MouseWheelEvent.SHIFT_DOWN_MASK;
            eventToDispatch = new MouseWheelEvent(this, e.getID(), e.getWhen()
             , mod | modEx, e.getX(), e.getY()
             , e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger()
             , e.getScrollType(), e.getScrollAmount()*amountMulti, e.getWheelRotation()*rotMulti
             , e.getPreciseWheelRotation()*amountMulti*rotMulti);
        }
    
        getParent().dispatchEvent(eventToDispatch);
    }
    

    จำเป็นต้องเพิ่ม wheelRotation: มิฉะนั้นจำนวนเส้นที่เลื่อนจะถูก จำกัด ไว้ที่ขนาดของหน้าจอ


ฉันได้แก้ไขโค้ดเพื่อให้แฟล็ก SHIFT และ CTRL ถูกลบออกเพื่อป้องกันการเลื่อนในแนวนอน ฉันแน่ใจว่าพวก jdk ได้เพิ่มการเลื่อนแนวนอนด้วยปุ่ม shift ไปที่ jdk หลังจากโพสต์ต้นฉบับของฉัน Downvoters: โปรดลบ downvotes ของคุณหากตอนนี้วิธีแก้ปัญหาใช้ได้กับคุณหรือโพสต์ความคิดเห็นและอธิบายสิ่งที่ยังขาด
rychu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.