• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JSplitPaneに2つのJTableを配置してスクロールを同期する
#navi(../)
#tags(JTable, JScrollPane, JScrollBar, JSplitPane)
RIGHT:Posted by &author(aterai); at 2012-11-12
*JSplitPaneに2つのJTableを配置してスクロールを同期する [#i455f67c]
``JSplitPane``の左右に、``JTable``をそれぞれ配置し、スクロールや追加などが同期するようにモデルを共有します。
---
category: swing
folder: SynchronizedScrollingTables
title: JSplitPaneに2つのJTableを配置してスクロールを同期する
tags: [JTable, JScrollPane, JScrollBar, JSplitPane]
author: aterai
pubdate: 2012-11-12T02:37:41+09:00
description: JSplitPaneの左右に、JTableをそれぞれ配置し、スクロールや追加などが同期するようにモデルを共有します。
image: https://lh4.googleusercontent.com/-mAnvPJlUJSI/UJ_bYI_kJsI/AAAAAAAABWo/a_jdyUqFLwM/s800/SynchronizedScrollingTables.png
---
* 概要 [#summary]
`JSplitPane`の左右に、`JTable`をそれぞれ配置し、スクロールや追加などが同期するようにモデルを共有します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh4.googleusercontent.com/-mAnvPJlUJSI/UJ_bYI_kJsI/AAAAAAAABWo/a_jdyUqFLwM/s800/SynchronizedScrollingTables.png)

//#screenshot
#ref(https://lh4.googleusercontent.com/-mAnvPJlUJSI/UJ_bYI_kJsI/AAAAAAAABWo/a_jdyUqFLwM/s800/SynchronizedScrollingTables.png)

**サンプルコード [#s244a26b]
* サンプルコード [#sourcecode]
#code(link){{
JScrollPane scroll1 = new JScrollPane(leftTable);
//scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
scroll1.setVerticalScrollBar(new JScrollBar(JScrollBar.VERTICAL) {
// scroll1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scroll1.setVerticalScrollBar(new JScrollBar(Adjustable.VERTICAL) {
  @Override public Dimension getPreferredSize() {
    Dimension dim = super.getPreferredSize();
    return new Dimension(0, dim.height);
  }
});
JScrollPane scroll2 = new JScrollPane(table);
scroll2.getVerticalScrollBar().setModel(scroll1.getVerticalScrollBar().getModel());
}}

**解説 [#d56365ac]
- ``JTable``
-- ``TableModel``を共有し、``JTable#removeColumn()``で、それぞれで非表示にする列を指定
-- 左右で``RowSorter``、``SelectionModel``を共有
- ``JScrollPane``
-- それぞれ内部に配置する``JTable``の高さは、常に同じになるので、``VerticalScrollBar``の``BoundedRangeModel``を共有
* 解説 [#explanation]
- `JTable`
-- `TableModel`を共有し`JTable#removeColumn(...)`メソッドでそれぞれの`JTable`で非表示にする列を指定
-- 左右の`JTable`で`RowSorter`と`SelectionModel`を共有
- `JScrollPane`
-- それぞれ内部に配置する`JTable`の高さは常に同じになるので`VerticalScrollBar`の`BoundedRangeModel`を共有
- 制限
-- 例えば左`JTable`のセルを選択して行選択を開始した場合、右`JTable`上でのドラッグには反応しない

**参考リンク [#g8d15937]
* 参考リンク [#reference]
- [[JTableの列固定とソート>Swing/FixedColumnTableSorting]]
-- ``ChangeListener``を使用、1つの``JScrollPane``に、``JTable``を2つ配置
-- `ChangeListener`を使用し`1`つの`JScrollPane`に`JTable`を`2`つ配置
- [[JScrollPaneのスクロールを同期>Swing/SynchronizedScroll]]
-- ``ChangeListener``を使用
- [http://d.hatena.ne.jp/argius/20080325/1206454660 2つのJTableを同時にスクロール - argius note]
-- ``AdjustmentListener``を使用
-- `ChangeListener`を使用
- [http://argius.hatenablog.jp/entry/20080325/1206454660 2つのJTableを同時にスクロール - argius note]
-- `AdjustmentListener`が使用されている

**コメント [#qe8b0ef4]
* コメント [#comment]
#comment
#comment