基本GUIライブラリでは、主要な基本GUIライブラリをライトウェイトコンポーネントとして提供しています。
ライトウェイトコンポーネントを利用する利点は、次のとおりです。
ライトウェイトコンポーネントは、paint()メソッドでこれらの領域にレンダリングしないだけで、現在透明な領域を持つことができます。
ライトウェイトコンポーネントは、ネイティブデータ構造またはピアクラスを必要としないという点で、"軽い"です。
ライトウェイトコンポーネントにネイティブコードは必要なく、その処理は一般的な Javaコードに100%実装され、プラットフォームに依存しません。
JDKのSwingライブラリもライトウェイトコンポーネントとして提供されています。
ただし、ライトウェイトコンポーネントを配置するコンテナには以下のような特殊な条件が必要です。
ライトウェイトコンポーネントを、ダブルバッファリングを使って描画していないコンテナ上に配置した場合は、描画時に顕著にちらついて見えます。
ライトウェイトコンポーネントのコンテナが、super.paint を呼び出さない paint メソッドを実装している場合は、ライトウェイトコンポーネントは表示されません。言い換えると、何らかの描画(例えば、表示領域のまわりに四角の枠を描画するなど)を行うコンテナを実装する場合は、必ずコンテナの paint メソッドで super.paint を呼び出す必要があります。
ライトウェイトコンポーネントを配置するコンテナには上記の理由のため、ダブルバッファリングを使って描画を行う機能を持つ必要があります。
JBKではダブルバッファリングの機能を持つコンテナとしてJFPanelクラスを提供しています。
主要な基本GUIライブラリを利用する場合は、コンテナとしてJFPanelクラスを利用するか、ダブルバッファリングの機能を持つコンテナを利用する必要があります。
ライトウェイトコンポーネントとヘビーウェイトコンポーネント
ヘビーウェイトコンポーネントは、OSのネイティブGUIコンポーネントを使用します。ヘビーウェイトコンポーネントの描画はOS側で行いますが、ライトウェイトコンポーネントはJavaで描画処理を行います。
ライトウェイトコンポーネント | ヘビーウェイトコンポーネント |
---|---|
OSが実装しているGUIコンポーネントを使用しない | OSが実装しているGUIコンポーネントを使用する |
OSリソースを消費しない | OSリソースを消費する |
OSの種類に関わらず外観が同じ | OSの種類によって外観が異なる |
java.awt.ComponentのisLightweight()の復帰値:true | java.awt.ComponentのisLightweight()の復帰値:false |
透明な領域を持つことができる | 透明な領域を持つことができない |
注意
ライトウェイトコンポーネントとヘビーウェイトコンポーネントを混在させて使用しない
GUIライブラリを利用して画面を作成される場合は、ライトウェイトコンポーネントだけを使用してください。
同じ画面でライトウェイトコンポーネントとヘビーウェイトコンポーネントを組み合わせて使用すると、描画に異常が発生することがあります。
注意
ライトウェイトのコンポーネントまたはコンテナと、ヘビーウェイトのコンポーネントまたはコンテナとが混在している場合、処理性能が劣化する場合があります。
この場合は、Javaの起動オプションに以下を指定してください。
-Dsun.awt.disableMixing=true |
※JDK/JRE 7以降、ヘビーウェイトコンポーネントとライトウェイトコンポーネントが混在した画面の表示制限が緩和されました。
しかし、この機能により、今まで混在しても問題なく表示されていた画面に対しても処理性能が劣化する場合があります。
注意
開発元が異なるGUIコンポーネントを組み合わせて使用しない
JBKのGUIコンポーネント(com.fujitsu.jbk.guiパッケージ)、AWTコンポーネント(java.awtパッケージ)および、SwingのGUIコンポーネント(javax.swingパッケージ)を組み合わせて使用するのは推奨されていません。どれかのコンポーネントだけで開発してください。