AWTデスクトップ・プロパティ

Toolkit.getDesktopPropertyメソッドで取得できる標準AWTデスクトップ・プロパティについて次に説明します。

各デスクトップ・プロパティは固有の文字列で指定され、この文字列がそのプロパティの「名前」になります。

ここでは、AWTがサポートするが、(通常、適切なメソッドまたはクラスがないために)ほかで文書化されていないデスクトップ・プロパティについて説明します。

ほかで説明されているデスクトップ・プロパティは、その説明が存在するメソッドまたはクラスと密接に関連しています。

デスクトップ・プロパティはベースとなるプラットフォーム設定を抽象化するため、それらがサポートされない環境では利用できない場合があります。 何らかの理由でデスクトップ・プロパティが利用できない場合は、実装はnullを返します。

次の表は、ここで説明するデスクトップ・プロパティとそれらの値の型の概要です。

プロパティ名 値の型 サマリー説明
awt.font.desktophints java.util.Map フォント・スムージング(テキスト・アンチエイリアス)設定。
sun.awt.enableExtraMouseButtons java.lang.Boolean 追加のボタンからのマウス・イベントを生成するかどうかを制御します

デスクトップ・フォントのレンダリングのヒント

デスクトップのプロパティ: "awt.font.desktophints"

モダン・デスクトップはさまざまな形式のテキスト・アンチエイリアス(フォント・スムージング)をサポートします。

これらは、プラットフォーム固有の重量コンポーネントによって適用されます。 ただし、アプリケーションが、レンダリング面に同じテキスト・アンチエイリアスを使用してテキストを、または Graphics2Dメソッドを使用して軽量(非プラットフォーム)コンポーネントをレンダリングする場合があります。 これは、ネイティブのデスクトップ・コンポーネントやほかのSwingコンポーネントと矛盾なく表示される必要があるSwingコンポーネントを作成する場合に特に重要です。

基本的な使用法

"awt.font.desktophints"という名前の標準デスクトップ・プロパティを使用して、デスクトップ設定にもっともよく一致するレンダリングのヒントを取得できます。 戻り値はGraphics2Dに直接適用できる RenderingHintsMapです。

複数のヒントが必要な場合があるため、これはMapです。 null以外の場合は、Graphics2Dに直接適用できます。


Toolkit tk = Toolkit.getDefaultToolkit();
Map map = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
if (map != null) {
    graphics2D.addRenderingHints(map);
}

高度な使用上のヒント

Listening for changes

アプリケーションは、PropertyChangeListenerを使用してプロパティの変更を待機できます。


tk.addPropertyChangeListener("awt.font.desktophints", pcl);
まれに、アプリケーションの実行中に、これらの一連のヒントに影響するようなデスクトップ環境の再構成をユーザーが行うことがあり、さらに、多くのデスクトップ環境では、新しい設定に適合するようにこれらの実行中のアプリケーションを動的に再構成することがサポートされているため、変更を待機することをお薦めします。

実行中のアプリケーションの動的再構成が想定されるかどうかを知る直接的な方法はありませんが、ほとんどのモダン・デスクトップ環境がこの機能を提供するので、デフォルトでは想定するべきです。

Text Measurement

テキストは必ず、レンダリングに使用されるのと同じ FontRenderContextを使用して測定する必要があります。 テキスト・アンチエイリアスのヒントは、FontRenderContextのコンポーネントです。 ヒントが設定されているGraphicsオブジェクトから取得された FontMetricsは、テキストを適切に測定します。 これは、このヒントを直接指定するクライアントに固有の要件ではありませんが、FontRenderContextの値は想定してはならないため、ここではそれを示すためだけに説明しています。

Saving and restoring Graphics State

アプリケーションが、これらのヒントを共有Graphicsに一時的に適用し、ヒントがテキスト・レンダリング操作に適用されたあとで、以前の値を復元する必要がある場合があります。 次のサンプル・コードは、これを行うための1つの方法を示します。


/**
  * Get rendering hints from a Graphics instance.
  * "hintsToSave" is a Map of RenderingHint key-values.
  * For each hint key present in that map, the value of that
  * hint is obtained from the Graphics and stored as the value
  * for the key in savedHints.
  */
RenderingHints getRenderingHints(Graphics2D g2d,
                                  RenderingHints hintsToSave,
                                  RenderingHints savedHints) {
     if (savedHints == null) {
         savedHints = new RenderingHints(null);
     } else {
         savedHints.clear();
     }
     if (hintsToSave.size() == 0) {
         return savedHints;
     }
     /* RenderingHints.keySet() returns Set<Object> */
     for (Object o : hintsToSave.keySet()) {
         RenderingHints.Key key = (RenderingHints.Key)o;
         Object value = g2d.getRenderingHint(key);
         savedHints.put(key, value);
     }
     return savedHints;
}


