以前にJTabbedPane
を使用すると、すべてのタブが1行に収まらない場合、JTabbedPane
で複数の行になるように行が折り返されました。このような表示方法の代わりに、JTabbedPane
に代替スキームを提供して、タブを単一のスクロール可能な行に設定できるようにしてほしいという多くの要求がありました。このドキュメントでは、1.4リリースのJTabbedPane
でサポートされる、スクロール可能なタブを提供する新規APIについて説明します。この変更に関連するバグ追跡レポート: 4093898。
タブが複数行に折り返される場合は、ユーザーが一度にすべてのタブを見ることができるという長所があります。
ただし、複数行になった場合の問題は、ウィンドウの表示領域に隣接していない行のタブをユーザーが選択したときの処理で発生します。WindowsおよびMotifのルック・アンド・フィール実装では、このアクションで、選択したタブを含む行がウィンドウ表示領域に隣接して配置されるように、行が入れ替わります。
この動作によってタブの配置が常時変化し、UIにおける先見性が失われるため、ユーザーの感覚を狂わせる可能性があります。Metalのルック・アンド・フィールでは、選択したタブがウィンドウ表示領域に隣接していない場合でも常に各行の位置を固定しておくことで、この問題を解決しました。
ただし、Metalによる解決方法の欠点は、「タブ付きフォルダ」のメタファから視覚的に外れている(選択したタブがその内容に密着していない)ことです。実際、「Java Look and Feel Guidelines」の第7章では、複数行のタブが表示されるタブ付きペインの作成について、次のように薦めています。
「タブ付きペインに複数のタブ行が必要な場合は、その内容を複数のダイアログ・ボックスまたはコンポーネントに分割できるかどうかを考慮してください。タブを複数行にすると、混乱が生じる可能性があります。」
タブ付きペインのタブの数を1行に収まるように制限することは重要なUIガイドラインである一方で、タブの増殖は避けられないという状況もあります。しばしば、実行時にアプリケーションでタブを動的に作成するかどうかを判断するケースがあります(おそらくデータベースの内容によって)。
タブの増殖を処理する場合のもう1つの解決方法は、次のように、タブ付きペインのタブを単一行のスクロール可能なタブ行に制限することです。
この解決方法には本質的に、使い勝手についての問題がいくつかあります。その中でもっとも明らかな問題点は、すべての選択肢をユーザーが一度に見られなくなることです。ただし、このスクロール可能なタブはユーザー・インタフェースでは一般的になりつつあり、そのため、Swingではオプションとしてサポートするようになりました。
JTabbedPane
APIどのタブ・レイアウト動作が必要かをプログラムで定義できるように、JTabbedPane
に「tabLayoutPolicy」バインド・プロパティが提供されました。
public void setTabLayoutPolicy(int layoutPolicy) public boolean getTabLayoutPolicy()
さらに、サポートするポリシーに対応する定数がJTabbedPane
に追加されました。
public static final int WRAP_TAB_LAYOUT = 0; public static final int SCROLL_TAB_LAYOUT = 1;
tabLayoutPolicy
プロパティのデフォルト値が以前のタブ付きペインのレイアウト動作と一致するWRAP_TAB_LAYOUT
なので、この機能は互換性に何の影響もありません。