SHOEISHA iD

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

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

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

均等割付・右寄せ・センタリングを簡単に扱う道具を作る

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

 本稿では、Java SEの標準機能だけを使った帳票印刷の方法を解説します。前回はプリンタ(ドライバ)から対応可能な用紙サイズを取得することでJavaに登録されていない長形3号封筒などへの印刷について説明しました。今回は均等割付けなどの文字配置や罫線を簡単に処理するための自作クラスの提案をします。サロゲートペアを必要とする文字についても対応します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 前回はプリンタの検索と選択を扱いましたがスッキリとしないお話になってしまいました。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行に分けるとか、入る分だけを書くだけにするとかです。

 印字する決断が付けば、印字開始位置と、均等割付・右寄せ・センタリングのどれかを指示して印字します。

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
指定幅に入るかを調べるために

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaの標準機能だけで実現する帳票印刷連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12449 2020/06/29 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング