• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JSplitPaneでディバイダの移動を連続的に再描画
#navi(../)
#tags(JSplitPane, PropertyChangeListener)
RIGHT:Posted by &author(aterai); at 2010-07-12
*JSplitPaneでディバイダの移動を連続的に再描画 [#yf39f801]
二つの``JSplitPane``のディバイダで、移動の同期と連続的な再描画を行います。
---
category: swing
folder: ContinuousLayout
title: JSplitPaneでディバイダの移動を連続的に再描画
tags: [JSplitPane, Divider, PropertyChangeListener]
author: aterai
pubdate: 2010-07-12T15:30:54+09:00
description: 二つのJSplitPaneのディバイダで、移動の同期と連続的な再描画を行います。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTKL-SYs6I/AAAAAAAAAVk/pXv9HlMSLf0/s800/ContinuousLayout.png
---
* 概要 [#summary]
二つの`JSplitPane`のディバイダで、移動の同期と連続的な再描画を行います。

-&jnlp;
-&jar;
-&zip;
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTKL-SYs6I/AAAAAAAAAVk/pXv9HlMSLf0/s800/ContinuousLayout.png)

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTKL-SYs6I/AAAAAAAAAVk/pXv9HlMSLf0/s800/ContinuousLayout.png)

**サンプルコード [#y4c52198]
* サンプルコード [#sourcecode]
#code(link){{
final JSplitPane leftPane   = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
final JSplitPane rightPane  = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
final JSplitPane centerPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
JSplitPane leftPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
JSplitPane rightPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
JSplitPane centerPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);

leftPane.setTopComponent(new JScrollPane(new JTextArea("aaaaaaa")));
leftPane.setBottomComponent(new JScrollPane(new JTextArea("bbbb")));
rightPane.setTopComponent(new JScrollPane(new JTree()));
rightPane.setBottomComponent(new JScrollPane(new JTree()));
centerPane.setLeftComponent(leftPane);
centerPane.setRightComponent(rightPane);

leftPane.setResizeWeight(.5);
rightPane.setResizeWeight(.5);
centerPane.setResizeWeight(.5);

PropertyChangeListener pcl = new PropertyChangeListener() {
  @Override public void propertyChange(PropertyChangeEvent e) {
    if(JSplitPane.DIVIDER_LOCATION_PROPERTY.equals(e.getPropertyName())) {
      JSplitPane source = (JSplitPane)e.getSource();
      int location = ((Integer)e.getNewValue()).intValue();
      JSplitPane target = (source==leftPane)?rightPane:leftPane;
      if(location != target.getDividerLocation())
    if (JSplitPane.DIVIDER_LOCATION_PROPERTY.equals(e.getPropertyName())) {
      JSplitPane source = (JSplitPane) e.getSource();
      int location = ((Integer) e.getNewValue()).intValue();
      JSplitPane target = (source == leftPane) ? rightPane : leftPane;
      if (location != target.getDividerLocation())
          target.setDividerLocation(location);
    }
  }
};
leftPane.addPropertyChangeListener(pcl);
rightPane.addPropertyChangeListener(pcl);
}}

**解説 [#wbd6d421]
上記のサンプルでは、``JSplitPane``を3つ使用して、4つのコンポーネントを分割表示しています。
* 解説 [#explanation]
上記のサンプルでは、各`JSplitPane`に`JSplitPane#setContinuousLayout(true)`を設定し、ディバイダの移動に応じて子コンポーネントを連続的に再描画しています。

----
左右に配置されたディバイダが、同期して移動するように以下のように設定しています。
- `JSplitPane`を`3`つ使用し`4`つに分割された領域を表示
- 左右に配置されたディバイダがマウスのドラッグに同期して移動するように以下を設定
-- 片方のディバイダが上下移動したら残りも移動するように`PropertyChangeListener`を追加
-- `JSplitPane#setContinuousLayout(true)`を設定して移動を連続的に再描画

-片方のディバイダが上下移動したら、残りも移動するように``PropertyChangeListener``を追加
-``JSplitPane#setContinuousLayout(true)``として、移動を連続的に再描画
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JSplitPane.html#setContinuousLayout-boolean- JSplitPane#setContinuousLayout(boolean) (Java Platform SE 8)]
- [https://community.oracle.com/thread/1376808 Swing - Regading SplitPanes]

**参考リンク [#nc7b83c6]
- [https://forums.oracle.com/message/5816154 Regading SplitPanes | Oracle Forums]

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