テキストの描画は3つのJavaクラスで簡単です

このGraphicsクラスは、線や円などのプリミティブな幾何学的タイプを描画するためのメソッドに加えて、テキストを描画するためのメソッドを提供します。FontおよびFontMetricsクラスと組み合わせると、魅力的なテキストを描画する作業を他の方法よりもはるかに簡単にする一連のツールが得られます。このコラムでは、これらの各クラスについて順番に説明し、それらを一緒に使用する方法を示します。ただし、始める前に、Graphicsクラスの役割について簡単に説明します。

評価

Graphicsクラスのテキストメソッドを使用するには、Graphicsクラス自体の役割を理解する必要があります。このセクションでは、Graphicsクラスの機能と操作の概要を説明します。徹底的な報道をお探しの読者は、こちらから入手できる私の10月のコラムをお読みください。

このGraphicsクラスは、抽象ウィンドウツールキット(AWT)内で2つの異なるが関連する役割を果たします。まず、グラフィックス操作の結果に影響を与えるすべての情報で構成されるグラフィックスコンテキストを維持します。これには、描画色、フォント、およびクリッピング長方形(グラフィックを描画できる領域)の位置と寸法が含まれます。さらに重要なことに、グラフィックスコンテキストは、これから説明するグラフィックス操作の宛先を定義します(宛先にはコンポーネントと画像が含まれます)。

このGraphicsクラスは、グラフィックコンテキストとしての役割に加えて、単純な幾何学的形状、テキスト、および画像グラフィックの宛先に描画するためのメソッドを提供します。コンポーネントまたは画像に対するグラフィック関連の操作はすべて、これらの方法のいずれかを介して行われます。

描画するために、プログラムは有効なグラフィックスコンテキスト(Graphicsクラスのインスタンスによって表される)を必要とします。このGraphicsクラスは抽象基本クラスであるため、直接インスタンス化することはできません。インスタンスは通常、コンポーネントによって作成され、コンポーネントupdate()paint()メソッドへの引数としてプログラムに渡されます。これらの2つのメソッドは、AWT内で開始される通常の描画サイクルの一部として呼び出されます。

このGraphicsクラスは、FontおよびFontMetricsクラスと連携して、画像またはコンポーネント内にテキストを描画するために必要なツールを提供します。Graphicsテキストを描画するためのクラスのメソッドを調べることから始めましょう。

クラスグラフィックス

このGraphicsクラスは、コンポーネントまたは画像にテキストを描画する3つのメソッドを提供します。

void drawString(String str、int x、int y)

drawString()以下に示す方法は、パラメータとしてのインスタンスかかるString描画するテキスト、及びテキストを開始すべき座標を指定する2つの整数値を含むクラス。

public void paint(Graphics g){g.drawString( "abc"、25、25); }

上記のリストのコードは、drawString()コンポーネントのpaint()メソッド内で使用されているメソッドを示しています。この例のコードは、このpaint()メソッドを含むコンポーネントに「abc」という単語を描画します。XY座標は、位置指定左下囲みテキストボックスのコーナー。図1は、このコードが適切なAWTコンポーネントオブジェクトの一部である場合の結果がどのようになるかを示しています。

図1:drawString()のデモンストレーション

void drawChars(char [] data、int offset、int length、int x、int y)

drawChars()以下の方法では、描画するテキストを含む文字配列、開始する配列へのオフセットを示す整数値、描画する文字数を示す整数値、および座標を指定する2つの整数値をパラメーターとして取ります。テキストが始まるはずです。

public void paint(Graphics g){char [] rgc = {'a'、 'b'、 'c'、 'd'、 'e'、 'f'、 'g'、 'h'、 'i'、 'j'};

g.drawChars(rgc、0、5、25、25); g.drawChars(rgc、5、5、25、50); }

上記のコードは、drawChars()コンポーネントのpaint()メソッド内で使用されているメソッドを示しています。文字配列は2つの部分で描画されます。への2つの呼び出しのうちの最初の呼び出しdrawChars()で、offsetパラメーターは描画が配列の最初の文字で始まる必要があることを示し、lengthパラメーターは合計5文字が最初の行に描画される必要があることを示します。2つの呼び出しの2番目は同様に機能しますが、最初の呼び出しの25ピクセル下の位置から始まる文字配列の最後の5文字を​​描画します。図2は、このコードが適切なAWTコンポーネントオブジェクトの一部である場合の結果がどのようになるかを示しています。

図2:drawChars()のデモンストレーション

void drawBytes(byte [] data、int offset、int length、int x、int y)

