Swing/SynchronizedScroll の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/SynchronizedScroll へ行く。
- Swing/SynchronizedScroll の差分を削除
--- category: swing folder: SynchronizedScroll title: JScrollPaneのスクロールを同期 tags: [JScrollPane, ChangeListener, JScrollBar, BoundedRangeModel] author: aterai pubdate: 2004-04-05T03:13:08+09:00 description: 2つのJScrollPaneのスクロールを同期します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTT_c3UmrI/AAAAAAAAAlU/adQEhxZ2FXc/s800/SynchronizedScroll.png --- * 概要 [#summary] `2`つの`JScrollPane`のスクロールを同期します。 #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTT_c3UmrI/AAAAAAAAAlU/adQEhxZ2FXc/s800/SynchronizedScroll.png) * サンプルコード [#sourcecode] #code(link){{ ChangeListener cl = new ChangeListener() { private boolean adjflg; @Override public void stateChanged(ChangeEvent e) { JViewport src = null; JViewport tgt = null; if (e.getSource() == sp1.getViewport()) { src = sp1.getViewport(); tgt = sp2.getViewport(); } else if (e.getSource() == sp2.getViewport()) { src = sp2.getViewport(); tgt = sp1.getViewport(); } if (adjflg || tgt == null || src == null) { return; } adjflg = true; Dimension dim1 = src.getViewSize(); Dimension siz1 = src.getSize(); Point pnt1 = src.getViewPosition(); Dimension dim2 = tgt.getViewSize(); Dimension siz2 = tgt.getSize(); // Point pnt2 = tgt.getViewPosition(); double d; d = pnt1.getY() / (dim1.getHeight() - siz1.getHeight()) * (dim2.getHeight() - siz2.getHeight()); pnt1.y = (int) d; d = pnt1.getX() / (dim1.getWidth() - siz1.getWidth()) * (dim2.getWidth() - siz2.getWidth()); pnt1.x = (int) d; tgt.setViewPosition(pnt1); adjflg = false; } }; sp1.getViewport().addChangeListener(cl); sp2.getViewport().addChangeListener(cl); }} * 解説 [#explanation] 上記のサンプルでは、一方のスクロールバーを移動させると、他方も同程度の割合で移動するように設定した`ChangeListener`を使用しています。 ---- - `JScrollPane`内部のコンポーネントのサイズが等しい場合は、それぞれの垂直・水平`JScrollBar`で使用する`BoundedRangeModel`を共有するだけでスクロールの同期が可能 - `JScrollPane`内部のコンポーネントのサイズが等しい場合はそれぞれの垂直・水平`JScrollBar`で使用する`BoundedRangeModel`を共有するだけでスクロールの同期が可能 #code{{ sp2.getVerticalScrollBar().setModel(sp1.getVerticalScrollBar().getModel()); sp2.getHorizontalScrollBar().setModel(sp1.getHorizontalScrollBar().getModel()); }} * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/event/ChangeListener.html ChangeListener (Java Platform SE 8)] - [https://community.oracle.com/thread/1502596 Swing (Archive) - link to scrollbar] - [https://community.oracle.com/thread/1484489 Swing (Archive) - Synchronizing scrollbars two scroll bars] * コメント [#comment] #comment #comment