Swing学習ノートのモデルとレンダリング


http://blog.sina.com.cn/s/blog_4 b 6047 bc 0107 j 3.
         Javaベースクラス(JFC)Swingツールは、Javaプラットフォームを使用して高度にインタラクティブなグラフィックスユーザインターフェースを作成するクラスを提供する.Swingは非常にフレキシブルですが、そのためにもかなり複雑です.初心者はSwingを使って基本的なグラフィックユーザーインターフェース(GUI)を作ることができますが、複雑で専門的なGUIインターフェースを作成するには、Swingのアーキテクチャの基礎を理解しなければなりません.Swingで提供されるモデルとレンダリングに基づくコンポーネントは、高性能で拡張可能なGUIを構築するためのキーである.
Swingシステム構造
         最初にSmalltalkシステムのUIツールは、いわゆるモデル−ビュー−制御(MVC)モードを使用していたが、MVCは、データソースは画面とは別に表示されるべきであるという概念を導入した.これは優れた体系設計構造で、コードの再利用とプログラムの枠組みを促進することができます.Swingは変体MVCアーキテクチャを使用しています.
         典型的なSwing GUIコンポーネントは、少なくとも3つのオブジェクトを含みます.一つのComponent、一つのModelと一つのUI Delegateは、このフレームワークにおいて、Modelはデータの保存を担当しています.UI DelegateはModelからデータを取得し、画面にレンダリングすることに責任を負っています.Componentは、ModelとDelegateの間の操作を調整しながら、SwingをAWTシステムウィンドウに埋め込みます.
        
なお、UI Delegateオブジェクトは、動作時に動的に入れ替わることができ、これによりSwingは挿抜可能な外観を備えている.
         SwingのMVC構造は明らかに柔軟性の利点を持っていますが、この構造は通常いくつかのプログラムの遅れの原因として指摘されています.MVC構造に基づいて、追加のリダイレクトをサポートするために、より多くの方法を呼び出す必要がありますが、実はここでの消費は小さいです.Swingベースのアプリケーションプログラムprofileの結果、model-view分離のオーバーヘッドは無視でき、CPU総オーバーヘッドの1%未満、複雑なSwingユーザインターフェースの多くの処理イベントは、実際には底の図形操作に費やされた.Swingのmodel-view構造は低性能の根源ではなく、拡張可能なプログラムを構築するための鍵です.
ベクトルコンポーネント
         Swingは、JTable、JTree、JList、およびJCompboboxを含む、大きなデータセットを扱うコンポーネントを提供しています.これらのベクトル構成要素は、多くのメモリを占有することを避けるために、数千、数百万のデータを処理することができるように設計されており、これらのコンポーネントはSwingのアーキテクチャでレンダリング器概念を増加させている.図は、レンタ構造を追加したSwingアーキテクチャである.
レンタ(Renderer)
         これらのより複雑なSwingコンポーネントでは、レンダリングは、拡張可能性を提供する鍵である.私たちはJTableをレンダリング装置の例とします.デフォルトの表の各一マスにはJLabelがあるかもしれません.これは比較的小さいデータセットにとってはいいですが、ビッグデータセットには通用しません.例えば、この表を使って1000 x 1000のデータセットを表示すると、必要なメモリが1 G必要になります.
         この拡張問題を解決すれば?SwingのJTableは同じタイプの格子を一つのセットで描きます.例えば、すべてのStringオブジェクトの格子は同じコンポーネントで描かれています.このような種類のコンポーネントはレンダリングと呼ばれ、レンダリング器を用いて複数のテーブルを表示することで、大きなデータテーブル記憶空間が大幅に低減されます.
         レンダリング器が表を表示するために用いられる場合、JTableはmodelから格子中のデータを取得し、これらのデータを用いてレンダリング器を構成し、レンダリング器を用いて格子を描画する.次に、レンダリング器は次の格子に移動し、その後、このプロセスを繰り返します.
         レンダリング器とモデルを操作してこのプロセスを制御することができます.JTree、JList、JCompboboxを含むすべてのベクトルコンポーネントはレンダリング方法を使用しています.JTableに限らず.
モデル(Model)
         Swingを直接操作するモデル(Model)は拡張可能なユーザーインターフェースの作成に極めて重要である.
         以下のコードは、JCompboxにデータ項目を追加する通常のやり方です.

JComboBox box = new JComboBox();
for (int i = 0; i < numItems; i++) {
    box.addItem(new Integer(i));
}
         これらのコードは単にJCompboboxにデータ項目を追加するだけで、コードはAWTのChoiceにオプションを追加するのと似ています.この方法は小さいデータ量でいいですが、大量のデータを追加すると明らかに遅くなります.
         上のコードは明確にモデルを引用していないが、JCompboxのモデルオブジェクトは実際にこのプロセスに参加しています.addItemを呼び出すたびに、JCompbox内部で多くの動作が発生しました.明らかに、モデルを直接操作するとより効率的になります.
Vector v = new Vector(numItems);
for (int i = 0; i < numItems; i++) {
   v.add(new Integer(i));
}
ComboBoxModel model = new DefaultComboBoxModel(v);
JComboBox box = new JComboBox(model);
         なぜもっと早いですか?原因は二つあります.第一に、すべての項目は一度にモデルに追加されますので、一つのイベントだけが発行されます.これはより少ないイベントトリガを意味し、より少ない方法で起動します.第二に、変化を通知する必要があるオブジェクトがより少ないため、全体の作業量は、トリガ数に対して、リスタ数を乗じたものとなる.モデルは新しく作成されたので、上記のリスタはゼロであり、これはイベントをトリガしないことを意味する.
         上記の例から2点を学ぶことができます.
    *      可能な限りロット操作を行い、トリガイベントの数を最小限に抑える.
    *      モデルの内容を初期化または完全に置換する必要がある場合は、モデルの再生成を考慮し、既存のモデルを使用しないでください.既にモデル上に多くのリスニング器を保持しています.新たに生成されたモデルはリスニング器がなく、不要な処理関数の調整を回避します.
             トリガイベントの数があなたのプログラムの起動時間に大きく影響します.また、ダイアログを開く時間と同様の操作時間にも影響します.