Java Standard Edition 6.0でのSwingの拡張機能

主な機能
その他の変更点

主な機能

プラットフォームのルック・アンド・フィールの改善

ネイティブなレンダリング・エンジンを利用することにより、GTKとWindowsの両方のルック・アンド・フィールが拡張および改善されました。すべてのSwingコンポーネントは、ベースとなるプラットフォームのルック・アンド・フィールに従って表示され、適切なフィードバックを提供し、適切なサイズに設定されます。

SwingWorker

抽象クラス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クラスに追加されて、ベースラインと、コンポーネントのサイズが変化したときのベースライン動作を取得できるようになりました。

それぞれのルック・アンド・フィールでは、コンポーネントを互いの位置からどれだけ離したらよいかに関するさまざまなガイドラインが提供されます。クロス・プラットフォームのルック・アンド・フィールを作成するためには、この情報を取得するためのAPIが必要になります。解決策として、javax.swing.LayoutStyleクラスが追加されました。レイアウト・マネージャは、このクラスを使用してコンポーネント間の適切なスペースの量を決めることができます。ルック・アンド・フィールの作成者は、ルック・アンド・フィールのgetLayoutStyle()メソッドをオーバーライドすることにより、カスタムLayoutStyleを提供できます。

任意のコンポーネントをJTabbedPaneのタブとして使用

リリース6より前では、タブ・ペインのタブの内容は文字列またはアイコン(あるいはその両方)に限定されていました。新しいAPIを使用すると、カスタム・コンポーネントをタブに追加できます。この機能のもっとも一般的な使用法は、タブ・ペインからタブを削除する閉じるボタンを追加することです。次の新しいメソッドがjavax.swing.JTabbedPaneクラスに追加されました。

詳細は、Swingチュートリアルの「How to Use Tabbed Panes」セクションを参照してください。

真のダブル・バッファリング

これまでは、Swingベースのアプリケーションが別のアプリケーションによって隠されたあとで表示された場合、ウィンドウのバックグラウンドが消去されたときからウィンドウがペイントされたときまでにかなりの遅延がありました。この問題は、本当の意味でダブル・バッファリングをSwingに追加することで解決されました。

各ウィンドウは、対応するオンスクリーン・イメージとの同期がとられるオフスクリーン・イメージを持ちます。ウィンドウが表示されると、そのオフスクリーン・イメージが画面のツールキット・スレッド上に直接コピーされます。イベント・ディスパッチ・スレッドをブロックするアプリケーションには利点がもう1つあります。ユーザーがアプリケーション・ウィンドウを隠してから表示した場合、イベント・ディスパッチ・スレッドがブロックされている間もアプリケーションは引き続きペイントします。

また、RepaintManagerクラスでは、Swingのトップレベル・コンポーネント(JAppletJWindowJFrame、およびJDialog)のペイントを処理できるようになり、ウィンドウ内のコンポーネントの位置に応じた新しいペイント・アーキテクチャをサポートするようになりました。次の新しいメソッドがRepaintManagerクラスに追加されました。

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を参照。)新しいメカニズムでは、JTreeJTableJListJTextComponentなどのドロップをサポートするコンポーネントに対してDropModeプロパティを導入します。DropModeプロパティは、コンポーネントがドロップの位置を追跡して示すときに使用するモードの決定に使われます。このプロパティをコンポーネントに対して設定するために、setDropMode(DropMode)メソッドが上記コンポーネントの各クラスに追加されました。利用可能なドロップ・モードとそれをサポートするコンポーネントを次に示します。

下位互換性を確保するために、このプロパティのデフォルト値はUSE_SELECTIONに設定されます。改善されたドラッグ・アンド・ドロップ機能を利用するには、前述したその他のドロップ・モードのいずれかを使用してください。

2つめの拡張機能は、TransferHandlerクラスのドロップ操作の処理に関するものです。これまでTransferHandlerクラスは、インポート処理メソッドが必要な情報を持っていないために、一般的なドロップ関連タスクを実行できませんでした。新しいTransferHandler.TransferSupport内部クラスは、転送操作ごとに詳細な情報を提供します。

canImportおよびimportDataメソッドの新しくオーバーロードされたバージョンがTransferHandlerクラスに追加されました。これらのメソッドがTransferSupportクラスのインスタンスを取るので、開発者は転送の詳細に基づいて転送の受け入れまたは拒否を行うことができます。また、TransferSupportインスタンスから取得される転送に関連したTransferable、ドロップ位置、またはドロップ・アクションに基づいてドロップの動作をカスタマイズすることもできます。たとえば、新しいcanImportメソッドを実装して、子からその親へデータを移動する試みを検出し、そのような転送を拒否できます。以前のバージョンとは異なり、canImportメソッドは、ドラッグ・アンド・ドロップ操作がコンポーネント上で行われている間、そのコンポーネントのTransferHandlerによって継続的に呼び出されます。この機能によって、転送が受け入れ可能かどうかをドラッグ・アンド・ドロップ操作中に何度も変更できるメカニズムが備わりました。下位互換性を確保するために、デフォルトでcanImportメソッドの古いバージョンが新しいバージョンによって呼び出されます。

もう1つの改善点として、TransferHandlerのサポートがトップレベル・コンポーネントに追加されました。このサポートは、setTransferHandlerおよびgetTransferHandlerメソッドが各トップレベル・コンポーネント(JAppletJWindowJFrame、およびJDialog)のクラスへ追加されたことによって提供されます。

これまでユーザーは、まず選択を行なってから、選択した項目を再度クリックしてドラッグ操作を開始する必要がありました。これからは、マウスを1回クリックするだけでドラッグ操作が開始されるようになります(Bug DatabaseのバグID 4521075を参照。)

詳細は、Swingチュートリアルの「Drag and Drop and Data Transfer」セクションを参照してください。

Nimbusルック・アンド・フィール

Java SE 6 update 10リリースで導入されたクロス・プラットフォームのルック・アンド・フィールであるNimbusは、2Dベクトル・グラフィックスでレンダリングされるため、任意の解像度でレンダリングできます。詳細は、Nimbusルック・アンド・フィールに関するトピックを参照してください。

 

その他の変更点

ButtonGroupを選択解除された状態にリセットする機能

ButtonGroupクラスは、複数のボタンのセットに多重排他スコープを設定するために使用します。初期状態では、グループのボタンは1つも選択されていません。これまでは、ボタンを選択したあとで選択解除された状態に戻す方法はありませんでした。これからは、開発者はclearSelectionメソッドを使用して選択を解除し、グループ内でボタンが1つも選択されていない状態にできます。

javax.swing.Actionインタフェースの新しい定数

次の定数がActionインタフェースに追加されました。

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に追加されたことにより、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()は共有所有者フレームを返します。


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.