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?

Erick Robertson
sumber
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);
StKiller
sumber
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);
Jeff
sumber
10

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

camickr.dll
sumber
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);
Michael de Jong
sumber
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);

DrHales
sumber
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

Brad Mace
sumber
-1

Anda juga bisa menggunakan ini.

SwingUtil.setScrollUnitIncrement(yourScrollPane);

pengguna2287966
sumber
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.

rychu
sumber
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