以下に示すように、このdrawBytes()メソッドは、描画されるテキストを含むバイト配列、開始する配列へのオフセットを示す整数値、描画するバイト数を示す整数値、および描画する2つの整数値をパラメーターとして受け取ります。テキストを開始する場所を調整します。

public void paint(Graphics g){byte [] rgb = {'k'、 'l'、 'm'、 'n'、 'o'、 'p'、 'q'、 'r'、 's'、 't'};

g.drawBytes(rgb、0、5、25、25); g.drawBytes(rgb、5、5、25、50); }

上記のコードは、drawBytes()コンポーネントのpaint()メソッド内で使用されているメソッドを示しています。図3は、このコードが適切なAWTコンポーネントオブジェクトの一部である場合の結果がどのようになるかを示しています。

図3:drawBytes()のデモンストレーション

Unicodeサポート

Javaの最も宣伝されている機能の1つは、Unicodeを介した国際スクリプトのサポートです。残念ながら、Javaプログラミング言語のバージョン1.0で提供されているJavaクラスライブラリは、この言語の側面を完全にはサポートしていませんでした。しかし、良いニュースはもうすぐそこにあるようです。 SunSoftから入手できる予備の国際化API(「参考文献」を参照)には、次のように書かれています。

JDK 1.0は、UnicodeのLatin-1サブセットの文字のみを表示するように制限されていました。この制限は、JDK1.1で削除されました。Javaプログラムは、ホストフォントでレンダリングできる任意のUnicode文字を表示できるようになります。Javaは、少数の事前定義された「仮想」フォント名を提供し、それらをホストで使用可能な実際のフォントにマップします。JDK 1.0では、各Javaフォント名は正確に1つのホストフォントにマップされていました。JDK 1.1では、Javaフォント名を一連のホストフォントにマップできます。一連のホストフォントは、必要なだけUnicode文字セットをカバーするように選択できます。

テキストの配置

テキストはAWTの単なる別の種類の図であるため、テキストの行は、別のテキストの行の上であっても、どこにでも配置できます。ただし、無計画な配置の効果は、必ずしも目に心地よいとは限りません。プログラマーが見た目に美しいテキストを作成するのを支援するために、フォント定義には行と文字の配置に関するガイドラインが含まれています。これらのガイドラインに従えば、満足のいく出力を生成するのに役立ちます。

図4には、これから説明する特性を示すためにマークアップされた1行のテキストが含まれています。

図4:テキストの行

前のセクションのメソッドのy座標パラメーターは、テキスト行のベースラインの場所を指定します。ベースラインは(例外は、「G」及び「Y」としてディセンダとそれらの文字である)テキスト残りの行の文字のどの時に最もラインです。ベースラインは実際にはフォントの特性ではありませんが、他のすべての特性が参照する参照ポイントです。

アセントは、フォントの文字のほとんどのトップにベースラインからの距離です。これは通常、フォントの大文字と「f」や「h」などの文字の高さです。ただし、この図は単なるガイドラインです。フォント内の一部の文字は、実際にはこの距離を超えている場合があります。

降下は、「P」、「G」、および「Y」のような文字-ディセンダを有するフォントの文字の下に、ベースラインからの距離です。上昇と同様に、この図は単なるガイドラインです。フォント内の一部の文字は、実際にはこの距離より下に伸びている場合があります。

リード(発音は「ledding」)は、テキストの1行のディセントとその下の行のアセントの間のスペースの量です。テキスト行の高さ(1行のテキストのベースラインからその上または下のテキスト行のベースラインまでの距離)には、この余分なスペースが含まれます。

フォント全体を管理する特性に加えて、フォントの各文字には高度な機能があります。Advanceは、文字の先頭とその右側の文字の先頭を分離するピクセル数を指定します。要するに、それはキャラクターの幅です。繰り返しになりますが、フォント内の一部の文字は実際にはこの距離を超えている場合があります。

テキスト行のすべての文字の幅を合計することにより、テキスト行全体の長さを計算できます。FontMetrics以下のクラスは、これだけを実行するメソッドなどを提供します。

クラスFontMetrics

このFontMetricsクラスは、上記の特性を取得するための簡単な方法を提供します。getFontMetrics実行中のメソッドは次のとおりです。

public void paint(Graphics g){FontMetrics fm = g.getFontMetrics(); 。。。}

上記のコードは、現在のフォントを説明するフォントメトリック情報を取得する方法を示しています。このgetFontMetrics()メソッドは、FontMetricsクラスのインスタンスを返します。このFontMetricsクラスは、次のメソッドを提供します。

int getAscent()

  • フォントの上昇を返します。

