Fare tekerleğini kullanırken JScrollPane'de kaydırma hızını nasıl hızlandırabilirim?


96

JScrollPane.setWheelScrollingEnabled(boolean)Fare tekerleği kaydırmayı etkinleştirme veya devre dışı bırakma yöntemini görüyorum . Yine de kaydırma hızını ayarlamanın bir yolu var mı? Bence gülünç derecede yavaş. Pencereyi hangi boyutta yaparsam yapayım, kaydırma tıklama başına yaklaşık üç pikseldir. Bundan çok daha fazlası olmasını isterim.

Herhangi bir fikir?


4
Not: Bunun Java Script eşdeğerini arayanlar için , bkz . JScrollPane (jQuery) 'de fare tekerleğini hızlandırma .
Boann

Yanıtlar:


196

Bunu deneyebilirsiniz:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

2
Güzel. Ayrıca bunun, kaydırma çubuğundaki yukarı ve aşağı okları da etkilediğini fark ettim ki bu da çok arzu ediliyor.
Erick Robertson

1
@AlizainPrasla - bu kaydırma panelini başlatırken.
StKiller

Kaydırma kutusu ile kaydırma çubuğundaki yukarı veya aşağı oklar arasındaki alana tıklamayı da nasıl etkilersiniz?
Rune

@Rune - kaydırma çubuğu, birim artış değerini göz ardı ederek fare konumuna ayarlanmış gibi görünüyor.
StKiller

@ AndreiPodoprîgora Bu değeri değiştirmenin, yalnızca bir fare tekerleği (veya kaydırmaya izin veren farklı bir cihaz), ok tuşları ve kaydırma çubuğu okları ile gezinirken kaydırma hızını değiştirdiğine dikkat etmelisiniz. Bu değer, kaydırma çubuğu düğmesini sürüklerken kaydırma bölmesinin hareket etme hızını etkilemez. Bu değeri değiştirmek çok zor. Bunu başarmak istiyorsanız, kaydırma çubuğuna özel ayarlama dinleyicileri eklemeli ve değerlerini değiştirmelisiniz.
Tim Visée

12

Bunun bir yolu, kaydırma çubuğunun birim artışını daha büyük bir sayıya ayarlamak olabilir:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

10

Fare tekerleği kaydırma miktarını kaydırma çubuğu biriminden bağımsız olarak ayarlamak isterseniz, Fare Tekerleği Denetleyicisini kullanabilirsiniz .


Bu, projeme bir satır kod yazmak yerine fazladan bir sınıf eklemem için ne gibi bir avantaj sağlar?
Erick Robertson

2
@ErickRobertson, sadece size daha fazla esneklik sağlamak niyetindeydi. Varsayılan, kaydırmanın birim artış değerinin 3 katı olmasıdır. Örneğin bir JTable ile birim artışı varsayılan olarak satır yüksekliğindedir ve bu nedenle varsayılan kaydırma 3 satır olacaktır. Herhangi bir nedenle gereksiniminiz bir sayfayı tek seferde veya 5 satır kaydırmaksa, sadece birim değerini değiştirerek buna gidemezsiniz. Ayrıca, her bir LAF için varsayılan satır yüksekliği farklı olabilir. Kaydırma miktarını göreceli olarak değiştirerek daha iyi çapraz platform desteğine sahip olursunuz.
camickr

'3' değeri (kaydırılacak birimler), Java'nın takdir ettiği sistem kontrol panelinden gelir ve bunu sistem genelinde değiştirmenize olanak tanır.
Luke Usherwood

9

Bunu, ScrollBar için birim artışını ayarlayarak yapabilirsiniz. Örneğe bakın.

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);


0

ScrollPane'imde 32000 satırı okumak için daha iyi bir yöntem bulmaya çalışıyordum

bunu dene

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


0

Daha hassas kontrol için, kaydırılan bileşen Kaydırılabilir arabirimi uygulayabilir. Bu, kaydırma birimi boyutunu (ok düğmeleri ve ok tuşları) ve kaydırma bloğu boyutunu (fare tekerleği) dinamik olarak hesaplamanıza olanak tanır.

Kaydırma Bölmeleri nasıl kullanılır


-1

Bunu da kullanabilirsiniz.

SwingUtil.setScrollUnitIncrement(yourScrollPane);


hmm ... SwingUtil nedir? Yöntemin verilen scrollPane artışını ayarladığını varsayarsak - hangi değere ve hangi scrollBar için?
kleopatra

-1

Kaydırmayı hızlandırmak için çözümüm:

  1. Kaydırma çubuğunun parametresini ekleyin:

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

  2. Bir tekerlek dinleyicisi uygulayın (jViewport içindeki bileşende):

    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'ın artırılması gereklidir: aksi takdirde, kaydırılan satırların sayısı ekranın boyutuyla sınırlı olacaktır.


Yatay kaydırmayı önlemek için SHIFT ve CTRL bayrakları kaldırılacak şekilde kodu düzelttim. Eminim jdk adamları, orijinal yazımdan hemen sonra jdk'ye shift tuşuyla yatay kaydırma eklediler. Olumsuz oy verenler: Çözüm şu anda sizin için çalışıyorsa, lütfen olumsuz oylarınızı kaldırın veya bir yorum gönderin ve neyin eksik olduğunu açıklayın.
rychu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.