Java AWT: デスクトップカラー


最終更新: 1997 年 2 月 3 日

目的

プラットフォームのデスクトップ(Windows95、Solaris/CDE など)がデスクトップ上のオブジェクトに対して配色を提供することは一般的であり、通常この配色はユーザが構成可能です。デスクトップで実行されるアプリケーションが、その配色を使用してビジュアルな一貫性を維持することが通常望まれます。

AWT は、そのコンポーネントに対して適当なデフォルト色をセットしようと試みますが、現在 Java プログラムがこれらの色を直接問い合わせし使用する便利な方法はありません。これは特に、バックグラウンド、影、およびフォント色をデスクトップの他の部分とすべて確実に適合するような、カスタムコンポーネントを作成するときに問題になります。 JDK1.1 では、AWT がこれらデスクトップカラーにアクセスし使用するための簡単な API を提供します。

デスクトップカラー API

この API は、次の java.awt.Color のサブクラスが表す新しい型の「シンボル」色を導入します:

        java.awt.SystemColor
SystemColor オブジェクトは、他の Color オブジェクトと同じように使用することができます。唯一の違いは、(ユーザが配色を変えた際、ダイナミックな通知をサポートするシステム上で、)現在の色を表す実際の値がダイナミックに変わる可能性があるということです。

SystemColor オブジェクトはシステムが定義し、Java プログラムがインスタンスにすることはできません。

色の範囲

SystemColor クラスは、デスクトップ上の配色の個別の型を各々表すシンボル色の標準セットを提供します。これらシンボル色オブジェクトは自動的に作成され、java.awt.SystemColor に静的に格納されます:
	public final static SystemColor desktop; // デスクトップのバックグラウンド色
	public final static SystemColor activeCaption; // キャプションのバックグラウンド色
	public final static SystemColor activeCaptionText; // キャプションテキスト色
	public final static SystemColor activeCaptionBorder; // キャプションテキストの境界色
	public final static SystemColor inactiveCaption; // 非アクティブなキャプションのバックグラウンド色
	public final static SystemColor inactiveCaptionText; // 非アクティブなキャプションのテキスト色
	public final static SystemColor inactiveCaptionBorder; // 非アクティブなキャプションの境界色
	public final static SystemColor window; // ウィンドウのバックグラウンド
	public final static SystemColor windowBorder; // ウィンドウ境界フレーム色
	public final static SystemColor windowText; // ウィンドウ内のテキスト色
	public final static SystemColor menu; // メニューのバックグラウンド
	public final static SystemColor menuText; // メニューのテキスト色
	public final static SystemColor text; // テキストのバックグラウンド色
	public final static SystemColor textText; // テキストのテキスト色
	public final static SystemColor textHighlight; // 強調表示されたテキストのバックグラウンド色
	public final static SystemColor textHighlightText; // 強調表示されたテキストのテキスト色
	public final static SystemColor control; // コントロールのバックグラウンド色
	public final static SystemColor controlText; // コントロールのテキスト色
	public final static SystemColor controlLtHighlight; // コントロールの明るい強調表示色
	public final static SystemColor controlHighlight; // コントロールの強調表示色
	public final static SystemColor controlShadow; // コントロールの影の色
	public final static SystemColor controlDkShadow; // コントロールの暗い影の色
	public final static SystemColor inactiveControlText; // 非アクティブなコントロールのテキスト色
	public final static SystemColor scrollbar; // スクロールバーのバックグラウンド色
	public final static SystemColor info; // スポットヘルプテキストのバックグラウンド色
	public final static SystemColor infoText; // スポットヘルプテキストのテキスト色

Java プログラムが、コンポーネントのフォアグラウンドかバックグラウンドのどちらかをこれらシンボル色の1 つにセットするか、またはこれらの1つをレンダリングに使用する場合、そのシンボル色の現在の値が使用されます。

すべてのプラットフォームがこれらシンボル名の各々に対して別個の色をサポートしているわけではありません。シンボル色をプラットフォームがサポートしていないケースでは、最も適当なデフォルトに割り当てられます。これらの色は null でないことが保証されます。

AWT ベースコンポーネントはこれらシンボル色を使用するように変更され、より一貫性のあるデスクトップとのデフォルト統合を提供します。コンポーネントのデフォルト色についてなんらかの仮定(すなわち、「灰色」という仮定)を行っている 1.0 用に書かれた Java プログラムは、1.1 の下では正しくレンダしない可能性があります。このため paint() メソッド内でそのバックグラウンド/フォアグラウンド色について、コンポーネントに問い合わせすることが常に重要です。

一時更新とダイナミック更新の対比

ツールキットを最初にロードしたとき、最低これらの色はダイナミックに初期化されます。あるデスクトップでは、ダイナミック更新機能を提供し、AWT はユーザが配色を変更したときを検出し、これらすべてのシンボル色を、たちまちのうちに更新します。しかし、これはプラットフォーム固有のもので、このインタフェースで保証された機能ではありません。

サンプルコード

この API を使用するカスタムコンポーネント(区切り記号)の例を次に示します:
	
import java.awt.*;

//
// Oversimplified separator class for creating 3D horizontal
// line separators
//
public class Separator extends Component {

    public Separator(int length, int thickness) {
       super();
       setSize(length, thickness);
       setBackground(SystemColor.control);
    }

    public void paint(Graphics g) {
       int x1, y1, x2, y2;
       Rectangle bbox = getBounds();
     
       x1 = 0;
       x2 = bbox.width - 1;
       y1 = y2 = bbox.height/2 - 1;

       g.setColor(SystemColor.controlShadow);
       g.drawLine(x1, y2, x2, y2);
       g.setColor(SystemColor.controlHighlight);
       g.drawLine(x1, y2+1, x2, y2+1);
    }

    public static void main(String[] args) {
        Frame f = new Frame("Separator Example");
        f.setSize(200, 100);
        f.setBackground(SystemColor.control);
        Separator sep = new Separator(200, 4);
        f.add("Center", sep);
        f.show();
    }
}



フィードバックは java-awt@java.sun.com 宛てに送ってください。
Copyright (C) 1996, Sun Microsystems, Inc. All rights reserved.