概要

JSplitPaneに設定した子コンポーネントの位置と余分なスペースの配分率を入れ替えます。

サンプルコード

#spanadd
JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);
#spanend
#spanadd
split.setResizeWeight(.4);
#spanend
#spanadd

#spanend
JButton button = new JButton("swap");
button.setFocusable(false);
button.addActionListener(e -> {
  Component left = sp.getLeftComponent();
  Component right = sp.getRightComponent();
  Component left = split.getLeftComponent();
  Component right = split.getRightComponent();

  // sp.removeAll(); // Divider is also removed
  sp.remove(left);
  sp.remove(right);
  // split.removeAll(); // Divider is also removed
  split.remove(left);
  split.remove(right);
  // or:
  // sp.setLeftComponent(null);
  // sp.setRightComponent(null);
  // split.setLeftComponent(null);
  // split.setRightComponent(null);

  sp.setLeftComponent(right);
  sp.setRightComponent(left);
  split.setLeftComponent(right);
  split.setRightComponent(left);

  sp.setResizeWeight(1d - sp.getResizeWeight());
  split.setResizeWeight(1d - split.getResizeWeight());
  if (check.isSelected()) {
    sp.setDividerLocation(sp.getDividerLocation());
    split.setDividerLocation(split.getDividerLocation());
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、水平分割したJSplitPaneの左右に配置したコンポーネントを入れ替え可能に設定しています。

  • すでにJSplitPaneに配置されているコンポーネントを別の位置に配置すると例外が発生するため、一旦JSplitPaneから削除する必要がある
  • JSplitPane#removeAll()を使用するとディバイダも削除されてしまう
  • JSplitPane#remove(Component)、またはJSplitPane#setLeftComponent(null)などで削除する
  • ディバイダの位置を入れ替え前と同じ場所に保つ場合、JSplitPane#setResizeWeight(...)メソッドで余分なスペースの配分率の入れ替えと、JSplitPane#setDividerLocation(...)メソッドで位置の再設定が必要になる
  • ディバイダの位置を入れ替え前と同じ場所に保つ場合、JSplitPane#setResizeWeight(...)メソッドで余分なスペースの配分率の入れ替えとJSplitPane#setDividerLocation(...)メソッドで位置の再設定が必要になる

参考リンク

コメント