• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JSplitPaneに2つのJTableを配置してスクロールを同期する
#navi(../)
RIGHT:Posted by [[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]
#code{{
* サンプルコード [#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 を使用
- [http://d.hatena.ne.jp/argius/20080325/1206454660 2つのJTableを同時にスクロール - argius note]
-- AdjustmentListener を使用
-- `ChangeListener`を使用し`1`つの`JScrollPane`に`JTable`を`2`つ配置
- [[JScrollPaneのスクロールを同期>Swing/SynchronizedScroll]]
-- `ChangeListener`を使用
- [http://argius.hatenablog.jp/entry/20080325/1206454660 2つのJTableを同時にスクロール - argius note]
-- `AdjustmentListener`が使用されている

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