JTabbedPane - スクロール可能なタブ

以前の JTabbedPane では、すべてのタブが 1 行に収まらない場合、複数の行になるように行が折り返されました。このような表示方法の代わりに、JTabbedPane に代替方式を提供して、タブを単一のスクロール可能な行に設定できるようにしてほしいという多くの要求がありました。このドキュメントでは、1.4 リリースの JTabbedPane でサポートされる、スクロール可能なタブを提供する新規 API について説明します。この変更に関連するバグ追跡レポート: 4093898

タブが多すぎるジレンマ

タブが複数行に折り返される場合は、ユーザが一度にすべてのタブを見ることができるという長所があります。

タブが 2 行のグラフィック。1行目に 5 つ、2 行目に 4 つのタブがある。

ただし、複数行になった場合の問題は、ウィンドウの表示領域に隣接していない行のタブをユーザが選択したときの処理で発生します。Windows および Motif の Look & Feel 実装では、このような場合に、選択したタブを含む行がウィンドウ表示領域に隣接して配置されるように、行が入れ替わります。

選択したタブがパネル表示領域に隣接したグラフィック

この動作によってタブの配置が常時変化し、UI における先見性が失われるため、ユーザの感覚を狂わせる可能性があります。Metal の Look & Feel では、選択したタブがウィンドウ表示領域に隣接していない場合でも常に各行の位置を固定しておくことで、この問題を解決しました。

選択したタブを色を変えて表示したグラフィック

ただし、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 なので、この機能は互換性に何の影響もありません。