ネイティブなレンダリングエンジンを利用することにより、GTK と Windows の両方の Look & Feel が拡張および改善されました。すべての Swing コンポーネントは、ベースとなるプラットフォームの Look & Feel に従って表示され、適切なフィードバックを提供し、適切なサイズに設定されます。
abstract クラス 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 クラスに追加されて、ベースラインと、コンポーネントのサイズが変化したときのベースライン動作を取得できるようになりました。
それぞれの Look & Feel では、コンポーネントを互いの位置からどれだけ離したらよいかに関するさまざまなガイドラインが提供されます。クロスプラットフォームの Look & Feel を作成するためには、この情報を取得するための API が必要になります。解決策として、javax.swing.LayoutStyle クラスが追加されました。レイアウトマネージャーは、このクラスを使用してコンポーネント間の適切なスペースの量を決めることができます。Look & Feel の作成者は、Look & Feel の 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
に設定されます。改善されたドラッグ&ドロップ機能を利用するには、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」セクションを参照してください。
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()
は共有所有者フレームを返します。