はじめに
前回はプリンタの検索と選択を扱いましたがスッキリとしないお話になってしまいました。Javaだけでは完結しない部分でOSやプリンタによっても異なるので仕方がないと思っています。今回は元に戻って印刷位置の指定の詳しい話をします。
第1回で文字列の印刷位置を0.1mm単位で指定できることを示しました。しかし、それは文字列の印刷開始点の指定だけで、文字の間隔も制御したい場合には一文字ずつ指定していかなくてはならないことになります。まず、多くの場合必要となる均等割付けや右寄せの指定を自動化するプログラムをクラスとして紹介します。それを応用すると見出しなど、枠のない所に書く文字列の文字間隔の調整が楽になることを示したいと思います。
まずは、どんな時にどんな指定をするのかの例を示しておきます。
図のように用紙の上辺から30.2mm、左辺から30.1mmの所に幅50.3mm高さ8.4mmの枠があったとして、「国語総合」という文字列を下部を2mm、両側に3mmの余白をとって文字を等間隔に離して入れます。
floatの変数は、数値が何を意味するかを示すために使用したもので、実質は最後の2行です。g2はGraphics2Dのインスタンスです。
float x = 30.1f; float y = 30.2f; float w = 50.3f; float h = 8.4f; float padx = 3f; float pady = 2f; AdjustString ads = new AdjustString(g2, "国語総合", w-padx*2); ads.drawKintou(x+padx,y+h-pady);
AdjustStringクラスが今回最終的に紹介するプログラムで、文字列と印字幅を指定してインスタンスを作っておいて、印字開始位置を指定してメソッドで印字します。メソッドには均等割付・右寄せ・センタリングといろいろ用意されていますが、この例では均等割付を使いました。
均等割付・右寄せ・センタリング
均等割付・右寄せ・センタリングと文字を配置する方法をまとめておきます。
均等割付の本来の用途は図のように欄に入れる文字数が異なっても左右端で文字の位置を揃えるというものです。
単独の行であっても表題などを適当な文字間隔を置いて配置する時にも便利です。
数値の場合は、右寄せにして位を揃えたくなります。広めにとって右寄せにすることで、指定が楽になります。
数値でも場合によっては右寄せよりセンタリングをした方が見やすい場合もあります。罫線を引くための位置データをそのまま使用できるので、楽ができます。
統一的に扱う
文字列を配置する領域の幅から、文字列の実際の幅を引いた残りをどこに配置するかの違いと捉えることで統一的に扱うことができます。つまり、均等割付は残りを(文字数-1)で割って文字の間にはさみますが、2で割って文字列の頭に置くとセンタリングになり、残りをそのまま頭に置くと右寄せになります。
実際には、文字列が長くて指定幅に入り切らないという場合が起こります。そのためにここで紹介するプログラムには、現在のフォントで指定幅に入るかどうかを判定し、 入り切らない場合は書ける文字列の範囲と残りの文字列の先頭位置を保持するクラスを用意することにします。
印字前に入りきるかどうかの判定結果を受け取って、次の対処を考えます。例えば文字を小さくして再度判定するとか、 略語を書くことにするとか、2行に分けるとか、入る分だけを書くだけにするとかです。
印字する決断が付けば、印字開始位置と、均等割付・右寄せ・センタリングのどれかを指示して印字します。