SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaの標準機能だけで実現する帳票印刷

Javaの標準機能だけで実現する帳票印刷の基本

Javaの標準機能だけで実現する帳票印刷 第1回

文字の描き方

 drawString()がメインのメソッドです。java.awt.Graphics2Dクラスのメソッドです。

drawString(String str, float x, float y)
    str - 描画されるString
    x - Stringが描画される位置のx座標
    y - Stringが描画される位置のy座標
     位置はポイントで指定します

 プログラム中の使用例(g2はGraphics2Dのインスタンスです)。

g2.drawString("枠内に文字を書きます", 32.8f*mm2pt, 35.9f*mm2pt);

 数値は整数で指定しても問題ありませんが、小数がついている数値にfを書き忘れるとコンパイルが通りません。小数がついている数値は精度を指定しないとdoubleの扱いになり、floatの値との積もdoubleになります。doubleが引数の drawString()メソッドはないので「適切なメソッドが見つかりません(String,double,double)」というエラーになります。

 印字位置は英文のベースラインの開始点です。ベースラインはa、b、cなどの下端で、p、yなどは下にはみ出ますが、漢字は下端がp、yなどと揃えられていることが多いので、指定した位置よりちょっと下にずれた位置になります。

 漢字では文字の左上の角を指定したつもりになってしまいがちなので、注意が必要です。

 文字の大きさやフォントの指定はsetFont()メソッドを使います。正確にはGraphics2Dクラスの親であるGraphicsクラスのメソッドです。

setFont(Font font)
    font - フォント。java.awt.Fontクラスのインスタンス。

 プログラム中の使用例(g2はGraphics2Dのインスタンスです)。

import static java.awt.Font.*;
g2.setFont(new Font(SERIF, PLAIN, 12));
//ここで描いた文字は12ポイント
g2.setFont(new Font(SANS_SERIF, PLAIN, 9));
//ここで描いた文字は9ポイント

 SERIF、PLAINなどはjava.awt.Fontクラスのフィールド定数です。このプログラムはimport static java.awt.Font.*;を宣言しているので、こう書けますが、そうでなければ、Font.SERIF, Font.PLAINなどと書きます。

 文字のサイズは頻繁に変更するので、あらかじめインスタンスを用意しておくのが良いかもしれません。使用するコンストラクタは次のものがよいでしょう。

Font(String name, int style, int size)
    name - フォント名。物理フォント名または論理フォントのファミリー名
    style - Fontのスタイル定数。PLAIN, BOLD, ITALIC
    size - Fontのポイント・サイズ(ここは整数のみです)

 使用例。

Font fm10 = new Font(SERIF, PLAIN, 10);
Font fg09 = new Font(SANS_SERIF, PLAIN, 9);
g2.setFont(fm10);

 文字の大きさを表すポイントは整数でなければなりません。文字の大きさはポイントで慣れているのでポイントのまま指定していますが、mmで指定してポイントに換算する場合はintに変換する必要があります。

 フォント名はローカルなPCにインストールされているフォント名(物理フォント名)を指定することもできますが、別のPC上で動かすことを考えて論理フォントのファミリー名で指定しています。物理フォント名で指定した場合、そのフォントがなければ適当なフォントが割り当てられてしまいます。論理フォントのファミリー名で指定した場合は、WindowsでもLinuxでも、そのファミリー内のフォントが使用されます。

 論理フォントのファミリー名を表すフィールド定数は、SERIF、SANS_SERIF、MONOSPACED、DIALOG、DIALOG_INPUTの5つです。その値は文字列で、それぞれ"Serif"、"SansSerif"、"Monospaced"、"Dialog"、"DialogInput" です。直接書くのとたいして変わりませんが定数を使えばコンパイラがスペルミスを指摘してくれます。この定数は、Java 1.6から使えるようになりました。

 SERIFは明朝体、SANS_SERIFはゴシック体と考えて良いでしょう。MONOSPACEDはプロポーショナル印字をせずに等幅フォントを使うということです。DIALOGはGUIの画面に使うフォントで画面で見やすいようになっているもの。DIALOG_INPUTは画面での入力時に使うフォントです。

 SERIFやSANS_SERIFなどはローカルなPCの物理フォントのどれかに割り当てられます。どのフォントに割り当てられるかは、Javaの環境設定で決まります。Javaのインストール時に自動で決定されます。変更することもできますが、そのPC独自の設定となります。

 スタイルは標準/太字/斜体です。BOLD|ITALIC(またはBOLD+ITALIC)で太字でかつ斜体とできます。フィールド定数の値が、PLAIN=0、BOLD=1、ITALIC=2だからです。

直線の描き方

 java.awt.Graphicsクラスに、直線を描くdrawLine()や四角形を描くdrawRect()メソッドがありますが、位置指定が整数なので、解像度に不足が生じます。そこで小数で指定できるjava.awt.Graphics2Dクラスのメソッドを使います。

 Graphics2Dクラスでは、直線や四角形のインスタンスを作ってからdraw()メソッドで描画するという手順になります。

 直線を表現するクラスはjava.awt.geom.Line2Dです。コンストラクタはネストされたLine2D.Double、またはLine2D.Floatを選べますが、文字の位置指定に合わせてfloatにします。

Line2D.Float(float x1, float y1, float x2, float y2)
    x1 - 始点の X 座標
    y1 - 始点の Y 座標
    x2 - 終点の X 座標
    y2 - 終点の Y 座標

 端点の座標を後から設定したり変更したりすることも可能です。

Line2D line = new Line2D.Float();
line.setLine(float x1, float y1, float x2, float y2);

 プログラム中の使用例(g2はGraphics2Dのインスタンス、x,yはfloatの変数です)。

Line2D line = new Line2D.Float();
y = 52.0f*mm2pt;
line.setLine(x, y, 50.0f*mm2pt, y);
g2.draw(line);

四角形の描き方

 四角形を表現するクラスはjava.awt.geom.Rectangle2Dです。コンストラクタはネストされたRectangle2D.Double、またはRectangle2D.Floatを選べますが、文字の位置指定に合わせてfloatにします。

Rectangle2D.Float(float x, float y, float w, float h)
    x - 左上角の X 座標
    y - 左上角の Y 座標
    w - 四角形の幅
    h - 四角形の高さ

 端点の座標や幅を後から設定したり変更したりすることも可能です。

Rectangle2D rect = new Rectangle2D.Float();
rect.setRect(float x, float y, float w, float h);

 プログラム中の使用例(g2はGraphics2Dのインスタンス、x,y,w,hはfloatの変数です)。

Rectangle2D waku = new Rectangle2D.Float(x, y, w, h);
g2.draw(waku);

次のページ
線の太さの指定

この記事は参考になりましたか?

Javaの標準機能だけで実現する帳票印刷連載記事一覧

もっと読む

この記事の著者

安達 順一(アダチ ジュンイチ)

私立高校に理科・情報の教員として勤めていました。Linuxサーバー/クライアントの授業システムを作り、移動プロファイルで運用していました。教員用にもLinuxサーバーを用意し成績処理プログラムを書きました。情報の学校設定科目ではウェブページ制作とjavaのプログラミングの初歩の授業を作りました。情報...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11483 2019/05/09 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー