JavaTM 2 Platform Standard Edition 6.0 での Swing の拡張機能 |
ドキュメントの目次 |
主な機能
その他の変更点
- プラットフォームの Look & Feel の改善
- SwingWorker
- テキスト印刷
- JTable のソートとフィルタリング
- レイアウトの拡張機能
- 任意のコンポーネントを JTabbedPane のタブとして使用
- 真のダブルバッファリング
- GroupLayout レイアウトマネージャー
- ドラッグ&ドロップの拡張機能
主な機能
プラットフォームの Look & Feel の改善
ネイティブなレンダリングエンジンを利用することにより、GTK と Windows の両方の Look & Feel が拡張および改善されました。すべての Swing コンポーネントは、ベースとなるプラットフォームの Look & Feel に従って表示され、適切なフィードバックを提供し、適切なサイズに設定されます。
SwingWorker
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 には、次のメソッドが含まれています。
詳細は、Swing チュートリアルの「How to Print Text」節を参照してください。JTable のソートとフィルタリング
ソートとフィルタリングの機能を提供するために、いくつかの新しいクラスが 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 を提供できます。任意のコンポーネントを JTabbedPane のタブとして使用
リリース 6 より前では、タブ区画のタブの内容は文字列またはアイコン (あるいはその両方) に限定されていました。新しい API を使用すると、カスタムコンポーネントをタブに追加できます。この機能のもっとも一般的な使用法は、タブ区画からタブを削除する閉じるボタンを追加することです。次の新しいメソッドが javax.swing.JTabbedPane クラスに追加されました。
詳細は、Swing チュートリアルの「How to Use Tabbed Panes」節を参照してください。
真のダブルバッファリング
これまでは、Swing ベースのアプリケーションが別のアプリケーションによって隠されたあとで表示された場合、ウィンドウのバックグラウンドが消去されたときからウィンドウがペイントされたときまでにかなりの遅延がありました。この問題は、本当の意味でダブルバッファリングを Swing に追加することで解決されました。各ウィンドウは、対応するオンスクリーンイメージとの同期がとられるオフスクリーンイメージを持ちます。ウィンドウが表示されると、そのオフスクリーンイメージが画面のツールキットスレッド上に直接コピーされます。イベントディスパッチスレッドをブロックするアプリケーションには利点がもう一つあります。ユーザーがアプリケーションウィンドウを隠してから表示した場合、イベントディスパッチスレッドがブロックされている間もアプリケーションは引き続きペイントします。
また、RepaintManager クラスでは、Swing のトップレベルコンポーネント (
JApplet
、JWindow
、JFrame
、およびJDialog
) のペイントを処理できるようになり、ウィンドウ内のコンポーネントの位置に応じた新しいペイントアーキテクチャーをサポートするようになりました。次の新しいメソッドがRepaintManager
クラスに追加されました。
- addDirtyRegion(Applet, int, int, int, int)
- addDirtyRegion(JComponent, int, int, int, int)
- addDirtyRegion(Window, int, int, int, int)
Swing のすべてのトップレベルコンポーネントは
repaint
メソッドをオーバーライドします。このメソッドは適切なaddDirtyRegion
メソッドを呼び出します。JRootPane クラスは
setDoubleBuffered
メソッドをオーバーライドするようになりました。このメソッドは、このコンポーネントがバッファーを使用してペイントするかどうかを定義します。GroupLayout レイアウトマネージャー
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
メソッドの古いバージョンが新しいバージョンによって呼び出されます。もう一つの改善点として、TransferHandler のサポートがトップレベルコンポーネントに追加されました。このサポートは、
setTransferHandler
およびgetTransferHandler
メソッドが各トップレベルコンポーネント (JApplet
、JWindow
、JFrame
、およびJDialog
) のクラスへ追加されたことによって提供されます。これまでユーザーは、まず選択を行ってから、選択した項目を再度クリックしてドラッグ操作を開始する必要がありました。これからは、マウスを 1 回クリックするだけでドラッグ操作が開始されるようになります (Bug Database のバグ ID 4521075 を参照)。
詳細は、Swing チュートリアルの「Drag and Drop and Data Transfer」節を参照してください。
その他の変更点
ButtonGroup を選択解除された状態にリセットする機能
ButtonGroup
クラスは、複数のボタンのセットに多重排他スコープを設定するために使用します。初期状態では、グループのボタンは 1 つも選択されていません。これまでは、ボタンを選択したあとで選択解除された状態に戻す方法はありませんでした。これからは、開発者は clearSelection メソッドを使用して選択を解除し、グループ内でボタンがひとつも選択されていない状態にできます。javax.swing.Action インタフェースの新しい定数
次の定数が Action インタフェースに追加されました。
SELECTED_KEY
このキーは、コンポーネントの選択された状態を格納するために使用されます。JRadioButton
インスタンスやJCheckBox
インスタンスなどの、選択状態に意味のあるコンポーネントで使用されます。DISPLAYED_MNEMONIC_INDEX_KEY
このキーは、ニーモニックの装飾を置くテキスト内のインデックスを指定するために使用されます。LARGE_ICON_KEY
このキーは、アイコンを格納するために使用されます。hideActionText
プロパティーは、ボタンにAction
のテキストを表示するかどうかを決定します。このプロパティーを設定および取得するために、対応する新しいメソッド setHideActionText(boolean) および getHideActionText() がAbstractButton
クラスに追加されました。真に親を持たない JDialog のサポート
JDK 5.0 以前のバージョンでは、次のコードによって例外がスローされました。
JDialog d = new JDialog((Dialog)null);
Swing では、コンストラクタ
JDialog(Frame):
にだけnull
を渡すことができました。
JDialog d = new JDialog((Frame)null);
後者の場合は、非表示の共有所有者フレームが親を持たないすべての JDialog の親になっていました。
新しい Modality モデルが JDK 6 に追加されたことにより、真に親を持たないダイアログを作成できるようになりました。なお、これらのダイアログでは
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()
は共有所有者フレームを返します。
Copyright © 1999-2008 Sun Microsystems, Inc. All Rights Reserved.