Let's write β

プログラミング中にできたことか、思ったこととか

JavaのSwingでネストしたJSplitPaneを扱う

今とあるツールを久々にJavaのSwingで書いている時に、複数のコンテンツをパッキングしてその間にサイズ調整の棒を表示してユーザーがリサイズできるようにする必要が生じました。

JSplitPaneをあてにしていたのですが、どうも奴は2つのコンポーネントしか扱ってくれない様子。
それはさすがに不便過ぎるとおもい検索してみたのですが、
どうもSwingXに入っているという情報があったり、ダウンロードしてみたら見つからなかったり、MultiSplitPaneというクラスが配布されてるとおもったらレイアウトが動的にするのは面倒そうだったり。

やりたいことは単純で通常時は仕切り棒がなく普通のPaneのように見えて、複数になったらコンテンツがちゃんとそれぞれ仕切り棒で区切られてリサイズできるようにすることです。

それが最終目標でなく単純に今そのUIを必要としているだけなので、動的に追加できて、インターフェースがそれなりに隠蔽してくれていればそれでいいのです。

ということでなかったので作りました。

(なぜ上述のファイルと同じ名前にしたかは得に理由はないです、思いつかなかったから...)

結局、方針としては無理して独自のレイアウトクラスとかをつくらずにネストしたJSplitPaneを作るという部分の煩わしさを隠蔽するという事にしました。

実装の方針としては、

  1. 最初の子が追加されただけの時は自分のレイアウトをBorderLayoutにして子を設定する。
  2. 次の子が追加されようとしたら、一旦最初の子を外し自分の下にJSplitPaneを貼り付け、そこに最初の子と、「追加されようとしている子だけを含んだMultiSplitPane」をはりつける。
  3. 更に子が追加されようとしたら、上で貼り付けたMultiSplitPaneに追加処理を委譲する。

というふうに再帰的に呼び出してやって実装自体も単純化してます。

これで一応面倒さは再帰処理に隠蔽し目的を達成できます。ネストしてるのでその枠が重なってきたりと微妙に修正したい点もありますが、とりあえず主目的はこれで達成されてます。