Swing/SynchronizedScroll のバックアップの現在との差分(No.17)
TITLE:JScrollPaneのスクロールを同期
Posted by aterai at 2004-04-05
JScrollPaneのスクロールを同期
2つのJScrollPaneのスクロールを同期します。- 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:
概要
2
つのJScrollPane
のスクロールを同期します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
サンプルコード
ChangeListener cl = new ChangeListener() {
boolean adjflg = false;
public void stateChanged(ChangeEvent e) {
private boolean adjflg;
@Override public void stateChanged(ChangeEvent e) {
JViewport src = null;
JViewport tgt = null;
if(e.getSource()==sp1.getViewport()) {
if (e.getSource() == sp1.getViewport()) {
src = sp1.getViewport();
tgt = sp2.getViewport();
}else if(e.getSource()==sp2.getViewport()) {
} else if (e.getSource() == sp2.getViewport()) {
src = sp2.getViewport();
tgt = sp1.getViewport();
}
if(adjflg || tgt==null || src==null) return;
if (adjflg || tgt == null || src == null) {
return;
}
adjflg = true;
Dimension dm1 = src.getViewSize();
Dimension sz1 = src.getSize();
Point pt1 = src.getViewPosition();
Dimension dm2 = tgt.getViewSize();
Dimension sz2 = tgt.getSize();
Point pt2 = tgt.getViewPosition();
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 = pt1.getY()/(dm1.getHeight()-sz1.getHeight())
*(dm2.getHeight()-sz2.getHeight());
pt1.y = (int)d;
d = pt1.getX()/(dm1.getWidth()-sz1.getWidth())
*(dm2.getWidth()-sz2.getWidth());
pt1.x = (int)d;
tgt.setViewPosition(pt1);
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;
}
};
#spanadd
sp1.getViewport().addChangeListener(cl);
#spanend
#spanadd
sp2.getViewport().addChangeListener(cl);
#spanend
View in GitHub: Java, Kotlin解説
上記のサンプルでは、一方のスクロールバーを移動させると、他方も同程度移動するように設定したChangeListenerを使用しています。解説
上記のサンプルでは、一方のスクロールバーを移動させると、他方も同程度の割合で移動するように設定したChangeListener
を使用しています。
内部コンポーネントのサイズが等しい場合は、参考リンクにあるように、ChangeListenerを共有するだけで、スクロールを同期することができます。
- -
-
JScrollPane
内部のコンポーネントのサイズが等しい場合はそれぞれの垂直・水平JScrollBar
で使用するBoundedRangeModel
を共有するだけでスクロールの同期が可能#spanend #spanadd sp2.getVerticalScrollBar().setModel(sp1.getVerticalScrollBar().getModel()); #spanend #spanadd sp2.getHorizontalScrollBar().setModel(sp1.getHorizontalScrollBar().getModel()); #spanend #spanadd
参考リンク
参考リンク
- ChangeListener (Java Platform SE 8)
- Swing (Archive) - link to scrollbar
- Swing (Archive) - Synchronizing scrollbars two scroll bars