TITLE:JSplitPaneのディバイダを展開、収納する
Posted by terai at 2010-07-05

JSplitPaneのディバイダを展開、収納する

JSplitPaneのディバイダをマウスのクリックなどで一気に展開、収納できるように設定します。
  • category: swing folder: OneTouchExpandable title: JSplitPaneのディバイダを展開、収納する tags: [JSplitPane, Divider, ActionMap, ServiceManager, BasicService] author: aterai pubdate: 2010-07-05T01:22:49+09:00 description: JSplitPaneのディバイダをマウスのクリックなどで一気に展開、収納できるように設定します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTQl4nQ4PI/AAAAAAAAAf0/y7DMbOexVWs/s800/OneTouchExpandable.png

概要

JSplitPaneのディバイダをマウスのクリックなどで一気に展開、収納できるように設定します。

#screenshot

サンプルコード

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

解説

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

解説

上記のサンプルでは、JSplitPane#setOneTouchExpandable(true)を設定するとディバイダにJButton2つ表示され、これらをマウスでクリックするとJSplitPaneの展開、収納ができます。
  • - 初期状態でディバイダを収納状態にする場合、Java 1.5以降では、splitPane.setDividerLocation(0);などとするだけではダメ*1で、以下のような設定をする必要があります。
  • Web Startで起動しなかった場合
    • Bug ID: 5006095 Need a way to programmatically stick JSplitPane divider under j2sdk 1.5
      #spanend
      #spandel
      try {
      #spanend
        Method setKeepHidden = BasicSplitPaneUI.class.getDeclaredMethod(
            "setKeepHidden", new Class[] { boolean.class });
        setKeepHidden.setAccessible(true);
        setKeepHidden.invoke(splitPane.getUI(), new Object[] { new Boolean(true) });
      #spandel
      }catch(Exception e) {
      #spanend
        e.printStackTrace();
      #spandel
      }
      #spanend
      #spandel
      
  • Java 1.5以降でJSplitPane#setDividerLocation(0);などとしてディバイダを収納状態にした場合、JSplitPane自体をリサイズすると収納されているコンポーネントの最小サイズ(setMinimumSize)まで展開される
  • 収納状態を維持したい場合、リフレクションを使ってBasicSplitPaneUI#setKeepHidden(true)メソッドを実行したりDividerに表示されているJButtonを取得実行する方法がある
  • HOMEキーやENDキー(F8キーなどでDividerにフォーカスを移動した状態で)を押して展開、収納する方法ではDivider中のJButtonを押して展開、収納した場合と動作が異なる
    • HOMEキー、ENDキーで展開、収納
      • 前回の状態に一旦戻らずに展開、収納される
      • JSplitPane自体をリサイズすると収納されているコンポーネントの最小サイズ(setMinimumSize)まで自動的に展開される
      • JSplitPane#getActionMap()#get("selectMin")などで取得できるActionではsetKeepHidden(boolean)が使われていない
  • GTKLookAndFeelはワンタッチボタンをサポートしないのでSplitPane.supportsOneTouchButtons: Boolean.FALSEが設定されている
  • Web Startで起動した場合
    • dividerから直接JButton(名前がついていない……)を取得し実行
      #spanend
      #spandel
      EventQueue.invokeLater(new Runnable() {
      #spanend
        @Override public void run() {
          Container divider = ((BasicSplitPaneUI)splitPane.getUI()).getDivider();
          for(Component c: divider.getComponents()) {
            if(c instanceof JButton) {
              ((JButton)c).doClick();
              break;
            }
          }
        }
      #spandel
      });
      #spanend
      #spandel
      

参考リンク

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

コメント