(57)【特許請求の範囲】
【請求項１】
コンピュータ・システムにおけるグラフィカル・ユーザ・インターフェイスの画面要素の入力デバイス・サポートを検出する方法であって、
（ａ）画面要素のクラス定義を、現在のクラス定義として設定するステップと、
（ｂ）前記現在のクラス定義を調べて、デバイスの入力を処理するための所与のメソッドが、前記クラス定義に存在するか否かを決定するステップと、
（ｃ）前記所与のメソッドが、前記現在のクラスの前記定義に存在する場合には、前記画面要素を、前記デバイスに対する入力をサポートするとしてマーク付けするステップと、
（ｄ）前記所与のメソッドが、前記現在のクラスの前記定義に存在しない場合には、前記現在のクラスのスーパークラスを、前記現在のクラスとして設定するステップと、
（ｅ）前記現在のクラスが、オリジネーティングスーパークラスであるか否かを決定するステップと、
（ｆ）前記現在のクラスが、前記オリジネーティングスーパークラスである場合には、前記画面要素を、デバイス入力をサポートしないとしてマーク付けするステップと、
（ｇ）前記現在のクラスが、前記オリジネーティングスーパークラスでない場合には、処理はステップ（ａ）に戻り、（ａ）からのステップを再度行うステップと、を含む、グラフィカル・ユーザ・インターフェイスの画面要素の入力デバイス・サポートを検出する方法。
【請求項２】
前記画面要素を、前記デバイスに対する入力をサポートするとしてマーク付けするステップが、前記画面要素の外観を変更するステップを含む請求項１に記載の方法。
【請求項３】
前記メソッドは、画面要素のオブジェクト・インスタンスが構築されるときに実行される請求項１に記載の方法。
【請求項４】
前記メソッドが、１つ以上のコンストラクタ・メソッドで実行される請求項１に記載の方法。
【請求項５】
前記メソッドが、ランタイムに、メモリにロードされているＪａｖａバイトコード・クラス定義に対して実行される請求項１に記載の方法。
【請求項６】
クラス定義の内容を検査するメソッドを含むリフレクション・アプリケーション・プログラミング・インターフェイス（ＡＰＩ）が、バイトコード・クラス・ファイルに所与のメソッドがあるかどうかを調べるために用いられる請求項５に記載の方法。
【請求項７】
グラフィカル・ユーザ・インターフェイスの画面要素の入力デバイス・サポートを検出する方法をコンピュータが実行するように定められたプログラム・コードを記憶したコンピュータ読み取り可能な媒体であって、前記方法は、
（ａ）画面要素のクラス定義を、現在のクラス定義として設定するステップと、
（ｂ）前記現在のクラス定義を調べて、デバイスの入力を処理するための所与のメソッドが、前記クラス定義に存在するか否かを決定するステップと、
（ｃ）前記所与のメソッドが、前記現在のクラスの前記定義に存在する場合には、前記画面要素を、前記デバイスに対する入力をサポートするとしてマーク付けするステップと、
（ｄ）前記所与のメソッドが、前記現在のクラスの前記定義に存在しない場合には、前記現在のクラスのスーパークラスを、前記現在のクラスとして設定するステップと、
（ｅ）前記現在のクラスが、オリジネーティングスーパークラスであるか否かを決定するステップと、
（ｆ）前記現在のクラスが、前記オリジネーティングスーパークラスである場合には、前記画面要素を、デバイス入力をサポートしないとしてマーク付けするステップと、
（ｇ）前記現在のクラスが、前記オリジネーティングスーパークラスでない場合には、処理はステップ（ａ）に戻り、（ａ）からのステップを再度行うステップと、を含む、コンピュータ読み取り可能な媒体。
【請求項８】
前記画面要素を、前記デバイスに対する入力をサポートするとしてマーク付けするステップが、前記画面要素の外観を変更するステップを含む請求項７に記載のコンピュータ読み取り可能な媒体。
【請求項９】
前記メソッドは、画面要素のオブジェクト・インスタンスが構築されるときに実行される請求項７に記載のコンピュータ読み取り可能な媒体。
【請求項１０】
前記メソッドが、１つ以上のコンストラクタ・メソッドで実行される請求項７に記載のコンピュータ読み取り可能な媒体。
【請求項１１】
前記メソッドが、ランタイムに、メモリにロードされているＪａｖａバイトコード・クラス定義に対して実行される請求項７に記載のコンピュータ読み取り可能な媒体。
【請求項１２】
クラス定義の内容を検査するメソッドを含むリフレクション・アプリケーション・プログラミング・インターフェイス（ＡＰＩ）が、バイトコード・クラス・ファイルに所与のメソッドがあるかどうかを調べるために用いられる請求項１１に記載のコンピュータ読み取り可能な媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、グラフィカル・ユーザ・インタフェースの構成要素に関し、詳細には、グラフィカル・ユーザ・インタフェースの構成要素による装置サポートに関する。
【０００２】
本特許文書の開示の一部には、著作権保護を受ける内容が含まれる。著作権所有者は、アメリカ特許庁のファイルまたは記録に記載された本特許文書または本特許開示をそのまま複製することには異議を唱えないが、それ以外の場合にはすべての著作権を留保する。Ｓｕｎ、Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ、Ｓｕｎロゴ、Ｊａｖａ、およびＪａｖａベースのすべての商標およびロゴは、米国および他の国のＳｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃ．の商標または登録商標である。すべてのＳＰＡＲＣ商標は、ライセンスの下で使用され、米国および他の国のＳＰＡＲＣ  Ｉｎｔｅｒｎａｔｉｏｎａｌの商標または登録商標である。ＳＰＡＲＣ商標を有する製品は、Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃ．によって開発されたアーキテクチャに基づく製品である。
【０００３】
【従来の技術】
グラフィカル・ユーザ・インタフェース（ＧＵＩ）は、コンピュータ・システムのビデオ・ディスプレイ（または画面）に情報を表示するために使用される。ＧＵＩは通常、ウィンドウ、アイコン、ラベル、フィールドなどの画面要素を含む。画面要素とは、ＧＵＩ内の表示と、ＧＵＩ内の画面要素の表示を生成し制御するために使用されるプログラム・コードとの両方を指す。画面要素は通常、ユーザがコンピュータ・システムとの対話に使用する物理装置を制御する１つまたは複数のソフトウェア・ルーチン層で構成されたオペレーティング・システムと対話する。ユーザは、たとえば、キーボードやポインティング・デバイス（たとえば、マウス、タッチ・スクリーンなど）など１つまたは複数の入力装置を使用することができる。ユーザがコンピュータ・システムの入力装置のうちの１つを使用して入力を生成すると、ユーザの入力を受け取り、現在処理しているか、あるいはすでに処理したことを示すためにビデオ・ディスプレイによって表示されるフィードバックをＧＵＩで生成することができる。画面要素の装置機能および予想と、コンピュータ・システムの実際の装置機能との間に互換性がないと問題が生じる。たとえば、画面要素は、コンピュータ・システムでは利用できない入力装置をサポートすることができる。
【０００４】
現在利用できる大部分のパーソナル・コンピュータは、ＧＵＩ内で所与の画面要素にわたって移動するのに使用することのできるマウス入力装置を備える。画面要素によって占有されているＧＵＩの領域内で行われたマウス入力は、画面要素へ転送することができる。画面要素は、マウス入力を処理し、ＧＵＩで表示されるフィードバックを生成することができる。たとえば、ユーザは、ＧＵＩ内の画面要素の領域内で移動し、マウス上のボタンを押して画面要素を選択することができる。画面要素は、マウスがその領域内にあり（たとえば、「マウス入力」イベント）、かつユーザがその領域内でマウス・ボタンを押した（たとえば、「マウス・ダウン」イベント）ことを知る。このプロセスを通常、画面要素の選択と呼ぶ。画面要素が選択されると、選択された画面要素は通常、ＧＵＩ内でフォーカスとなる。たとえば、選択された画面要素の表示をその前の表示および他の画面要素の表示と異なるものにして、現在選択されている画面要素として識別することができる。入力装置からのイベントは通常、現在選択されている（あるいはフォーカスされている）画面要素へ向けて送られる。
【０００５】
上記の例では、コンピュータ・システム上でマウス入力装置を利用できるものと仮定する。さらに、画面要素が、マウスから受け取った入力を処理できるものと仮定する。しかし、所与の入力装置を利用できないか、あるいは画面要素が所与の入力装置をサポートできない可能性がある。その入力を画面要素によって処理することのできる入力装置の種類を判定できると有益である。すなわち、装置入力を画面要素へ向けて送る前に、この画面要素が装置入力を処理できるかどうかがわかると有益である。さらに、画面要素が所与の入力装置をサポートできるときに、この装置がコンピュータ・システムに物理的に接続されていない場合でも、この種の入力装置の外観および雰囲気をＧＵＩに示すことができれば有益である。
【０００６】
画面要素が装置入力を処理できるかどうかの検出に関連する問題は、Ｊａｖａ仮想マシンの処理環境を検討し、オブジェクト指向プログラミングの概要を示すことによって、よりよく理解することができる。
【０００７】
オブジェクト指向プログラミング
オブジェクト指向プログラミングは、ある基本構成単位を組み合わせ、これらの構成単位の間の関係を作成することによって、コンピュータ・プログラムを作成する方法である。オブジェクト指向プログラミング・システムの構成単位を「オブジェクト」と呼ぶ。オブジェクト指向プログラミング言語を使用してソフトウェア・アプリケーションを書くことができ、それによって、このようなオブジェクトを使用してプログラムの機能が実施される。
【０００８】
オブジェクトとは、データ構造（１つまたは複数のインスタンス変数）と、このデータを使用するか、あるいはこのデータに影響を与えることのできるオペレーション（メソッド）とをグループ化するプログラミング・ユニットである。したがって、オブジェクトは、データと、このデータに対して実行できる１つまたは複数のオペレーションすなわち手続きとからなる。データとオペレーションを結合して単一の構成単位を形成することを「カプセル化」と呼ぶ。
【０００９】
オブジェクトには、「メッセージ」を受け取ったときにオブジェクトのメソッドのうちの１つを実行するよう命令することができる。メッセージとは、あるメソッドを実行するためにオブジェクトに送られるコマンドまたは命令である。メッセージは、メソッド選択（たとえば、メソッド名）および複数の引数からなる。メッセージは、どんなオペレーションを実行すべきかを受信側オブジェクトに伝える。
【００１０】
オブジェクト指向プログラミングの１つの利点は、メソッドを呼び出す方法である。オブジェクトにメッセージを送るとき、このメッセージが、あるメソッドをどのように実行すべきかをオブジェクトに命令する必要はない。必要なのは、オブジェクトがこのメソッドを実行することを要求することだけである。このため、プログラム開発が大幅に簡略化される。
【００１１】
オブジェクト指向プログラミング言語は主として、「クラス」体系に基づく言語である。クラス・ベースのオブジェクト指向プログラミング体系は、Ｌｉｅｂｅｒｍａｎ著「Ｕｓｉｎｇ  Ｐｒｏｔｏｔｙｐｉｃａｌ  Ｏｂｊｅｃｔｓ  ｔｏＩｍｐｌｅｍｅｎｔ  Ｓｈａｒｅｄ  Ｂｅｈａｖｉｏｒ  ｉｎ  Ｏｂｊｅｃｔ−Ｏｒｉｅｎｔｅｄ  Ｓｙｓｔｅｍｓ」ＯＯＰＳＬＡ８６Ｐｒｏｃｅｅｄｉｎｇｓ、１９８６年９月、２１４ページないし２２３ページに概略的に記載されている。
【００１２】
オブジェクト・クラスは、通常はフィールド（たとえば、変数）とメソッドの両方を含むオブジェクトの定義を与える。オブジェクト・クラスは、特定の「オブジェクト・インスタンス」を作成するために使用される（語「オブジェクト」自体がしばしば、相互交換可能に特定のクラスまたは特定のインスタンスを指すために使用される）。オブジェクト・クラスのインスタンスは、そのクラスについて定義された変数およびメソッドを含む。同じオブジェクト・クラスから複数のインスタンスを作成することができる。オブジェクト・クラスから作成された各インスタンスを、同じタイプまたはクラスのインスタンスと言う。
【００１３】
一例を挙げると、従業員オブジェクト・クラスは、「名前」インスタンス変数および「給与」インスタンス変数と、「給与設定」メソッドとを含むことができる。従業員オブジェクトのインスタンスは、組織内の各従業員ごとに作成またはインスタンス化することができる。各オブジェクト・インスタンスをタイプ「従業員」のオブジェクト・インスタンスと言う。各従業員オブジェクト・インスタンスは、「名前」インスタンス変数および「給与」インスタンス変数と、「給与設定」メソッドとを含む。各従業員オブジェクト・インスタンス中の「名前」変数および「給与」変数に関連する値は、組織内の従業員の名前および給与を含む。従業員の従業員オブジェクトにメッセージを送り、「給与設定」メソッドを呼び出し、従業員の給与（すなわち、従業員の従業員オブジェクト内の「給与」変数に関連する値）を変更することができる。
【００１４】
オブジェクト・クラス定義が１つまたは複数のサブクラスを有するようにクラスの階層を定義することができる。サブクラスはその親（および親の親など）の定義を継承する。階層内の各サブクラスを、その親クラスによって指定されたふるまいに追加するか、あるいは各サブクラスによってこのふるまいを修正することができる。親クラスをそのサブクラスに対するスーパークラスと呼ぶ。いくつかのオブジェクト指向プログラミング言語は多重継承をサポートし、その場合、サブクラスは複数の親クラスからクラス定義を継承することができる。他のプログラミング言語は、単一の継承のみをサポートし、その場合、サブクラスは１つの親クラスのみのクラス定義の継承に制限される。Ｊａｖａプログラミング言語は、１組のコンスタントおよびアブストラクト・メソッド宣言を備える「インタフェース」として知られる機構も提供する。オブジェクト・クラスは、インタフェースで定義された抽象メソッドを実装することができる。インタフェースは単一継承と多重継承の両方を使用することができる。すなわち、インタフェースは複数の親インタフェースからインタフェース定義を継承することができる。
【００１５】
Ｊａｖａプログラミング言語およびプログラム実行
Ｊａｖａアプリケーションは通常、１つまたは複数のオブジェクト・クラスおよびインタフェースを含む。プログラムがマシン依存実行可能コードにコンパイルされる多くのプログラミング言語とは異なり、Ｊａｖａプログラミング言語で書かれたクラスは、マシン独立バイトコード・クラス・ファイルにコンパイルされる。各クラスは、クラス・ファイル・フォーマットと呼ばれるプラットフォーム独立フォーマットでコードおよびデータを含む。バイトコードは、命令を識別するコード（命令コード）と、命令を実行する際に使用されるゼロ個以上のオペランドとを含む。実行ビークルとして働くコンピュータ・システムは、仮想マシンと呼ばれるプログラムを含み、このプログラムは、Ｊａｖａプログラミング言語クラス・ファイル内のコード（すなわち、バイトコード）を実行する責任を負う。
【００１６】
アプリケーションは、独立Ｊａｖａアプリケーションとして設計するか、あるいはＨＴＭＬ（Ｈｙｐｅｒｔｅｘｔ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）文書中のアプレット・タグによって識別され、ブラウザ・アプリケーションによってロードされる「アプレット」として設計することができる。アプリケーションまたはアプレットに関連するクラス・ファイルは、ローカル・コンピューティング・システムに記憶するか、あるいはネットワークを介してアクセスできるサーバ上に記憶することができる。各Ｊａｖａプログラミング言語クラス・ファイルは、必要に応じて「クラス・ローダ」によってＪａｖａ仮想マシンにロードされる。
【００１７】
Ｊａｖａアプレットのクラスは、Ｊａｖａアプレットを実行している間に初めて参照されたときに、必要に応じてネットワークからロードされる（サーバ上に記憶される）か、あるいはローカル・ファイル・システムからロードされる。仮想マシンは、各クラス・ファイルを見つけてロードし、クラス・ファイル・フォーマットを解析し、クラスの様々な構成要素用のメモリを割り付け、このクラスを、すでにロードされている他のクラスとリンクする。このプロセスは、クラスのコードを仮想マシンによって容易に実行できるようにする。
【００１８】
Ｊａｖａアプリケーションおよびアプレットはしばしば、クラス・ライブラリを使用する。クラス・ライブラリ内のクラスは、「ネイティブ・メソッド」と呼ばれるものを含むことができる。ネイティブ・メソッドとは、ネイティブ・コードで構成されたメソッドである。Ｊａｖａプログラミング言語を使用して書かれたプログラミング文から生成されたクラス・ファイルに含まれるバイトコードは、マシン独立コードの一例である。ネイティブ・コードとは通常、プラットフォーム依存コードを指す。しかし、ネイティブ・コードは他のプログラム・コードを指すことができる。たとえば、ネイティブ・コードは、二次プログラミング言語（すなわち、アプリケーションを書くために使用される一次プログラミング言語以外の言語）を使用して書かれたコードでもよい。
【００１９】
アプリケーションおよびアプレットは場合によっては、ネイティブ・メソッドを宣言するクラスを含む。ネイティブ・メソッド宣言は、キーワード「ネイティブ」、メソッドの名前、メソッドのリターン・タイプ、およびメソッドに渡されるパラメータを指定する。Ｊａｖａプログラミング言語で書かれた「標準メソッド」（すなわち、非ネイティブ・メソッド）とは異なり、それぞれのクラス内にネイティブ・メソッドの本体はない。その代わり、ネイティブ・メソッドのルーチンは、リンク済みライブラリをサポートする所与のプラットフォームに特有のリンキング機能を使用して実行時に仮想マシン内の所与のクラスに動的にリンクされるコンパイル済みネイティブ・コード（たとえば、ＣまたはＣ＋＋プログラミング言語で書かれ、バイナリー形式にコンパイルされたコード）によって実行される。
【００２０】
たとえば、ＳｏｌａｒｉｓTM環境やＵＮＩＸ環境では、バイナリ形式のネイティブ・コードを含むリンク済みライブラリを、「．ｓｏ」ファイルとして書かれた「共用オブジェクト」ライブラリとして実装することができる。Ｗｉｎｄｏｗｓ環境では、リンク済みライブラリは、「．ｄｌｌ」ファイルとして書かれた動的リンク（または動的ロード可能）ライブラリの形態をとることができる。他の場合には所与のプラットフォームの専用のハードウェア（たとえば、ディスプレイ・ハードウェア）またはソフトウェア（たとえば、データベース・ドライバ）とのインタフェースをとることなど、Ｊａｖａプログラミング言語ではサポートされない機能を実行するためにネイティブ・コードを使用することができる。レンダリングなど計算を多用する機能を高速化するためにネイティブ・コードを使用することもできる。
【００２１】
ネイティブ・メソッドを含むクラスは、それぞれのリンク済みライブラリをロードするための以下の呼出しも含む。
System.loadLibrary(“Sample")
この場合、「Ｓａｍｐｌｅ」はリンク済みライブラリの名前であり、通常、ホスト・オペレーティング・システム（たとえば、ＵＮＩＸ、Ｗｉｎｄｏｗｓなど）に応じて、「ｌｉｂＳａｍｐｌｅ．ｓｏ」または「Ｓａｍｐｌｅ．ｄｌｌ」と呼ばれるファイルに記憶される。リンク済みライブラリは通常、関連するクラスが仮想マシン内でインスタンス化されるときにロードされる。
【００２２】
ネイティブ・コードのリンク済みライブラリは、リンク済みライブラリがクラス内のネイティブ・メソッドのメソッド・シグネチャーを認識することができるように、関連するクラスのスタブ情報およびヘッダ情報でコンパイルされる。次いで、ネイティブ・メソッドの処理系が、リンク済みライブラリ内のネイティブ・コード関数（Ｃ関数など）として生成される。実行時に、ネイティブ・メソッドが呼び出されると、（たとえば、ネイティブ・メソッド・フレームをネイティブ・メソッド・スタック上にプッシュすることによって）呼び出されたメソッドに対応するリンク済みライブラリ内の関数に制御が渡される。リンク済みライブラリ内のネイティブ・コードは、この関数を実行し、制御をＪａｖａアプリケーションまたはアプレットに戻す。
【００２３】
動的リンク済みライブラリとは異なり、静的リンク済みライブラリのコードはコンパイル中にリンクされる。Ｓｏｌａｒｉｓ環境では、静的リンク済みライブラリは通常、「．ａ」拡張子（たとえば、「ｓａｍｐｌｅ．ａ」）を有するファイルに記憶される。たとえば、記憶域（たとえば、セットトップ・ボックスやパーソナル・データ・アシスタント）の量が限られている場合、動的リンク済みライブラリの代わりに静的リンク済みライブラリを使用することができる。
【００２４】
図１は、処理システム用のコンパイル環境および実行時環境を示す。コンパイル環境で、ソフトウェア開発者は、Ｊａｖａプログラミング言語を使用して書かれたソース・ファイル１００を作成する。このファイルは、データ構造、メソッド処理系、および他のクラスの参照を含む、プログラマ読取り可能クラス定義を含む。ソース・ファイル１００はＪａｖａコンパイラ１０１に供給され、Ｊａｖａコンパイラ１０１はソース・ファイル１００をコンパイルし、Ｊａｖａ仮想マシンによって実行できるバイトコードを含むコンパイル済み「．ｃｌａｓｓ」（またはクラス）ファイル１０２を生成する。クラス・ファイル１０２は、サーバ上に（たとえば、一次記憶域または永久記憶域内に）記憶され、ネットワークを介してダウンロードすることができる。別法として、クラス・ファイル１０２をローカルにクライアント・プラットフォーム上のディレクトリに記憶することができる。
【００２５】
実行時環境はＪａｖａ仮想マシン（ＪＶＭ）１０５を含む。Ｊａｖａ仮想マシン１０５は、バイトコード・クラス・ファイルを実行し、実行中の必要に応じてオペレーティング・システム１０９へのネイティブ・オペレーティング・システム（「Ｏ／Ｓ」）呼出しを実行することができる。Ｊａｖａ仮想マシン１０５は、バイトコード・クラスのマシン独立性と基本コンピュータ・ハードウェア１１０のマシン依存命令セットとの間の抽象レベルを生成すると共に、オペレーティング・システム１０９のプラットフォーム依存呼出しを行う。
【００２６】
クラス・ローダおよびバイトコード・ベリファイア（「クラス・ローダ」）１０３は、必要に応じて、バイトコード・クラス・ファイル１０２をＪａｖａ仮想マシンにロードし、Ｊａｖａプログラミング言語を使用して書かれたクラス・ライブラリ１０４をサポートする責任を負う。クラス・ローダ１０３はまた、セキュリティ規則が適切に実行されるように各クラス・ファイルのバイトコードを検証する。実行時システム１０８では、インタプリタ１０６がバイトコードを直接実行するか、あるいはバイトコードをハードウェア１１０内のプロセッサによって実行できるように「ジャストインタイム」（ＪＩＴ）コンパイラ１０７がバイトコードをマシン・コードに変換する。たとえば、リンク済みライブラリ１１１の形式のネイティブ・コードは、関連するネイティブ・メソッドを含む（たとえば、クラス・ライブラリ１０４の）クラスが仮想マシン内でインスタンス化されるときにロードされる。
【００２７】
インタプリタ１０６は、バイトコード命令を読み取り、解釈し、実行し、その後で次の命令に進む。ＪＩＴコンパイラ１０７は、複数のバイトコード命令を、次いで実行されるマシン・コードに変換することができる。バイトコードを実行する前にコンパイルすることによって、実行がより高速になる。たとえば、プログラムを実行する際に同じバイトコード命令を複数回実行する場合、このバイトコード命令を実行するたびに、インタプリタ１０６を使用してこの命令を解釈しなければならない。ＪＩＴコンパイラ１０７を使用してプログラムをコンパイルする場合、バイトコード命令がプログラム内で実行される回数にかかわらず、バイトコード命令を１度変換することができる。さらに、コンパイルされたもの（すなわち、ＪＩＴコンパイラ１０７の出力）を保持する場合、プログラム実行中に各命令を変換する必要はない。
【００２８】
仮想マシン１０５の実行時システム１０８は一般的なスタック・アーキテクチャをサポートする。基本ハードウェア１１０によってこの一般的なスタック・アーキテクチャをサポートする方式は、特定の仮想マシン処理系によって決定され、バイトコードを解釈またはＪＩＴコンパイルする方法に反映される。
【００２９】
図２は、実行時システム１０８内のスタック・アーキテクチャをサポートする実行時データ領域を示す。図２で、実行時データ領域２００は、１つまたは複数のスレッド・ベースのデータ領域２０７を含む。各スレッド・ベースのデータ領域２０７は、プログラム・カウンタ・レジスタ（ＰＣ  ＲＥＧ）２０８、ローカル変数ポインタ・レジスタ（ＶＡＲＳ  ＲＥＧ）２０９、フレーム・レジスタ（ＦＲＡＭＥ  ＲＥＧ）２１０、オペランド・スタック・ポインタ・レジスタ（ＯＰＴＯＰ  ＲＥＧ）２１１、スタック２１２、および任意選択でネイティブ・メソッド・スタック２１６を備える。スタック２１２は、オペランド・スタック２１４およびローカル変数２１５を含む１つまたは複数のフレーム２１３を備える。ネイティブ・メソッド・スタック２１６は、１つまたは複数のネイティブ・メソッド・フレーム２１７を備える。
【００３０】
実行時データ領域２００はさらに、共用ヒープ２０１を備える。ヒープ２０１は実行時データ領域であり、この領域から、すべてのクラス・インスタンスおよびアレイ用のメモリが割り付けられる。共用ヒープ２０１はメソッド領域２０２を備え、メソッド領域２０２はすべてのスレッドの間で共用される。メソッド領域２０２は、ロードされた各クラス・ファイルから抽出された情報を記憶する１つまたは複数のクラス・ベース・データ領域２０３を備える。たとえば、クラス・ベースのデータ領域２０３は、コンスタント・プール２０４、フィールド／メソッド・データ２０５、メソッドおよびコンストラクタ用コード２０６などのコード構造を備えることができる。メソッド／コンストラクタ・コード２０６はメソッド・テーブル２０６と呼ぶこともある。
【００３１】
仮想マシンは、多数の実行スレッドを一度にサポートすることができる。各スレッドはそれ自体のスレッド・ベース・データ領域２０７を有する。任意の時点で、各スレッドは、単一のメソッド、すなわちそのメソッドの「現在のメソッド」のコードを実行している。「現在のメソッド」がネイティブ・メソッドではない場合、プログラム・カウンタ・レジスタ２０８は、現在実行されている仮想マシン命令のアドレスを含む。「現在のメソッド」がネイティブ・メソッドである場合、プログラム・カウンタ・レジスタ２０８の値は不定である。フレーム・レジスタ２１０は、メソッド領域２０２内の現在のメソッドの位置を指し示す。
【００３２】
【課題を解決するための手段】
本発明の実施態様は、グラフィカル・ユーザ・インタフェース（ＧＵＩ）の画面要素によって所与の入力装置に対するサポートを検出する技法を備える。本発明の一実施形態では、画面要素のプログラム・コードの実行時バージョンが調べられ、装置のイベントを処理する能力が検出される。本発明の他の実施態様では、画面要素が所与の入力装置のイベントの処理を他のプログラム・コードにデリゲートしたかどうかが実行時に判定される。本発明の他の実施形態では、画面要素のプログラム・コードの実行時バージョンが調べられ、画面要素が所与の入力装置をサポートするか否かを示すプログラム・コードの宣言が検出される。本発明の他の実施態様では、上記で識別した実施態様のうちの１つまたは複数を組み合わせることができる。
【００３３】
【発明の実施の形態】
グラフィカル・ユーザ・インタフェースにおける装置サポートを検出する方法および装置について説明する。以下の説明では、本発明をより完全に説明するために多数の特定の詳細について述べる。しかし、当業者には、これらの特定の詳細なしに本発明を実施できることが明らかであろう。他の例では、本発明を不明確にしないように周知の特徴については詳しく説明していない。
【００３４】
本発明の実施形態は、グラフィカル・ユーザ・インタフェース（ＧＵＩ）の画面要素によって所与の入力装置に対するサポートを検出する技法を備える。本発明の一実施形態では、画面要素のプログラム・コードの実行時バージョンが調べられ、装置のイベントを処理する能力が検出される。本発明の他の実施形態では、画面要素が所与の入力装置のイベントの処理を他のプログラム・コードにデリゲートしたかどうかが実行時に判定される。本発明の他の実施形態では、画面要素のプログラム・コードの実行時バージョンが調べられ、画面要素が所与の入力装置をサポートするか否かを示すプログラム・コードの宣言が検出される。本発明の他の実施形態では、上記で識別した実施形態のうちの１つまたは複数を組み合わせることができる。
【００３５】
入力装置に対するサポートの存在を判定することによって、ＧＵＩディスプレイに画面要素が現れる。さらに、入力装置に対するサポートを識別することによって、どの画面要素が入力装置のイベントを受け取るかどうかを判定することが困難な場合に、画面要素の識別を容易にすることができる。たとえば、複数の画面要素によって占有されるＧＵＩの領域内にポインティング・デバイス（たとえば、マウス）が位置決めされている場合、このポインティング・デバイスのイベントを処理する能力を有する画面要素にこのイベントを送ることができる。
【００３６】
１つまたは複数の入力装置を利用することができない場合にも本発明の実施形態を使用することもできる。たとえば、テレビジョン、またはＧＵＩを含む他の情報器械（情報器械の他の例には、電子アドレス・ブックおよび／またはパーソナル・オーガナイザ、スマート・テレフォン、電子メール装置が含まれる）用のセットトップ・ボックスは、入力用のキーボード装置を含むだけでよい。ユーザは、キーボード上の方向キー（たとえば、矢印キー）を使用してマウスをまねることができる。本発明の１つまたは複数の実施形態を使用する場合、画面要素がマウス入力をサポートするかどうかが判定される。そうである場合、マウス・イベントを画面要素へ送ることができる。また、通常はマウスに関連するアイコン（たとえば、矢印）を表示し、方向キーに関連する移動に対応するようにＧＵＩ内で移動することができる。したがって、マウス入力装置のないシステムに対応するように画面要素を修正する必要はない。
【００３７】
図７は、本発明の１つまたは複数の実施形態による画面要素を含むＧＵＩ７００を示す。本発明の実施形態は、画面要素７０２がマウス装置をサポートしないという実行時判定を下すために使用することができる。しかし、本発明の１つまたは複数の実施形態を使用して、画面要素７０６がマウス装置をサポートすることを判定することができる。画面要素７０６は、他の画面要素（たとえば、画面要素７０４）を含むことができるという点でコンテナーである。
【００３８】
画面要素７０６の外観および雰囲気で、画面要素７０６がマウス入力をサポートすることを識別することができる。この例では、ＧＵＩ７００内にマウス・アイコン７０８が表示されている。マウス・アイコン７０８は、受け取った位置入力（たとえば、位置キーやマウス移動）を反映するように画面要素７０６内で移動することができる。画面要素７０６の外側の位置入力を受け取った場合は、アイコン７０８をＧＵＩ７００の表示から削除することができる。ＧＵＩ７００内の画面要素７０６にフォーカス指示が与えられた場合、画面要素７００の外側の位置入力を受け取ったときと同様に、このフォーカス指示をＧＵＩ７００から削除することができる。
【００３９】
前の例は、システムが所与の入力装置を含まないものと仮定している。しかし、ユーザが１つの入力装置を使用して他の利用可能な装置をシミュレートまたはエミュレートする必要があることは明らかであろう。たとえば、ユーザは、ユーザのシステムがマウスを含む場合でも、キーボードの方向キーを使用してマウス入力をシミュレートすることができる。
【００４０】
本明細書では、本発明の実施形態をマウス装置に関して説明するが、本発明の実施形態を他の装置に適用できることは明らかであろう。さらに、本発明の実施形態はＪａｖａプログラミング言語に関して記載されている。本発明の実施形態と共に他のプログラミング言語を使用することもできることは明らかであろう。
【００４１】
メソッド検査
本発明の１つまたは複数の実施形態では、画面要素は、Ｊａｖａプログラミング言語を使用して書かれたオブジェクト指向オブジェクトである。（バイトコードの形式の）画面要素の実行時バージョンを調べ、所与の装置タイプを処理するメソッドが存在するかどうかを判定することができる。
【００４２】
Ｊａｖａプログラミング言語などのオブジェクト指向プログラミング言語は、実行時バージョンが画面要素のクラス定義のバイトコード・バージョンである。バイトコード・クラス定義は、この定義が少なくとも１つの「装置処理」メソッドを含むかどうかを判定するために調べられる。
【００４３】
オブジェクト・クラスは、他のクラス（たとえば、スーパークラス）からメソッドを継承することができる。画面要素のクラス定義が装置メソッドを含まない場合、本発明の実施形態は、画面要素のスーパークラス・バイトコード・オブジェクト・クラス定義を調べ、スーパークラス定義が少なくとも１つの「装置処理」メソッドを含むかどうかを判定する。
【００４４】
いくつかの例では、画面要素は、入力装置メソッド抽象化を含むオリジネーティング（またはアルティメット）スーパークラスから継承する。この場合、メソッド検査ではオリジネーティングスーパークラスは調べられない。たとえば、ＡＷＴボタンなどの抽象ウィンドウ・ツールキット（ＡＷＴ）内の画面要素は、オリジネーティングスーパークラス（ｊａｖａ．ａｗｔ．Ｃｏｍｐｏｎｅｎｔ）から始まるクラスの階層から継承する。ｊａｖａ．ａｗｔ．Ｃｏｍｐｏｎｅｎｔオリジネーティングクラスはマウス・イベント・ハンドラを含む。ＡＷＴボタン画面要素のスーパークラスを調べるプロセスは、オリジネーティングスーパークラスに到達する前に終了する。
【００４５】
画面要素（たとえば、Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃ．から市販されているＪａｖａ  Ｄｅｖｅｌｏｐｍｅｎｔ  Ｋｉｔ  バージョン１．０のＡＷＴを使用して開発されたボタン・クラス）がマウス入力をサポートするかどうかを検出するために、画面要素のバイトコード・クラス定義に対してメソッド検査が実行され、少なくとも１つの「マウス処理」メソッドが検出される。以下に、本発明の１つまたは複数の実施形態で検出される「マウス処理」メソッドの例を示す。
−  ｍｏｕｓｅＥｎｔｅｒ（）
−  ｍｏｕｓｅＥｘｉｔ（）
−  ｍｏｕｓｅＤｏｗｎ（）
−  ｍｏｕｓｅＵｐ（）
−  ｍｏｕｓｅＤｒａｇ（）
−  ｍｏｕｓｅＭｏｖｅ（）
【００４６】
画面要素のバイトコード・クラス定義でこれらのマウス処理メソッドのうちの少なくとも１つが検出された場合、その画面要素は、マウス入力をサポートできる画面要素としてマーク付けされる。画面要素がマウス入力をサポートできることを示す表示を使用して、ＧＵＩ内のこの画面要素の外観および雰囲気を修正することもできる。
【００４７】
図３は本発明の実施形態によるメソッド検査プロセス・フローの一例を示す。このプロセス・フローは、クラス定義にメソッド（たとえば、上記で識別したマウス・イベント・メソッドのうちの１つなど、装置の入力を処理するメソッド）があるかどうかを調べる。装置メソッドがクラス定義内に存在する場合、この画面要素はこの装置をサポートすると仮定される。本発明の一実施形態では、１つの装置メソッドが見つかるまで、プロセス・フローが各装置メソッドごとに実行される。
【００４８】
ステップ３０２で、画面要素のクラス定義が現在のクラス定義になる。ステップ３０４で、現在のクラス定義が調べられ、この定義内に所与のメソッドが存在するかどうかが判定される。存在する場合、処理はステップ３１２に進み、画面要素が所与の装置に関する入力をサポートする画面要素としてマーク付けされる。処理はステップ３１６で終了する。
【００４９】
ステップ３０４でメソッドが見つからなかった場合、処理はステップ３０８に進み、現在のクラスのスーパークラスが得られる。このスーパークラスは現在のクラスになる。ステップ３１０で、現在のクラスがオリジネーティングスーパークラス（たとえば、ｊａｖａ．ａｗｔ．Ｃｏｍｐｏｎｅｎｔ）であるかどうかが判定される。そうである場合、処理はステップ３１４に進み、画面要素が装置入力をサポートしない画面要素としてマーク付けされる。処理はステップ３１６で終了する。ステップ３１０で、現在のクラスがオリジネーティングスーパークラスではないと判定された場合、処理はステップ３０４に戻り、現在のクラスに装置メソッドがあるかどうかを調べる。
【００５０】
本発明の一実施形態では、メモリにロードされたＪａｖａバイトコード・クラス定義に対して、実行時に検出プロセス（たとえば、図３のプロセス・フロー）が実行される。クラス定義の内容を検査するメソッドを含むリフレクション・アプリケーション・プログラミング・インタフェース（ＡＰＩ）を使用して、バイトコード・クラス・ファイルに所与のメソッドがあるかどうかを調べられる。たとえば、リフレクションＡＰＩのｇｅｔＤｅｃｌａｒｅＭｅｔｈｏｄメソッドを使用して、クラス定義に、指定されたメソッドがあるかどうかを検査し、指定されたメソッドを反映するメソッド・オブジェクトを返すか、あるいは指定されたメソッドが見つからない場合には例外（たとえば、ＮｏＳｕｃｈＭｅｔｈｏｄ例外）を返す。
【００５１】
本発明の一実施形態では、画面要素のオブジェクト・インスタンスを構築する際に（すなわち、コンストラクタ・メソッドで）検出プロセスが実行される。Ｊａｖａ仮想マシンによって形成されるようなプラットフォーム独立仮想マシン環境では、マルチレイヤ・アーキテクチャを使用してＧＵＩが生成される。マルチレイヤ・アーキテクチャでは、プラットフォーム独立画面要素オブジェクト・インスタンスは１つまたは複数のプラットフォーム依存画面要素オブジェクト・インスタンスと共に構築される。ピア・オブジェクト・インスタンスは、プラットフォーム独立インスタンスとプラットフォーム依存オブジェクト・インスタンスとの間のインタフェースを形成する。プラットフォーム独立オブジェクト、ピア・オブジェクト、またはプラットフォーム依存オブジェクトのコンストラクタ・メソッドで検出プロセスを実行することができる。
【００５２】
図４は、本発明の実施形態で使用されるマルチレイヤ・ウィンドウ・システムの一例を示す。
【００５３】
レイヤ４０２は、プラットフォーム独立レイヤを備える。レイヤ４０２は、開発者が、複数のプラットフォーム（たとえば、Ｗｉｎｄｏｗｓ９５、Ｗｉｎｄｏｗｓ  ＮＴ、ＯＳ／２、Ｓｏｌａｒｉｓ）上で実行できるＧＵＩを設計し実装できるようにする。このレイヤの一例は、Ｊａｖａプログラミング言語を使用して書かれたオブジェクト・クラスの集合を含むＡＷＴである。ＡＷＴは、ＧＵＩを構成する画面要素の特性およびふるまいを定義するオブジェクト・クラスを備える。たとえば、ＡＷＴボタン・オブジェクト・クラスは、ＧＵＩのボタン画面要素の特性およびふるまいを含む。ＡＷＴボタン・オブジェクト・クラスは、ボタン画面要素のプラットフォーム独立定義を与える。
【００５４】
レイヤ４０２のプラットフォーム独立画面要素はピア画面要素とのインタフェースをとる。ピア要素はピア・レイヤ４０４を備える。ピア・レイヤ４０４は、プラットフォーム特有画面要素とのインタフェースを形成するプラットフォーム特有抽象化を行う。たとえば、ＡＷＴボタン・インスタンスは、Ｗｉｎｄｏｗｓ９５ボタン・インスタンスとのインタフェースをとる対応するボタン・ピアを有する。
【００５５】
ピア・レイヤ４０４は、ネイティブ・インタフェース・レイヤ４０６を介してネイティブ・レイヤ４０８とのインタフェースをとる。ネイティブ・インタフェース・レイヤ４０６は、Ｊａｖａネイティブ・インタフェース（ＪＮＩ）、すなわち、Ｊａｖａ仮想マシン（ＶＭ）内で実行されるＪａｖａコードが、他のプログラミング言語（たとえば、Ｃ、Ｃ＋＋、アセンブリ）で書かれた、アプリケーションやライブラリなどのプログラム・コードと相互オペレーションすることを可能にするネイティブ・プログラミング・インタフェースでよい。ネイティブ・レイヤ４０８は、プラットフォーム特有のウィンドウ・システムおよび／またはオペレーティング・システム（たとえば、Ｗｉｎｄｏｗｓ９５やＭｏｔｉｆ）で構成される。Ｗｉｎｄｏｗｓプラットフォーム上では、Ｗｉｎｄｏｗｓボタン要素がネイティブ・レイヤ画面要素の例である。
【００５６】
一例を挙げれば、プラットフォーム独立レイヤ４０２内のＡＷＴボタンは、ピア・レイヤ４０４のボタン・ピアとのインタフェースをとる。Ｗｉｎｄｏｗｓプラットフォーム上で、ボタン・ピアは、ネイティブ・インタフェース・レイヤ４０６を介してネイティブ・レイヤ４０８のＷｉｎｄｏｗｓボタンとのインタフェースをとる。ＡＷＴボタン・インスタンスを構築すると、ボタン・ピア・インスタンスおよびＷｉｎｄｏｗｓボタン・インスタンスも構築される。これらのオブジェクト・クラスのそれぞれのコンストラクタ・メソッドが呼び出され、ボタン・インスタンスを作成する。たとえば、これらのコンストラクタ・メソッドのうちの１つまたは複数で検出プロセス（たとえば、図３の検出プロセス）を実行することができる。
【００５７】
デリゲーション
いくつかのプログラミング言語（たとえば、Ｊａｖａプログラミング言語を使用して書かれたＪａｖａ  Ｄｅｖｅｌｏｐｍｅｎｔ  ＫｉｔまたはＪＤＫバージョン１．１）では、デリゲーション・モデルによって、あるオブジェクトは他のオブジェクトに処理（たとえば、装置イベント処理）をデリゲートすることができる。ＪＤＫバージョン１．１「デリゲーション・モデル」で、あるオブジェクト（「ソース」と呼ばれる）は、他のオブジェクト（「リスナ」と呼ばれる）をソース・オブジェクトの入力を処理するオブジェクトとして指定することができる。
【００５８】
ソース・オブジェクトは、「リスナ」にソース・オブジェクトを登録するメソッドを含む。他の場合にはソース・オブジェクトに向けて送られる処理（たとえば、イベント処理）が、ソース・オブジェクトが登録されたリスナ・オブジェクトに向けて送られる。「リスナ」オブジェクトは、たとえば入力を処理するためにソース・オブジェクトによって活動化することができる。ソース・オブジェクトはそれ自体および／または他のオブジェクトをリスナとして登録することができる。したがって、ソース・オブジェクトは、それが「リスナ」として登録されている場合にはそれ自体を活動化することができる。
【００５９】
本発明の一実施形態では、画面要素が、ある装置をサポートするリスナを有するとき、この画面要素は、この装置をサポートする画面要素としてマーク付けされる。
【００６０】
たとえば、マウス装置をサポートするリスナを「ｍｏｕｓｅＬｉｓｔｅｎｅｒ」または「ｍｏｕｓｅＭｏｔｉｏｎＬｉｓｔｅｎｅｒ」と呼ぶ。画面要素はそれ自体または他のオブジェクトを「ｍｏｕｓｅＬｉｓｔｅｎｅｒ」または「ｍｏｕｓｅＭｏｔｉｏｎＬｉｓｔｅｎｅｒ」として登録することができる。
【００６１】
画面要素は、少なくとも１つの「ｍｏｕｓｅＬｉｓｔｅｎｅｒ」または「ｍｏｕｓｅＭｏｔｉｏｎＬｉｓｔｅｎｅｒ」がその画面要素に登録されている場合に、マウス入力をサポートする画面要素としてマーク付けされる。逆に、画面要素は、その画面要素に「ｍｏｕｓｅＬｉｓｔｅｎｅｒ」も「ｍｏｕｓｅＭｏｔｉｏｎＬｉｓｔｅｎｅｒ」も登録されていない場合に、マウス入力をサポートしない画面要素としてマーク付けされる。
【００６２】
登録済みの「リスナ」はそれ自体を登録解除することができる。たとえば、それ自体を「ｍｏｕｓｅＬｉｓｔｅｎｅｒ」および／または「ｍｏｕｓｅＭｏｔｉｏｎＬｉｓｔｅｎｅｒ」として登録している「リスナ」インスタンスは、「リスナ」インスタンスとして登録解除されることを要求することができる。画面要素は、最後の「ｍｏｕｓｅＬｉｓｔｅｎｅｒ」または「ｍｏｕｓｅＭｏｔｉｏｎＬｉｓｔｅｎｅｒ」が登録解除されると、マウス入力をサポートしない画面要素としてマーク付けされる。
【００６３】
Ｊａｖａでは、画面要素に関してｍｏｕｓｅＬｉｓｔｅｎｅｒが登録されると、ｊａｖａ．ａｗｔ．Ｃｏｍｐｏｎｅｎｔに専用フラグ（または変数）ｍｏｕｓｅｌｉｓｔｅｎｅｒがセットされる。画面要素に関してｍｏｕｓｅＭｏｔｉｏｎＬｉｓｔｅｎｅｒが登録されると、ｊａｖａ．ａｗｔ．Ｃｏｍｐｏｎｅｎｔは専用フラグｍｏｕｓｅＭｏｔｉｏｎＬｉｓｔｅｎｅｒをセットする。これらの変数は専用変数であるので、プラットフォーム独立レイヤ４０２からアクセスすることはできない。これらの変数をネイティブ・レイヤ４０８で実行時の任意の時間に調べ、画面要素がマウス装置をサポートするかどうかを判定することができる。本発明の一実施形態では、ピア・レイヤ４０４のピア要素は、ネイティブ・レイヤ４０８のネイティブ要素にｍｏｕｓｅＬｉｓｔｅｎｅｒ変数および／またはｍｏｕｓｅＭｏｔｉｏｎＬｉｓｔｅｎｅｒ変数を検査するよう要求することができる。画面要素は、これらの要素の一方または両方がセットされている場合、マウス入力をサポートする画面要素としてマーク付けされる。
【００６４】
インタフェース検査
画面要素は、外部定義メソッドの１つまたは複数の集合を含むことができる。通常、外部定義メソッドの集合には名前が与えられる。外部定義メソッドの集合を含む画面要素は、集合の名前を使用してこれらのメソッドを宣言する。たとえば、Ｊａｖａでは、インタフェースがコンスタントおよびアブストラクト・メソッドの集合の例である。画面要素は、インタフェースの名前を処理系句に指定することによってインタフェースを宣言する。インタフェースのメソッドは、画面要素のメソッド定義によって無効化することができる。
【００６５】
以下の表は、Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃ．から市販されているＰｅｒｓｏｎａｌ  Ｊａｖａプログラミング言語のインタフェースの例を示す。
【表１】
0004471428.tif 000002
【００６６】
これらのインタフェース例で、ＮｏＩｎｐｕｔＰｒｅｆｅｒｒｅｄインタフェースおよびＫｅｙｂｏａｒｄＩｎｐｕｔＰｒｅｆｅｒｒｅｄインタフェースはマウス入力を許容しない。したがって、これらのインタフェースを実装する画面要素は、マウス入力をサポートしない画面要素とみることができる。したがって、本発明の実施形態によれば、画面要素の実行時バージョンでこれらのインタフェースの一方または両方が検出された場合、この画面要素は、マウス入力をサポートしない画面要素としてマーク付けされる。
【００６７】
逆に、画面要素がＡｃｔｉｏｎＩｎｐｕｔＰｒｅｆｅｒｒｅｄインタフェースまたはＰｏｓｉｔｉｏｎＩｎｐｕｔＰｒｅｆｅｒｒｅｄ（または両方）インタフェースを実装する場合、この画面要素はマウス入力をサポートすると仮定される。したがって、本発明の実施形態では、これらのインタフェースの一方または両方を実装する画面要素は、マウス入力をサポートする画面要素としてマーク付けされる。
【００６８】
Ｊａｖａプログラミング言語では、ｉｎｓｔａｎｃｅｏｆ演算子を使用してオブジェクト・インスタンスのクラスを判定することができる。ｉｎｓｔａｎｃｅｏｆ演算子を使用して、オブジェクト・インスタンスがインタフェースを実装するかどうかを示すこともできる。ｉｎｓｔａｎｃｅｏｆオペレーションをピア要素（たとえば、ボタン・ピア）コンストラクタ・メソッド内に配置し、画面要素に関連する所与のインタフェース実装に関して試験することができる。以下のｉｎｓｔａｎｃｅｏｆ擬似コード例は、本発明の実施形態では、オブジェクト・インスタンスがマウス入力をサポートするかどうかを検出するために使用される。
0004471428.tif 000003
【００６９】
ライトウェイト要素
ライトウェイト要素とは、ネイティブ・レイヤ４０８内の対応する画面要素を必要としない画面要素である。ライトウェイト要素は通常、様々なプラットフォーム上で同じ外観を有する。ライトウェイト要素の例には、グラフィック画像（たとえば、．ｇｉｆファイル）を表示する要素がある。ネイティブ・レイヤ要素がないので、ネイティブ・レイヤ４０８は必ずしもライトウェイト要素を認識しない。
【００７０】
本発明の一実施形態では、ライトウェイト要素は最初、装置入力をサポートする要素としてマーク付けされる。このデフォルトは無効化することができる。たとえば、ライトウェイト要素はＮｏＩｎｐｕｔＰｒｅｆｅｒｒｅｄインタフェースおよびＫｅｙｂｏａｒｄＩｎｐｕｔＰｒｅｆｅｒｒｅｄインタフェースの一方または両方を実装することができる。この場合、ライトウェイト要素は、マウス入力をサポートできない要素としてマーク付けされる。上述のように、Ｊａｖａプログラミング言語のｉｎｓｔａｎｃｅｏｆ演算子を使用して、インタフェースの組み込み（inclusion）を検出することができる。
【００７１】
図５は本発明の一実施形態によるインタフェース宣言などの宣言を検出するプロセス・フローの一例を示す図である。ステップ５０２で、画面要素がライトウェイト要素であるかどうかが判定される。そうである場合、処理はステップ５０４に進み、ライトウェイト要素に関する肯定的な装置サポート・デフォルト（すなわち、ライトウェイト要素が所与の装置をサポートすることを示すデフォルト）が設定される。
【００７２】
ステップ５０６で、ライトウェイト要素が、この要素が所与の装置をサポートしないことを示すインタフェースを実装するかどうかが判定される。そうである場合、処理は、ステップ５０８に進み、このライトウェイト要素がこの装置をサポートしない要素としてマーク付けされ、処理はステップ５１０で終了する。ステップ５０６で、ライトウェイト要素が非サポート・インタフェースを実装しないと判定された場合、処理はステップ５１０で終了する。
【００７３】
ステップ５０２で、画面要素がライトウェイト要素ではないと判定された場合、処理はステップ５１２に進む。ステップ５１２で、この画面要素が、所与の装置用の装置サポート・インタフェースを実装するかどうかが判定される。そうでない場合、処理はステップ５１６に進み、この要素が装置をサポートしない要素としてマーク付けされる。ステップ５１２で、この画面要素が所与の装置用の装置サポート・インタフェースを実装すると判定された場合、処理はステップ５１４に進み、この要素が装置をサポートする要素としてマーク付けされる。いずれの場合も、処理はステップ５１０で終了する。
【００７４】
コンピュータ実行環境の実施形態（ハードウェア）
本発明の実施形態は、汎用コンピュータまたは専用コンピュータ上で実行されるコンピュータ可読コードの形式のコンピュータ・ソフトウェア、またはこのような汎用コンピュータまたは専用コンピュータ上で実行されるＪａｖａ実行時環境内で実行することのできるバイトコード・クラス・ファイルの形式のコンピュータ・ソフトウェアとして実装することができる。
【００７５】
図６は、本発明の実施形態で使用することのできる汎用コンピュータの例を示す。キーボード６１０およびマウス６１１はシステム・バス６１８に結合される。キーボードおよびマウスは、コンピュータ・システムにユーザ入力を導入し、このユーザ入力をプロセッサ６１３に伝達するために使用される。マウス６１１およびキーボード６１０に加えて、あるいはそれらの代わりに、他の適切な入力装置を使用することができる。システム・バス６１８に結合された入出力ユニット６１９は、プリンタ、Ａ／Ｖ（オーディオ／ビデオ）入出力などの入出力要素を表わす。
【００７６】
コンピュータ６００は、ビデオ・メモリ６１４、メイン・メモリ６１５、および大容量記憶域６１２を含み、すべてのこれらの構成要素は、キーボード６１０、マウス６１１、およびプロセッサ６１３と共にシステム・バス６１８に結合される。大容量記憶域６１２は、磁気記憶システムや、光学記憶システムや、磁気光学記憶システムや、他の利用可能な大容量記憶技法など、固定媒体と着脱可能媒体の両方を含むことができる。バス６１８は、たとえば、ビデオ・メモリ６１４またはメイン・メモリ６１５にアドレスする６４本のアドレス線を含むことができる。システム・バス６１８は、たとえば、プロセッサ６１３、メイン・メモリ６１５、ビデオ・メモリ６１４、大容量記憶域６１２などの構成要素の間でデータを転送する６４ビット・データ・バスも含む。別法として、別々のデータ線およびアドレス線ではなく複数のデータ／アドレス線を使用することができる。
【００７７】
本発明の一実施形態では、プロセッサ６１３は、Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，ＩＮｃ．から市販されているＳＰＡＲＣマイクロプロセッサ、Ｍｏｔｏｒｏｌａによって製造されている６８０Ｘ０プロセッサ、８０Ｘ８６プロセッサやＰｅｎｔｉｕｍプロセッサなどＩｎｔｅｌによって製造されているマイクロプロセッサなどのマイクロプロセッサである。しかし、他の適切なマイクロプロセッサまたはマイクロコンピュータを使用することができる。メイン・メモリ６１５は、ダイナミック・ランダム・アクセス・メモリ（ＤＲＡＭ）で構成される。ビデオ・メモリ６１４は、デュアル・ポート・ビデオ・ランダム・アクセス・メモリである。ビデオ・メモリ６１４の１つのポートはビデオ増幅器６１６に結合される。ビデオ増幅器６１６を使って、陰極線管（ＣＲＴ）ラスタ・モニタ６１７を励振させる。ビデオ増幅器６１６は、当技術分野でよく知られており、任意の適切な装置によって実装することができる。この回路は、ビデオ・メモリ６１４に記憶されている画素データを、モニタ６１７が使用するのに適したラスタ信号に変換する。モニタ６１７は、グラフィック画像を表示するのに適した種類のモニタである。別法として、フラット・パネル・ディスプレイまたは液晶ディスプレイ（ＬＣＤ）、あるいは他の適切なデータ・プレゼンテーション装置を駆動するためにビデオ・メモリを使用することができる。
【００７８】
コンピュータ６００は、バス６１８に結合された通信インタフェース６２０を含むこともできる。通信インタフェース６２０は、ネットワーク・リンク６２１を介してローカル・ネットワーク６２２と２方向データ通信結合を確立する。たとえば、通信インタフェース６２０が総合デジタル通信網（ＩＳＤＮ）カードまたはモデムである場合、通信インタフェース６２０は、ネットワーク・リンク６２１の一部を備える対応する種類の電話回線とデータ通信接続を確立する。通信インタフェース６２０がローカル・エリア・ネットワーク（ＬＡＮ）カードである場合、通信インタフェース６２０は、ネットワーク・リンク６２１を介して、互換性のあるＬＡＮとデータ通信接続を確立する。通信インタフェース６２０はケーブル・モデムでも、あるいは無線インタフェースでもよい。そのような実施形態では、通信インタフェース６２０は、様々な種類の情報を表わすデジタル・データ・ストリームを搬送する電気信号、電磁信号、または光学信号を送受信する。
【００７９】
ネットワーク・リンク６２１は通常、１つまたは複数のネットワークを介して他のデータ装置とデータ通信を行う。たとえば、ネットワーク・リンク６２１は、ローカル・ネットワーク６２２を介して、ローカル・サーバ・コンピュータ６２３、またはインタネット・サービス・プロバイダ（ＩＳＰ）６２４によって操作されるデータ機器と接続を確立することができる。ＩＳＰ６２４は、現在では一般に「インタネット」６２５と呼ばれている世界全域のパケット・データ通信網を介してデータ通信サービスを行う。ローカル・ネットワーク６２２とインタネット６２５は共に、デジタル・データ・ストリームを搬送する電気信号、電磁信号、または光学信号を使用する。様々なネットワークを通る信号と、デジタル・データをコンピュータ６００に搬送しかつコンピュータ６００から搬送するネットワーク・リンク６２１上の信号および通信インタフェース６２０を通る信号は、情報を搬送する搬送波の例示的な形態である。
【００８０】
コンピュータ６００は、ネットワーク、ネットワーク・リンク６２１、および通信インタフェース６２０を介して、メッセージを送信し、プログラム・コードを含むデータを受信することができる。インタネットの例では、リモート・サーバ・コンピュータ６２６は、インタネット６２５、ＩＳＰ６２４、ローカル・ネットワーク６２２、および通信インタフェース６２０を介してアプリケーション・プログラム用の要求されたコードを伝送することができる。
【００８１】
受信されたコードは、受信されたときにプロセッサ６１３によって実行し、かつ／または後で実行できるように大容量記憶域６１２またはその他の非揮発性記憶域に記憶することができる。このように、コンピュータ６００は、アプリケーション・コードを搬送波の形で得ることができる。
【００８２】
アプリケーション・コードは、任意の形態のコンピュータ・プログラム製品に組み込むことができる。コンピュータ・プログラム製品は、コンピュータ可読コードまたはデータを記憶または搬送するように構成されるか、あるいはコンピュータ可読コードまたはデータを記録することのできる媒体を備える。コンピュータ・プログラム製品の例には、ＣＤ−ＲＯＭディスク、ＲＯＭカード、フロッピィ・ディスク、磁気テープ、コンピュータ・ハード・ディスク、ネットワーク上のサーバ、搬送波などがある。
【００８３】
前述のコンピュータ・システムは例示のみのためのシステムである。本発明の実施形態は、埋込み装置（たとえば、ｗｅｂ電話）、および仮想マシンをサポートする「シン（ｔｈｉｎ）」クライアント処理環境（たとえば、ネットワーク・コンピュータ（ＮＣ）など）を含め、任意の種類のコンピュータ・システムまたはプログラミングまたは処理環境に実装することができる。
【００８４】
図６は、本発明の１つまたは複数の実施形態で使用することのできる汎用コンピュータの一例を示す。本発明の実施形態では専用コンピュータを使用することもできる。専用コンピュータまたは専用装置の例には、パーソナル・デジタル・アシスタント、ネットワーク・コンピュータ、機能拡張された携帯電話およびハード配線電話、インタネット機能付きテレビジョン・セットなどが制限なしに含まれる。
【００８５】
したがって、グラフィカル・ユーザ・インタフェースにおける装置サポートを検出する方法および装置を１つまたは複数の特定の実施形態に関して説明した。本発明は、特許請求の範囲およびその全範囲の均等物によって定義される。
【図面の簡単な説明】
【図１】コンパイル環境および実行時環境のブロック図である。
【図２】仮想マシンの実施形態の実行時データ領域のブロック図である。
【図３】本発明の実施形態によるメソッド検査プロセス・フローの一例を示す図である。
【図４】本発明の実施形態で使用されるマルチレイヤ・ウィンドウ・システムの一例を示す図である。
【図５】本発明の実施形態によるインタフェース宣言などの宣言を検出するプロセス・フローの一例を示す図である。
【図６】本発明の実施形態に適した実行環境を形成することのできるコンピュータ・システムの一実施形態のブロック図である。
【図７】本発明の１つまたは複数の実施形態による画面要素を含むＧＵＩ７００を示す図である。
【符号の説明】
１００  クラス・ソース・ファイル
１０１  コンパイラ
１０２  クラス・バイトコード・ファイル
１０３  クラス・ローダおよびバイトコード・ベリファイア
１０４  クラス・ライブラリ
１０５  仮想マシン
１０６  インタプリタ
１０７  ジャストインタイム・コンパイラ
１０８  実行時システム
１０９  オペレーティング・システム
１１０  ハードウェア
１１１  リンク済みライブラリ
２００  実行時データ領域
２０１  ヒープ
２０２  メソッド領域
２０３  クラス・ベース・データ領域
２０４  コンスタント・プール
２０５  フィールド／メソッド・データ
２０６  コンストラクタ／メソッド・コード
２０７  スレッド・ベース・データ領域
２０８  プログラム・カウンタ・レジスタ
２０９  ローカル変数ポインタ・レジスタ
２１０  フレーム・レジスタ
２１１  オペランド・スタック・ポインタ・レジスタ
２１２  スタック
２１４  オペランド・スタック
２１５  ローカル変数
２１６  ネイティブ・メソッド・スタック
２１７  ネイティブ・メソッド・フレーム
４０２  プラットフォーム独立レイヤ
４０４  ピア・レイヤ
４０６  ネイティブ・インタフェース・レイヤ
４０８  ネイティブ・レイヤ
６１０  キーボード
６１１  マウス
６１２  大容量記憶域
６１３  プロセッサ
６１４  ビデオ・メモリ
６１５  メイン・メモリ
６１６  ビデオ増幅器
６１７  モニタ
６１９  入出力
６２０  通信インタフェース
６２１  ネットワーク・リンク
６２２  ローカル・ネットワーク
６２３  ホスト（ローカル・サーバ）
６２４  インタネット・サービス・プロバイダ
６２５  インタネット
６２６  サーバ
【図１】
0004471428.tif 000004
【図２】
0004471428.tif 000005
【図３】
0004471428.tif 000006
【図４】
0004471428.tif 000007
【図５】
0004471428.tif 000008
【図６】
0004471428.tif 000009
【図７】
0004471428.tif 000010