2009-09-04 11 views
2

親にスクロールしないように。マウスカーソルが内側のJScrollPaneに触れると、スクロールイベントはそのJScrollPaneに渡され、最初のイベントによって処理されなくなったようです。つまり、「親」JScrollPaneのスクロールが停止します。JTextPaneのは、私は、オブジェクトの以下の「木」を持つJScrollPaneの

無効にすることは可能ですマウスホイールはJScrollPaneの内側にありますか? (textpaneは、テキストのみの1-3行が含まれているほとんどの時間)をスクロールし、より多くのコンテンツがある場合、それを有効にするには何も存在しない場合や、より良い、スクロールを無効?

答えて

9

また、私はこの厄介な問題に遭遇してきた、と私はテーブルとJTextAreas内でスクロールできるようにするために必要なのでSboddのソリューションは、私にとっては受け入れられません。私は行動がスクロール可能なコントロールの上にマウスが親スクロール、ページ全体のために、通常はスクロールペインをスクロールしていき、その後、制御底までそのコントロールをスクロールするブラウザと同じになりたかったです。

このクラスは、まさにそれを行います。通常のJScrollPaneの代わりに使用してください。それがあなたを助けることを願っています

/** 
* A JScrollPane that will bubble a mouse wheel scroll event to the parent 
* JScrollPane if one exists when this scrollpane either tops out or bottoms out. 
*/ 
public class PDControlScrollPane extends JScrollPane { 

public PDControlScrollPane() { 
    super(); 

    addMouseWheelListener(new PDMouseWheelListener()); 
} 

class PDMouseWheelListener implements MouseWheelListener { 

    private JScrollBar bar; 
    private int previousValue = 0; 
    private JScrollPane parentScrollPane; 

    private JScrollPane getParentScrollPane() { 
     if (parentScrollPane == null) { 
      Component parent = getParent(); 
      while (!(parent instanceof JScrollPane) && parent != null) { 
       parent = parent.getParent(); 
      } 
      parentScrollPane = (JScrollPane)parent; 
     } 
     return parentScrollPane; 
    } 

    public PDMouseWheelListener() { 
     bar = PDControlScrollPane.this.getVerticalScrollBar(); 
    } 
    public void mouseWheelMoved(MouseWheelEvent e) { 
     JScrollPane parent = getParentScrollPane(); 
     if (parent != null) { 
      /* 
      * Only dispatch if we have reached top/bottom on previous scroll 
      */ 
      if (e.getWheelRotation() < 0) { 
       if (bar.getValue() == 0 && previousValue == 0) { 
        parent.dispatchEvent(cloneEvent(e)); 
       } 
      } else { 
       if (bar.getValue() == getMax() && previousValue == getMax()) { 
        parent.dispatchEvent(cloneEvent(e)); 
       } 
      } 
      previousValue = bar.getValue(); 
     } 
     /* 
     * If parent scrollpane doesn't exist, remove this as a listener. 
     * We have to defer this till now (vs doing it in constructor) 
     * because in the constructor this item has no parent yet. 
     */ 
     else { 
      PDControlScrollPane.this.removeMouseWheelListener(this); 
     } 
    } 
    private int getMax() { 
     return bar.getMaximum() - bar.getVisibleAmount(); 
    } 
    private MouseWheelEvent cloneEvent(MouseWheelEvent e) { 
     return new MouseWheelEvent(getParentScrollPane(), e.getID(), e 
       .getWhen(), e.getModifiers(), 1, 1, e 
       .getClickCount(), false, e.getScrollType(), e 
       .getScrollAmount(), e.getWheelRotation()); 
    } 
} 
} 
+0

おかげで、これはまさに私がそれを望んでいたように動作します。 – exhuma

+0

ありがとう、チャンピオンのように動作します! – Satish

0

悲しいことに、明白な解決策(JScrollPane.setWheelScrollingEnabled(false))は実際にはMouseWheelEventsの登録を解除しないため、必要な効果を得られません。

ここMouseWheelEventsが外側にJScrollPaneに到達できるようになる完全にスクロール無効の粗製の-ハック方法です:

for (MouseWheelListener mwl : scrollPane.getMouseWheelListeners()) { 
    scrollPane.removeMouseWheelListener(mwl); 
} 

あなたがあなたの内にJScrollPaneにこれを行う場合は、ホイールイベントをスクロールする応じることは決してないだろう。外側のJScrollPaneはそれらすべてを取得します。あなたがそれをしたい場合は

「きれい」、あなた自身のScrollPaneUIを実装する必要があり、そのsetUIとするJScrollPaneのUIとして()に設定したいです。残念ながら、あなただけの、関連するメンバ変数がプライベートであり、そののMouseWheelListenerのScrollPaneUIのインストールの上の任意のフラグや警備員がないので、BasicScrollPaneUIを拡張し、そのマウスホイールリスナーを無効にすることはできません。

あなたの「より良い」解決策としては、ScrollPaneUIに入る時間よりも深く掘り下げて、スクロールバーを表示/非表示にするフックを見つけ、それらのポイントでMouseWheelListenerを追加/削除する必要があります。

希望に役立ちます!

1

@Nemiは既に良い解決策を持っています。

が、私は私のライブラリ内follwing方法を入れて、少しそれをさらに煮詰め:

static public void passMouseWheelEventsToParent(final Component pComponent, final Component pParent) { 
     pComponent.addMouseWheelListener((final MouseWheelEvent pE) -> { 
      pParent.dispatchEvent(new MouseWheelEvent(pParent, pE.getID(), pE.getWhen(), pE.getModifiers(), 1, 1, pE.getClickCount(), false, pE.getScrollType(), pE.getScrollAmount(), pE.getWheelRotation())); 
     }); 
} 
関連する問題