TITLE:JSplitPaneに2つのJTableを配置してスクロールを同期する
Posted by aterai at 2012-11-12

JSplitPaneに2つのJTableを配置してスクロールを同期する

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

概要

JSplitPaneの左右に、JTableをそれぞれ配置し、スクロールや追加などが同期するようにモデルを共有します。
SynchronizedScrollingTables.png

サンプルコード

#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
JScrollPane scroll1 = new JScrollPane(leftTable);
#spandel
//scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
#spanend
#spandel
scroll1.setVerticalScrollBar(new JScrollBar(JScrollBar.VERTICAL) {
#spanend
#spanadd
// scroll1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
#spanend
#spanadd
scroll1.setVerticalScrollBar(new JScrollBar(Adjustable.VERTICAL) {
#spanend
  @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());

解説

  • JTable
    • TableModelを共有し、JTable#removeColumn()で、それぞれで非表示にする列を指定
    • 左右でRowSorter、SelectionModelを共有
  • JScrollPane
    • それぞれ内部に配置するJTableの高さは、常に同じになるので、VerticalScrollBarのBoundedRangeModelを共有

解説

  • JTable
    • TableModelを共有しJTable#removeColumn(...)メソッドでそれぞれのJTableで非表示にする列を指定
    • 左右のJTableRowSorterSelectionModelを共有
  • JScrollPane
    • それぞれ内部に配置するJTableの高さは常に同じになるのでVerticalScrollBarBoundedRangeModelを共有
  • 制限
    • 例えば左JTableのセルを選択して行選択を開始した場合、右JTable上でのドラッグには反応しない

参考リンク

参考リンク

コメント

コメント