• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JSplitPaneのディバイダを展開、収納する
#navi(../)
RIGHT:Posted by [[terai]] at 2010-07-05
*JSplitPaneのディバイダを展開、収納する [#u9e01565]
JSplitPaneのディバイダをマウスのクリックなどで一気に展開、収納できるように設定します。

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#f93229db]
#code{{
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, s1, s2);
splitPane.setOneTouchExpandable(true);
}}

**解説 [#b1964ebf]
上記のサンプルでは、JSplitPane#setOneTouchExpandable(true)と設定することで、ディバイダにJButtonが表示され、これらをクリックすることでディバイダを展開、収納することができるようになっています。

----
初期状態でディバイダを収納状態にする場合、Java 1.5以降では、splitPane.setDividerLocation(0);などとするだけではダメ((JSplitPane自体をリサイズすると、収納されているコンポーネントの最小サイズ(setMinimumSize)まで勝手に展開され))で、以下のような設定をする必要があります。
-Web Startで起動しなかった場合
--[[Bug ID: 5006095 Need a way to programmatically stick JSplitPane divider under j2sdk 1.5>http://bugs.sun.com/view_bug.do?bug_id=5006095]]
#code{{
try {
  Method setKeepHidden = BasicSplitPaneUI.class.getDeclaredMethod("setKeepHidden", new Class[] { boolean.class });
  setKeepHidden.setAccessible(true);
  setKeepHidden.invoke(splitPane.getUI(), new Object[] { new Boolean(true) });
}catch(Exception e) {
  e.printStackTrace();
}
}}

-Web Startで起動した場合
--dividerから直接JButton(名前がついていない……)を取得し実行
#code{{
EventQueue.invokeLater(new Runnable() {
  @Override public void run() {
    Container divider = ((BasicSplitPaneUI)splitPane.getUI()).getDivider();
    for(Component c: divider.getComponents()) {
      if(c instanceof JButton) {
        ((JButton)c).doClick();
        break;
      }
    }
  }
});
}}

----
HOMEキーやENDキー(F8キーなどでdividerにフォーカスを移動した状態で)を押して展開、収納する方法では、divider中のJButtonを押して展開、収納した場合と動作が異なります。
-HOMEキー、ENDキーで展開、収納
--前回の状態に一旦戻らずに展開、収納される
--JSplitPane自体をリサイズすると、収納されているコンポーネントの最小サイズ(setMinimumSize)まで勝手に展開される
---JSplitPane#getActionMap()#get("selectMin")などで取得できるActionでは、setKeepHidden(boolean)が使われていない

**参考リンク [#leece45e]
-[[Bug ID: 5006095 Need a way to programmatically stick JSplitPane divider under j2sdk 1.5>http://bugs.sun.com/view_bug.do?bug_id=5006095]]

**参考リンク [#leece45e]
**コメント [#m26676c6]
#comment