Toolkit tk = Toolkit.getDefaultToolkit();
Map map = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
Map oldHints;
if (map != null) {
     oldHints = getRenderingHints(graphic2D, map, null);
     graphics2D.addRenderingHints(map);
     ..
     graphics2D.addRenderingHints(oldHints);
}

詳細

  • 戻り値は常にnullまたはMapです

  • 戻り値がnullの場合、利用可能なデスクトップ・プロパティはなく、動的更新は利用できません。 これは、JDKがデスクトップ環境を認識しない場合や、デスクトップ環境にこのような設定がない場合には通常の動作です。 ヘッドレス・ツールキットはその一例です。 したがって、マップを使用する前にnullかどうかをテストすることが重要です。

  • null以外の場合、値は、各キーがRenderingHints.Keyのインスタンスであり、値がそのキーの正当な値であるようなRenderingHintsMapになります。

  • マップにはヒントのデフォルト値が含まれる場合があります。 これは、以前にGraphics2Dにそのヒントのデフォルト値以外の値が設定されている場合に必要です。 マップにデフォルト値が含まれていなかった場合は、addRenderingHints(Map)は以前のヒントを残しますが、それがデスクトップ設定に対応していない可能性があります。

    アプリケーションはsetRenderingHints(Map)を使用してすべてのヒントを再初期化できますが、これは無関係なヒントにも影響します。

  • マルチ画面デスクトップでは、画面別のデバイス設定をサポートする場合があり、この場合戻り値はデスクトップのデフォルト画面のものになります。 アプリケーションは、設定が適用される画面の設定を使用する場合があります。 画面別のデバイスのヒントは、Stringの連結として構成されるデバイス別のプロパティ名を使用して取得できる場合があります
    
    "awt.font.desktophints" + "." + GraphicsDevice.getIDstring();
    

    アプリケーションは、これらのプロパティの変更を待機することもできます。

    しかし、これはきわめてまれな構成であるため、開発を容易にするために、単一のデスク・トップ全体の設定のみがサポートされている場合は、デバイス別の設定に対する照会はnullを返します。 したがって、デバイス別の設定があるかどうかを判別するには、デバイス別のプロパティ名を使用して、任意の画面デバイスに対してnull以外の戻り値があることを判定すれば十分です。

マウスの機能

デスクトップのプロパティ: "sun.awt.enableExtraMouseButtons"

このプロパティは、追加のマウス・ボタン(それらが存在し、基盤となるオペレーティング・システムによって有効になっている場合)からのイベントを処理してEventQueueにポストすることができるかどうかを決定します。
値は、アプリケーションの開始前に"sun.awt.enableExtraMouseButtons"プロパティ値をjavaに渡すことによって変更できます。
これは次のコマンドで実行できます。

java -Dsun.awt.enableExtraMouseButtons=false Application
アプリケーションの起動時に設定されたあとでこの値を変更することはできません。
現在の値は、getDesktopProperty("sun.awt.enableExtraMouseButtons")メソッドを使用しても照会できます。

プロパティがtrueに設定されている場合
  • 標準ボタンでMouseEventオブジェクトを作成するのは依然として合理的です。マウスに3つ以上のボタンがある場合、0からgetNumberOfButtons()までの範囲のボタンを使用することもできます。
  • Robot.mousePress()およびRobot.mouseRelease()メソッドを使用する場合は標準のボタン・マスクを使用し、マウスに3つ以上のボタンがある場合は、既存の拡張マウス・ボタンにマスクを使用することもできます。 そうすれば、マウスに3つ以上のボタンがある場合、1からgetNumberOfButtons()までの範囲のボタンに対応するボタン・マスクを使用することができます

プロパティがfalseに設定されている場合
  • 標準のボタンだけでMouseEventオブジェクトを作成することは合法です: NOBUTTONBUTTON1BUTTON2およびBUTTON3
  • 標準のボタン・マスクのみを使用することは合法です: InputEvent.BUTTON1_DOWN_MASK, InputEvent.BUTTON2_DOWN_MASK, InputEvent.BUTTON3_DOWN_MASK
このプロパティは、追加のマウス・ボタンの操作の結果としてトリガーされるマウス・イベントを待機する必要がない場合に使用します。 デフォルトで、このプロパティはtrueに設定されています。