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

主な機能
その他の変更点

主な機能

プラットフォームの 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 に追加することで解決されました。

各ウィンドウは、対応するオンスクリーンイメージとの同期がとられるオフスクリーンイメージを持ちます。ウィンドウが表示されると、そのオフスクリーンイメージが画面のツールキットスレッド上に直接コピーされます。イベントディスパッチスレッドをブロックするアプリケーションには利点がもう 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 に設定されます。改善されたドラッグ&ドロップ機能を利用するには、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」セクションを参照してください。

 

その他の変更点

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, 2013, Oracle and/or its affiliates. All rights reserved.