ネイティブなレンダリング・エンジンを利用することにより、GTKとWindowsの両方のルック・アンド・フィールが拡張および改善されました。すべてのSwingコンポーネントは、ベースとなるプラットフォームのルック・アンド・フィールに従って表示され、適切なフィードバックを提供し、適切なサイズに設定されます。
抽象クラスjavax.swing.SwingWorkerがJDKに追加されました。SwingWorker
クラスを使用すると、実行時間の長いタスクをバックグラウンド・スレッドで実行できます。SwingWorker
のサブクラスは、バックグラウンドで処理を行うdoInBackground()
メソッドを実装する必要があります。バックグラウンド・タスクが実行されている間、イベント・ディスパッチ・スレッドがイベントを処理し、必要に応じてUIを更新します。SwingWorker
クラスは中間結果をサポートします。バックグラウンド・タスクではpublish
メソッドを呼び出すことができます。このメソッドは、部分的なデータをprocess
メソッドに送信して、イベント・ディスパッチ・スレッドに処理させることができます。また、SwingWorker
クラスはプロパティ変更リスナーもサポートします。プロパティの変更があれば、イベントがトリガーされ、イベント・ディスパッチ・スレッドからイベント処理メソッドが呼び出されます。
時間のかかるタスクの実行にはSwingWorkerを使用することをお薦めします。詳細は、Swingチュートリアルの「Concurrency in Swing」セクションを参照してください。
javax.swing.JTextComponentクラスのいくつかの新しいメソッドには、テキスト・ドキュメントの出力機能が備わっています。サポートされる形式には、HTML、RTF、およびプレーン・テキストがあります。新しいAPIを使用すると、コンポーネントが可視であるかどうかに関係なく、テキスト・コンポーネントの内容全体を出力できます。機能としては、対話式または非対話式による出力、出力ダイアログの表示、カスタム・ヘッダーまたはフッターの追加、自動レイアウトおよびページ設定があります。ドキュメントの内容は、ページ・サイズに合わせて整形されます。
新しいAPIには、次のメソッドが含まれています。
ソートとフィルタリングの機能を提供するために、いくつかの新しいクラスがJDKに追加されました。ソートとフィルタリングの基盤は、abstractクラスRowSorterによって提供されます。DefaultRowSorterクラスは、RowSorter
クラスの実装で、グリッド・ベースのモデルを扱います。TableRowSorterクラスは、JTable用のRowSorter
クラスの実装としてjavax.swing.tableパッケージに追加されました。TableRowSorter
クラスを使用すると、さまざまなComparator
を指定することができ、さらにフィルタリング・オプションも設定できます。
詳細は、Swingチュートリアルの「How to Use Tables」セクションを参照してください。
新しいAPIは、レイアウト・マネージャを作成する開発者を対象としており、コンポーネントのベースラインを取得する機能とコンポーネントの適切な間隔を取得する機能を備えています。
市販レベルのレイアウトでは通常、コンポーネントをそのベースラインに沿って配置します。これまでSwingでは、コンポーネントのベースラインを取得する手段を提供していませんでした。この問題を解決するために、getBaseline(int,int)およびgetBaselineResizeBehavior()メソッドがjavax.swing.JComponentクラスに追加されて、ベースラインと、コンポーネントのサイズが変化したときのベースライン動作を取得できるようになりました。
それぞれのルック・アンド・フィールでは、コンポーネントを互いの位置からどれだけ離したらよいかに関するさまざまなガイドラインが提供されます。クロス・プラットフォームのルック・アンド・フィールを作成するためには、この情報を取得するためのAPIが必要になります。解決策として、javax.swing.LayoutStyleクラスが追加されました。レイアウト・マネージャは、このクラスを使用してコンポーネント間の適切なスペースの量を決めることができます。ルック・アンド・フィールの作成者は、ルック・アンド・フィールのgetLayoutStyle()
メソッドをオーバーライドすることにより、カスタムLayoutStyleを提供できます。
リリース6より前では、タブ・ペインのタブの内容は文字列またはアイコン(あるいはその両方)に限定されていました。新しいAPIを使用すると、カスタム・コンポーネントをタブに追加できます。この機能のもっとも一般的な使用法は、タブ・ペインからタブを削除する閉じるボタンを追加することです。次の新しいメソッドがjavax.swing.JTabbedPaneクラスに追加されました。
詳細は、Swingチュートリアルの「How to Use Tabbed Panes」セクションを参照してください。
各ウィンドウは、対応するオンスクリーン・イメージとの同期がとられるオフスクリーン・イメージを持ちます。ウィンドウが表示されると、そのオフスクリーン・イメージが画面のツールキット・スレッド上に直接コピーされます。イベント・ディスパッチ・スレッドをブロックするアプリケーションには利点がもう1つあります。ユーザーがアプリケーション・ウィンドウを隠してから表示した場合、イベント・ディスパッチ・スレッドがブロックされている間もアプリケーションは引き続きペイントします。
また、RepaintManagerクラスでは、Swingのトップレベル・コンポーネント(JApplet
、JWindow
、JFrame
、およびJDialog
)のペイントを処理できるようになり、ウィンドウ内のコンポーネントの位置に応じた新しいペイント・アーキテクチャをサポートするようになりました。次の新しいメソッドがRepaintManager
クラスに追加されました。
Swingのすべてのトップレベル・コンポーネントはrepaint
メソッドをオーバーライドします。このメソッドは適切なaddDirtyRegion
メソッドを呼び出します。
JRootPaneクラスはsetDoubleBuffered
メソッドをオーバーライドするようになりました。このメソッドは、このコンポーネントがバッファを使用してペイントするかどうかを定義します。
GroupLayoutレイアウト・マネージャがjavax.swing
パッケージに追加されました。このレイアウトは、NetBeans IDEに付属しているGUIビルダー用に開発されました。GroupLayout
はGUIビルダーで使用されることを想定していますが、ハンドコーディングすることもできます。
詳細は、Swingチュートリアルの「How to Use GroupLayout」セクションを参照してください。
リリース6では、2つの主要な拡張機能がドラッグ・アンド・ドロップ機能に導入されました。
1つめの拡張機能は、ドロップ位置を示す目的で選択範囲を使用しないようにドラッグ・アンド・ドロップ操作を構成できるようになりました(Bug DatabaseのバグID 4468566を参照。)新しいメカニズムでは、JTree
、JTable
、JList
、JTextComponent
などのドロップをサポートするコンポーネントに対してDropModeプロパティを導入します。DropMode
プロパティは、コンポーネントがドロップの位置を追跡して示すときに使用するモードの決定に使われます。このプロパティをコンポーネントに対して設定するために、setDropMode(DropMode)
メソッドが上記コンポーネントの各クラスに追加されました。利用可能なドロップ・モードとそれをサポートするコンポーネントを次に示します。
ON
- JList
, JTree
, JTable
INSERT
- JList
, JTree
, JTable
, JTextComponent
ON_OR_INSERT
- JList
, JTree
, JTable
ON_OR_INSERT_ROWS, ON_OR_INSERT_COLS
- JTable
USE_SELECTION
- JList
, JTree
, JTable
, JTextComponent
下位互換性を確保するために、このプロパティのデフォルト値はUSE_SELECTION
に設定されます。改善されたドラッグ・アンド・ドロップ機能を利用するには、前述したその他のドロップ・モードのいずれかを使用してください。
2つめの拡張機能は、TransferHandler
クラスのドロップ操作の処理に関するものです。これまでTransferHandler
クラスは、インポート処理メソッドが必要な情報を持っていないために、一般的なドロップ関連タスクを実行できませんでした。新しいTransferHandler.TransferSupport内部クラスは、転送操作ごとに詳細な情報を提供します。
canImportおよびimportDataメソッドの新しくオーバーロードされたバージョンがTransferHandler
クラスに追加されました。これらのメソッドがTransferSupport
クラスのインスタンスを取るので、開発者は転送の詳細に基づいて転送の受け入れまたは拒否を行うことができます。また、TransferSupport
インスタンスから取得される転送に関連したTransferable
、ドロップ位置、またはドロップ・アクションに基づいてドロップの動作をカスタマイズすることもできます。たとえば、新しいcanImport
メソッドを実装して、子からその親へデータを移動する試みを検出し、そのような転送を拒否できます。以前のバージョンとは異なり、canImport
メソッドは、ドラッグ・アンド・ドロップ操作がコンポーネント上で行われている間、そのコンポーネントのTransferHandler
によって継続的に呼び出されます。この機能によって、転送が受け入れ可能かどうかをドラッグ・アンド・ドロップ操作中に何度も変更できるメカニズムが備わりました。下位互換性を確保するために、デフォルトでcanImport
メソッドの古いバージョンが新しいバージョンによって呼び出されます。
もう1つの改善点として、TransferHandlerのサポートがトップレベル・コンポーネントに追加されました。このサポートは、setTransferHandler
およびgetTransferHandler
メソッドが各トップレベル・コンポーネント(JApplet
、JWindow
、JFrame
、およびJDialog
)のクラスへ追加されたことによって提供されます。
これまでユーザーは、まず選択を行なってから、選択した項目を再度クリックしてドラッグ操作を開始する必要がありました。これからは、マウスを1回クリックするだけでドラッグ操作が開始されるようになります(Bug DatabaseのバグID 4521075を参照。)
詳細は、Swingチュートリアルの「Drag and Drop and Data Transfer」セクションを参照してください。
Java SE 6 update 10リリースで導入されたクロス・プラットフォームのルック・アンド・フィールであるNimbusは、2Dベクトル・グラフィックスでレンダリングされるため、任意の解像度でレンダリングできます。詳細は、Nimbusルック・アンド・フィールに関するトピックを参照してください。
ButtonGroup
クラスは、複数のボタンのセットに多重排他スコープを設定するために使用します。初期状態では、グループのボタンは1つも選択されていません。これまでは、ボタンを選択したあとで選択解除された状態に戻す方法はありませんでした。これからは、開発者はclearSelectionメソッドを使用して選択を解除し、グループ内でボタンが1つも選択されていない状態にできます。
次の定数がActionインタフェースに追加されました。
SELECTED_KEY
JRadioButton
インスタンスやJCheckBox
インスタンスなどの、選択状態に意味のあるコンポーネントで使用されます。DISPLAYED_MNEMONIC_INDEX_KEY
LARGE_ICON_KEY
hideActionText
プロパティは、ボタンにAction
のテキストを表示するかどうかを決定します。このプロパティを設定および取得するために、対応する新しいメソッドsetHideActionText(boolean)およびgetHideActionText()がAbstractButton
クラスに追加されました。
JDialog d = new JDialog((Dialog)null);
Swingでは、コンストラクタJDialog(Frame):
にだけnull
を渡すことができました
JDialog d = new JDialog((Frame)null);
後者の場合は、非表示の共有所有者フレームが親を持たないすべてのJDialogの親になっていました。
新しいModalityモデルがJDK 6に追加されたことにより、AWTでは真に親を持たないダイアログを作成できるようになりました。これらのダイアログではd.getParent()
はnull
を返します。新しいモーダリティAPIを使用するには、JDialogも真に親を持たないようにする必要があります(Bug DatabaseのバグID 6300062を参照。)
所有者になるWindow
パラメータを持つ新しいコンストラクタがJDialog
クラスに追加され、新しいメソッドがJOptionPane
クラスに追加されました。親を持たないJDialogを作成するために、コンストラクタJDialog(Dialog)
またはJDialog(Window)
にnull
を渡せるようになりました。親を持たないJOptionPaneを作成するには、createDialog(String)メソッドを使用します。
まとめると、次の3つのコンストラクタになります。
JDialog d = new JDialog((Dialog)null)
;
JDialog d = new JDialog((Window)null)
;
JDialog d = new JDialog((Frame)null)
;
次の違いに注意してください。3つのコンストラクタはすべてnull
を取りますが、最初の2つのダイアログのみが本当に親を持たず、d.getParent()
操作でnull
を返します。3つ目のダイアログでは、d.getParent()
は共有所有者フレームを返します。