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

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

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTQl4nQ4PI/AAAAAAAAAf0/y7DMbOexVWs/s800/OneTouchExpandable.png)

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

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

----
Java 1.5 以降でJSplitPane#setDividerLocation(0);などとしてディバイダを収納状態にした場合、JSplitPane自体をリサイズすると収納されているコンポーネントの最小サイズ(setMinimumSize)まで展開されてしまいます。

-収納状態を維持したい場合、リフレクションを使って、BasicSplitPaneUI#setKeepHidden(true)メソッドを実行したり、Dividerに表示されているJButtonを取得実行する方法があります。
--[http://bugs.sun.com/view_bug.do?bug_id=5006095 Bug ID: 5006095 Need a way to programmatically stick JSplitPane divider under j2sdk 1.5]
--[[Swing/KeepHiddenDivider]]

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

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

**コメント [#m26676c6]
- ソースファイルをダウンロードしてeclipseでプロジェクト作成しそこにコピーしたのですが、「インポートされた javax.jnlp は見つかりません」と出てきて実行出来ないのですが、 javax.jnlpはどこに置けば良いのでしょうか? -- [[ニートン]] &new{2012-02-21 (火) 08:06:33};
-- eclipseはほとんど使ったことがないのでインポートの詳細(もしかしてAntのbuild.xmlを取り込む機能がある?)が分からないのですが、javax.jnlp パッケージは、${java.home}/lib/javaws.jar にあるので、ここにクラスパスが通っていないのかもしれません。このサンプルでは、javax.jnlp.*は使用しないので、build.xmlから <pathelement location="${java.home}/lib/javaws.jar" /> を削除するか、または、eclipseで新規プロジェクトを作成し、ソースコードだけ貼り付けるのが簡単だと思います。 -- [[aterai]] &new{2012-02-21 (火) 17:15:21};
- >eclipseで新規プロジェクトを作成し、ソースコードだけ貼り付けるのが簡単だと思います。
その通りしていたのですが。。。結果的にはjnlp.jarファイルをjdk1.6の中から探してeclipseの「外部jarを追加」で動作いたしました。お騒がせしました。それと、このjavax.jnlpはBasicService関連のクラスファイルが入ってるようなので削除できないみたいです。-- [[ニートン]] &new{2012-02-22 (水) 18:41:04};
-- すいません。「このサンプルでは、javax.jnlp.*は使用しないので...」はデタラメで、BasicServiceが取得できるかどうかで、Web Start で起動したのかどうかを判断する部分を見落としていました。Web Start で起動した場合は、getComponents()でボタンを検索する方法で、ローカルから起動した場合は、リフレクションでprivate な setKeepHidden メソッドを取得して実行する方法を使っています。大変失礼しましたm(__)m。 -- [[aterai]] &new{2012-02-22 (水) 18:59:52};

#comment