• 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

概要

二つのJSplitPaneのディバイダで、移動の同期と連続的な再描画を行います。

サンプルコード

final JSplitPane leftPane   = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
final JSplitPane rightPane  = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
final 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())
          target.setDividerLocation(location);
    }
  }
};
leftPane.addPropertyChangeListener(pcl);
rightPane.addPropertyChangeListener(pcl);
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、各JSplitPaneJSplitPane#setContinuousLayout(true)を設定し、ディバイダの移動に応じて子コンポーネントを連続的に再描画しています。

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

参考リンク

コメント