SHOEISHA iD

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

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

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

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

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

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

線の太さの指定

 直線や四角形の線の太さを指定するには、setStroke()メソッドを使います。Graphics2Dクラスのメソッドです(指定しなければデフォルトの太さは1.0ポイントになっています)。

setStroke(Stroke s)
    s - java.awt.Stroke インターフェィスを持つインスタンス。
         実際にはjava.awt.BasicStrokeのインスタンス。

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

g2.setStroke(new BasicStroke(0.5f));
//ここで描いた線や四角の輪郭は0.5ポイント
g2.setStroke(new BasicStroke(0f));
//ここで描いた線や四角の輪郭は描画される対象のもっとも細い線になる

 線の太さを頻繁に変更する場合はあらかじめインスタンスを作って名前を付けておくのが良いかもしれません。コンストラクタはいくつかありますが、太さだけならこれです。

BasicStroke(float width)
    width 線の幅(単位はポイント 0にすると一番細い線となる)

 使用例。

BasicStroke boldStroke = new BasicStroke(1.0f);
BasicStroke fineStroke = new BasicStroke(0.0f);
g2.setStroke(fineStroke);
......

 0.0fは一番細い線ということになります。

 BasicStrokeのコンストラクタは線の幅の他に、両端の装飾(cap)、線の接合部の装飾(join)、接合トリミングの制限値(miterlimit)などの属性を指定するものもあります。デフォルトの属性は、実線の幅1.0、CAP_SQUARE、JOIN_MITER、接合制限値10.0です。

 さらに、点線、一点鎖線などの線のパターンも指定できます。

破線・一点鎖線の指定

 線の太さで区別するほうが美しいと思いますし、使用頻度も低いので、できるということだけ示しておきます。

 次のようなコンストラクタを使ってBasicStrokeのインスタンスを作り、それをセットして使います。

BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase)
    cap - 両端の装飾(CAP_BUTT(なし)、CAP_ROUND(丸)、CAP_SQUARE(角))
    join - 輪郭線の接合部の装飾(JOIN_ROUND(丸)、JOIN_BEVEL(直線で接合)、JOIN_MITER(延長))
    miterlimit - 延長の制限値。 miterlimitは1.0f以上でなければならない 
    dash - 破線パターンを表す配列
    dash_phase - 破線パターン開始位置のオフセット

 破線パターンは描画する線の長さと描画しないで送る長さをポイント(1/72インチ)単位のfloatの値で表し、配列に格納したものです。普通のBasicStrokeのインスタンスに、後付で破線パターンを追加できれば便利なのですが、それができません。異なる破線が必要なときは、そのたびにBasicStrokeのインスタンスを生成します。

 加えて煩わしいことに、破線パターンを指定できるコンストラクタは、cap、join、miterlimitの引数も省略できません。線の端点処理と接合処理の指定ですが、以下の例のように決め打ちにしておいても帳票に使うような細い破線ならば問題ありません。

 破線パターンにだけ注目することにします。

 4.5ポイントの線と2.5ポイントの隙間が繰り返される破線。

float[] dash1 = {4.5f, 2.5f};

 12ポイントの線、2ポイントの隙間、1ポイントの線、2ポイントの隙間の繰り返しでできる一点鎖線。

float[] dash2 = {12.0f, 2.0f, 1.0f, 2.0f};

 9ポイントの線と9ポイントの隙間が繰り返される破線。

float[] dash3 = {9.0f};

 生成したBasicStrokeをsetして今までどおり描画をすれば、直線も四角形も指定した線になります。

float[] dash = {4.5f, 2.5f};
BasicStroke hasen = new BasicStroke(
    0.5f,
    BasicStroke.CAP_BUTT,
    BasicStroke.JOIN_MITER,
    10f, dash, 0f);
g2.setStroke(hasen);
......

 実際に描画すると次のようになります。

破線・点線などの印字例:破線パターン指定例
破線・点線などの印字例:破線パターン指定例

色の指定

 プログラム例には出しませんでしたが、文字でも線でも色を指定できます。

 Graphics2Dのデフォルトの色は黒です。描画色の設定を変更すると、それ以降描いたものはその色になります。

 java.awt.Graphics2DクラスのsetPaint()メソッドか、java.awt.GraphicsクラスのsetColor()メソッドを使います。

 setPaint()の引数はPaintインターフェースをもつクラスのインスタンスでさまざまなことができますが、単に色を変えるならjava.awt.Colorクラスのインスタンスを使うことができます。この場合はsetColor()を使うのと同じ機能になります。

 帳票印刷では色を変える以上のことはあまり要求されないと思うので、Colorの引数のみ書いておきます。

setPaint(Paint paint)
    paint - Paint インターフェース をもつクラスのインスタンス
    Paintインターフェースを持つクラスには、Color, GradientPaint, TexturePaint などがある
    (java.awt.Graphics2Dクラスのメソッド)
setColor(Color c)
    c - 新しい描画色。
    (java.awt.Graphicsクラスのメソッド)

 使用例(g2はGraphics2Dのインスタンスです)。

g2.setPaint(Color.RED);
g2.setColor(Color.RED);

 Color.REDは、java.awt.Colorクラスのフィールド定数です。次のものが定義されています。

 BLACK、BLUE、CYAN、GRAY、GREEN、MAGENTA、ORANGE、PINK、RED、WHITE、YELLOW以上は小文字も使えます。DARK_GRAY、LIGHT_GRAYは小文字ではキャメルタイプにします。darkGray、lightGray。

 その他の色は、RGB(A)で指定してインスタンスを作るコンストラクタがいくつかあります。

Color(int rgb)
    rgb - 16進表記にすると、0xRRGGBB と書ける 
Color(int r, int g, int b)
    r - 赤色成分(0 - 255) 
    g - 緑色成分(0 - 255) 
    b - 青色成分(0 - 255) 

まとめ

  • implements Printableなクラスを作り、print()メソッド中に描画指示を書く。
  • 印刷の実行はPrinterJobで行う。
  • 描画位置の指示はポイント単位だがfloatを使えば解像度は十分。

 普通の帳票に使うであろう最低限のメソッドを以下に書いておきます。位置指定以外は適当な値を入れています。位置指定は適当な値を入れてしまうと何の値か分からなくなるので型と変数で書いてあります。

Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.RED); //描画色の設定
Font f = new Font(Font.SERIF, Font.PLAIN, 12)); //フォントのサイズなど指定
g2.setFont(f); //使用フォントの指定
g2.drawString("ABCDEF", float x, float y); //文字列描画
g2.setStroke(new BasicStroke(0.5f));  //線の太さ指定
Line2D line = new Line2D.Float();  //直線のインスタンス生成
line.setLine(float x1, float y1, float x2, float y2); //始点・終点指定
g2.draw(line);  //直線の描画
Line2D rect = Rectangle2D.Float();  //四角形のインスタンス生成
rect.setRect?(float x, float y, float w, float h); //始点・終点・幅・高さ指定
g2.draw(rect);  //四角形の描画

 次回は、用紙のサイズや向き、余白の指定について説明します。また実際に印刷する時の2つの方法であるPrinterJobを使う方法とDocPrintJobを使う方法を説明します。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Javaの標準機能だけで実現する帳票印刷連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー