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

Posted by at 2010-07-05

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

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

  • &jnlp;
  • &jar;
  • &zip;
OneTouchExpandable.png

サンプルコード

JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, s1, s2);
splitPane.setOneTouchExpandable(true);
View in GitHub: Java, Kotlin

解説

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


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


`HOMEキーやENDキー(F8キーなどでDividerにフォーカスを移動した状態で)を押して展開、収納する方法では、Divider中のJButton`を押して展開、収納した場合と動作が異なります。

  • `HOMEキー、END`キーで展開、収納
    • 前回の状態に一旦戻らずに展開、収納される
    • `JSplitPane自体をリサイズすると、収納されているコンポーネントの最小サイズ(setMinimumSize`)まで勝手に展開される
      • `JSplitPane#getActionMap()#get("selectMin")などで取得できるActionでは、setKeepHidden(boolean)`が使われていない

参考リンク

コメント

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