int getDescent()

  • フォントの降下を返します。

int getLeading()

  • フォントの先頭を返します。

int getHeight()

  • フォントの高さを返します。高さは、フォントの上昇、下降、および先行の合計です。

int charWidth(int ch)

  • 指定された文字の幅を返します。

int charWidth(char ch)

  • 指定された文字の幅を返します。

int [] getWidths()

  • フォントの最初の256文字の幅を含む整数配列を返します。

上記のように、フォントを構成する文字は、上記の方法で報告された上昇、下降、および幅を超える場合があります。正確な値が必要な場合は、次の方法があります。

int getMaxAscent()

  • フォントの最大上昇を返します。

int getMaxDescent()

  • フォントの最大降下を返します。

int getMaxAdvance()

  • フォントの最も幅の広い文字の幅を返します。

次のメソッドは、一連の文字が占める幅に関する情報を提供します。

int stringWidth(String str)

  • 文字シーケンスの幅を返します。

int bytesWidth(byte [] rgb, int offset, int length)

  • オフセットで始まるバイトの長いシーケンスの長さの幅を返します。

int charsWidth(char [] rgc, int offset, int length)

  • オフセットで始まる文字の長いシーケンスの長さの幅を返します。

クラスフォント

このFontクラスは、フォントに関する情報をカプセル化します。新しいフォントはFont、名前、スタイル、およびポイントサイズを使用してクラスのインスタンスを作成することによって作成されます。

フォントf = new Font( "Dialog"、Font.PLAIN、12); 

作成したら、Graphicsオブジェクトのインスタンスにフォントを割り当てることができます。

g.setFont(f); 

Graphicsオブジェクトは、その後、後続のすべてのテキスト関連のグラフィックス操作用のフォントを使用します。

このFontクラスは、フォントが作成された後、フォントに関する情報を取得するためのメソッドを提供します。

String getName()

  • フォントの名前を返します。

String getFamily()

  • フォントのプラットフォーム固有の名前を返します。

int getSize()

  • フォントのポイントサイズを返します。

int getStyle()

  • フォントのスタイルを返します。

boolean isBold()

  • trueフォントが太字の場合に戻ります。

boolean isItalic()

  • trueフォントがイタリックの場合に戻ります。

boolean isPlain()

  • trueフォントがプレーンかどうかを返します。

String getName()

  • フォントの名前を返します。

デモンストレーション

図5のアプレットは、上記のセクションの関連するメトリックの値を示すのに十分なマークアップを含むテキスト行を表示します。太い黒い線がベースラインにあります。追加の2行は、問題のフォントの上昇と下降を示します。小さい縦線は文字の幅を示します。3つのプルダウンメニューを使用すると、フォント、そのスタイル、およびポイントサイズを選択できます。

このアプレットを表示するには、Java対応のブラウザが必要です。 図5:インタラクティブなフォントメトリックブラウザ

アプレットが使用していますGraphicsFontFontMetrics広範囲にクラスを。そのソースはここにあります。

結論

そうですGraphicsクラスは、探査のための非常に肥沃な土地であることが判明しました。そして、遠征はまだ終わっていません。来月はGraphics、画像サポート方法に関するコラムでクラスへの遠足を終了します。そのコラムでは、画像プロデューサーや画像コンシューマーなど、画像とAWTに関連する他のトピックに関する小さなシリーズを開始します。

コメント、アイデア、提案を書いてくださった皆様に感謝いたします。良い仕事を続けてください。

Todd Sundstedは、コンピューターがデスクトップモデルで利用できるようになって以来、プログラムを作成してきました。もともとC ++で分散オブジェクトアプリケーションを構築することに興味がありましたが、Javaがその種のものの明白な選択になったとき、ToddはJavaプログラミング言語に移行しました。Toddは、Java Language API SuperBibleの共著者であり、現在、世界中の書店にあります。Toddは、執筆に加えて、米国南東部の企業にインターネットおよびWebコンサルティングサービスを提供しています。

このトピックの詳細

  • クラスGraphicsAPI:

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • クラスFontAPI:

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • クラスFontMetricsAPI:

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Graphicsクラスの使用:

    //www.javaworld.com/javaworld/jw-11-1996/jw-11-howto.html

  • 国際化API:

    //www.javasoft.com/products/JDK/1.1/docs/guide/intl/index.html

  • MaryCampioneとKathyWalrathによるJavaチュートリアル

    //www.javasoft.com/books/Series/Tutorial/index.html

このストーリー「テキストの描画は3つのJavaクラスで簡単」は、もともとJavaWorldによって公開されました。