Bagaimana cara mempercepat kecepatan gulir di JScrollPane saat menggunakan roda mouse?


94

Saya melihat metode JScrollPane.setWheelScrollingEnabled(boolean)untuk mengaktifkan atau menonaktifkan pengguliran roda mouse. Apakah ada cara untuk mengatur kecepatan pengguliran? Menurut pendapat saya, ini sangat lambat. Tidak peduli berapa ukuran jendela yang saya buat, penggulirannya sekitar tiga piksel per klik. Saya ingin lebih dari itu.

Ada ide?


4
Catatan: Untuk siapa pun yang mencari Java Script yang setara dengan ini, lihat Mempercepat roda mouse di jScrollPane (jQuery) .
Boann

Jawaban:


191

Anda bisa mencoba ini:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

2
Cantik. Saya juga memperhatikan ini mempengaruhi panah atas dan bawah di bilah gulir, yang juga sangat diinginkan.
Erick Robertson

1
@AlizainPrasla - saat menginisialisasi panel gulir ini.
StKiller

Bagaimana Anda juga membuat hal ini memengaruhi mengklik di area antara kotak gulir dan panah atas atau bawah di bilah gulir?
Rune

@ Rune - sepertinya scrollbar disetel ke posisi mouse, mengabaikan nilai kenaikan satuan.
StKiller

@ AndreiPodoprîgora Anda harus mencatat bahwa mengubah nilai ini hanya mengubah kecepatan gulir saat menggulir dengan roda mouse (atau perangkat lain yang memungkinkan pengguliran), tombol panah, dan panah bilah gulir. Nilai ini tidak akan memengaruhi kecepatan pergerakan panel gulir saat menyeret kenop bilah gulir. Sangat sulit untuk mengubah nilai ini. Jika Anda ingin mencapai ini, Anda harus menambahkan pendengar penyesuaian kustom ke bilah gulir dan mengubah nilainya.
Tim Visée

12

Salah satu caranya adalah dengan mengatur kenaikan unit scrollbar ke angka yang lebih besar:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

10

Jika Anda ingin mengatur jumlah gulir roda mouse terpisah dari unit bilah gulir, Anda dapat menggunakan Pengontrol Roda Mouse .


Keuntungan apa yang ditawarkan ini sehingga saya harus menyertakan kelas tambahan dalam proyek saya daripada menulis satu baris kode?
Erick Robertson

2
@ErickRobertson, itu hanya dimaksudkan untuk memberi Anda fleksibilitas tambahan. Standarnya adalah untuk pengguliran menjadi 3 kali nilai kenaikan satuan. Misalnya dengan JTable, kenaikan unit default ke tinggi baris dan pengguliran default akan menjadi 3 baris. Jika karena alasan tertentu kebutuhan Anda adalah menggulir halaman sekaligus atau 5 baris sekaligus, Anda tidak dapat melakukannya hanya dengan memanipulasi nilai satuan. Juga tinggi baris default mungkin berbeda untuk setiap LAF. Dengan memanipulasi jumlah gulir secara relatif, Anda memiliki dukungan lintas platform yang lebih baik.
camickr

Nilai '3' (units to scroll) berasal dari panel kontrol sistem, yang dijunjung oleh Java, memungkinkan Anda untuk memodifikasinya di seluruh sistem.
Luke Usherwood

9

Anda dapat melakukan ini dengan mengatur kenaikan unit untuk ScrollBar. Lihat contohnya.

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);


0

Saya mencoba menemukan metode yang lebih baik untuk membaca 32000 baris di ScrollPane saya

coba ini

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


0

Untuk kontrol yang lebih tepat, komponen yang di-scroll dapat mengimplementasikan antarmuka Scrollable. Ini memungkinkan Anda untuk menghitung secara dinamis ukuran unit gulir (tombol panah dan tombol panah) dan ukuran blok gulir (roda mouse).

Cara menggunakan Panel Gulir


-1

Anda juga bisa menggunakan ini.

SwingUtil.setScrollUnitIncrement(yourScrollPane);


hmm ... apa itu SwingUtil? Dengan asumsi metode menyetel kenaikan scrollPane yang diberikan - ke nilai yang mana dan untuk scrollBar yang mana?
kleopatra

-1

Solusi saya untuk mempercepat scroll:

  1. Tambahkan parameter scrollbar:

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

  2. Implementasikan wheel listener (pada komponen di dalam 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);
    }

    Peningkatan wheelRotation diperlukan: jika tidak, jumlah garis yang digulir akan dibatasi pada ukuran layar.


Saya telah memperbaiki kodenya sehingga bendera SHIFT dan CTRL dihapus untuk mencegah pengguliran horizontal. Saya yakin orang-orang jdk telah menambahkan scrolling horizontal dengan tombol shift ke jdk tepat setelah posting asli saya. Downvoters: harap hapus suara negatif Anda jika solusinya berfungsi untuk Anda sekarang atau kirim komentar dan jelaskan apa yang masih hilang.
rychu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.