Làm cách nào để tăng tốc độ cuộn trong JScrollPane khi sử dụng con lăn chuột?


94

Tôi thấy phương pháp JScrollPane.setWheelScrollingEnabled(boolean) để bật hoặc tắt cuộn con lăn chuột. Tuy nhiên, có cách nào để điều chỉnh tốc độ cuộn không? Theo ý kiến ​​của tôi, nó chậm chạp một cách lố bịch. Bất kể kích thước tôi tạo cửa sổ là bao nhiêu, khả năng cuộn là khoảng ba pixel cho mỗi lần nhấp. Tôi muốn nó còn hơn thế nữa.

Bất kỳ ý tưởng?


4
Lưu ý: Đối với bất kỳ ai đang tìm kiếm Java Script tương đương với điều này, hãy xem Tăng tốc bánh xe chuột trong jScrollPane (jQuery) .
Boann

Câu trả lời:


191

Bạn có thể thử điều này:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

2
Xinh đẹp. Tôi cũng nhận thấy điều này ảnh hưởng đến các mũi tên lên và xuống trong thanh cuộn, điều này cũng rất mong muốn.
Erick Robertson

1
@AlizainPrasla - khi khởi tạo bảng cuộn này.
StKiller

Làm thế nào bạn cũng sẽ làm cho điều này ảnh hưởng đến việc nhấp vào khu vực giữa hộp cuộn và các mũi tên lên hoặc xuống trong thanh cuộn?
Rune

@Rune - dường như thanh cuộn được đặt ở vị trí chuột, bỏ qua giá trị gia tăng đơn vị.
StKiller

@ AndreiPodoprîgora Bạn cần lưu ý rằng việc thay đổi giá trị này chỉ thay đổi tốc độ cuộn khi cuộn bằng con lăn chuột (hoặc một thiết bị khác cho phép cuộn), các phím mũi tên và mũi tên trên thanh cuộn. Giá trị này sẽ không ảnh hưởng đến tốc độ di chuyển của ngăn cuộn khi kéo núm thanh cuộn xung quanh. Rất khó để thay đổi giá trị này. Nếu bạn muốn đạt được điều này, bạn nên thêm trình nghe điều chỉnh tùy chỉnh vào thanh cuộn và thay đổi các giá trị của nó.
Tim Visée

12

Một cách sẽ là đặt gia số đơn vị của thanh cuộn thành một số lớn hơn:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

10

Nếu bạn muốn đặt số lượng cuộn của con lăn chuột không thấm vào đâu của đơn vị thanh cuộn, bạn có thể sử dụng Bộ điều khiển con lăn chuột .


Ưu đãi này có lợi gì mà tôi nên thêm một lớp bổ sung vào dự án của mình thay vì viết một dòng mã?
Erick Robertson

2
@ErickRobertson, nó chỉ nhằm mục đích cung cấp cho bạn sự linh hoạt hơn. Giá trị mặc định là cuộn gấp 3 lần giá trị tăng đơn vị. Ví dụ: với JTable, phần tăng đơn vị được mặc định là chiều cao hàng và do đó cuộn mặc định sẽ là 3 hàng. Nếu vì lý do nào đó, yêu cầu của bạn là cuộn một trang hoặc 5 hàng cùng một lúc, bạn không thể cuộn trang đó bằng cách chỉ thao tác giá trị đơn vị. Ngoài ra, chiều cao hàng mặc định có thể khác nhau đối với mỗi LAF. Bằng cách sử dụng số lượng cuộn trên cơ sở tương đối, bạn có hỗ trợ đa nền tảng tốt hơn.
camickr

Giá trị '3' (đơn vị để cuộn) đến từ bảng điều khiển hệ thống, được Java tôn vinh, cho phép bạn sửa đổi nó trên toàn hệ thống.
Luke Usherwood

9

Bạn có thể thực hiện việc này bằng cách đặt gia số đơn vị cho ScrollBar. Xem ví dụ.

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);


0

Tôi đang cố gắng tìm một phương pháp tốt hơn để đọc qua 32000 dòng trong ScrollPane của mình

thử cái này

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


0

Để kiểm soát chính xác hơn, thành phần đang được cuộn có thể triển khai giao diện Scrollable. Điều này cho phép bạn tính toán động kích thước đơn vị cuộn (nút mũi tên và phím mũi tên) và kích thước khối cuộn (con lăn chuột).

Cách sử dụng Scroll Panes


-1

Bạn cũng có thể sử dụng cái này.

SwingUtil.setScrollUnitIncrement(yourScrollPane);


hmm ... SwingUtil là gì? Giả sử phương thức đặt số gia của scrollPane đã cho - thành giá trị nào và cho scrollBar nào?
kleopatra

-1

Giải pháp của tôi để tăng tốc cuộn:

  1. Thêm thông số của thanh cuộn:

    scrollPane.getVerticalScrollBar (). putClientProperty ("JScrollBar.fastWheelScrolling", true);

  2. Triển khai trình nghe bánh xe (trên thành phần bên trong 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);
    }

    Sự gia tăng của wheelRotation là cần thiết: nếu không số lượng dòng cuộn sẽ bị giới hạn ở kích thước của màn hình.


Tôi đã sửa mã để các cờ SHIFT và CTRL bị loại bỏ để ngăn cuộn ngang. Tôi chắc chắn rằng những người jdk đã thêm cuộn ngang bằng phím shift vào jdk ngay sau bài đăng ban đầu của tôi. Người phản đối: vui lòng xóa lượt phản đối của bạn nếu giải pháp hiện đang phù hợp với bạn hoặc đăng nhận xét và giải thích những gì còn thiếu sót.
rychu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.