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);
}

高度な使用上のヒント

変更の待機

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


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

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

テキスト測定

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

グラフィックスの状態の保存と復元

アプリケーションが、これらのヒントを共有 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 */
     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"

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

java -Dsun.awt.enableExtraMouseButtons=false Application
アプリケーションの起動時に設定されたあとでこの値を変更することはできません。
現在の値は、getDesktopProperty("sun.awt.enableExtraMouseButtons") メソッドを使用しても照会できます。
プロパティーが {@code true} に設定されている場合
  • 標準のボタンを使用して {@code MouseEvent} オブジェクトを引き続き作成できますが、 マウスに 4 つ以上のボタンがある場合、0 から {@link java.awt.MouseInfo#getNumberOfButtons() getNumberOfButtons()} までの範囲の ボタンを使用することもできます。
  • {@code Robot.mousePress()} および {@code Robot.mouseRelease()} メソッドを使用 するときに標準のボタンマスクを使用でき、マウスに 4 つ以上のボタンがある場合、存在する 拡張マウスボタン用のマスクを使用することもできます。つまり、マウスに 4 つ以上のボタンが ある場合、1 から {@link java.awt.MouseInfo#getNumberOfButtons() getNumberOfButtons()} までの範囲のボタンに対応するボタンマスクを使用できます。

プロパティーが {@code false} に設定されている場合
  • 標準ボタン ({@code NOBUTTON}、{@code BUTTON1}、{@code BUTTON2}、および {@code BUTTON3}) のみを使用して {@code MouseEvent} を作成できます。
  • 標準ボタンマスク ({@code InputEvent.BUTTON1_DOWN_MASK}、 {@code InputEvent.BUTTON2_DOWN_MASK}、{@code InputEvent.BUTTON3_DOWN_MASK}) のみを使用できます。
このプロパティーは、追加のマウスボタンの操作の結果としてトリガーされるマウスイベントを 待機する必要がない場合に使用します。このプロパティーのデフォルトは {@code true} に設定 されています。