SHOEISHA iD

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

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

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

指定幅に文章を書くための追い出し禁則処理

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

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

教科と科目

 教科と科目はそれぞれListに入っています。

科目のList:kamokus
[国語総合,現代文B,現代社会,数学Ⅰ,数学A,....]
教科のList:kyoukas
[国語,    国語,    公民,    数学,  数学,  ....]

 教科名が替わるまで科目名を数えておき、替わったタイミングで縦の均等割付を使って印字します。

教科と科目
教科と科目
教科名を書く部分
String lastkyoka = "";
if(kyoukas.size()>0) lastkyoka = kyoukas.get(0);
int kct = 0;
for (int k=0; kamokus.size()>k; k++){
    //教科名
    g2.setFont(font09);
    if(kyoukas.get(k).equals(lastkyoka)){
        kct++;
        line.setLR(hbas+hwkyo,hbas+hwall);
    }else{
        kvwm = vptch*kct;
        adv = new AdjustStringV(g2, lastkyoka,kvwm-kct*2); //kct:use as padding
        if(!adv.hasNext()){
            adv.drawTtoB(hbas+hwkyo/2f,vtdtop+vptch*(k-kct) +kct);
        }else{
            //正式教科名で書ききれない時に略称で書く処理(省略)
        }
        lastkyoka=kyoukas.get(k);
        kct=1;
        line.setLR(hbas,hbas+hwall);
    }
    line.setY(vtdtop+vptch*k); //upper line
    g2.draw(line);
    //科目名を書く部分(以下省略)

 図に合わせてプログラムの動きを説明すると次のようになります。

  1. 最初にlastkyokaを"国語"にして繰り返しを開始する
  2. 国語総合では教科名がlastkyokaと同じなのでkctを+1する。結果kctは1.横罫線を科目部分からに設定する
  3. (横罫線は国語総合の上部に引かれてすでにある太い線に重なってしまう)
  4. 現代文Bでも教科名がlastkyokaと同じなのでkctを+1する。結果kctは2.横罫線を科目部分からに設定する
  5. 横罫線は現代文Bの上に引かれる
  6. 現代社会では教科名がlastkyokaと異なるので、lastkyoka(="国語")を書く
  7. 教科名の縦幅はvptch*kctを基本とするが、罫線に近すぎないように離す。離す量はkctが大きいほど余白があるので上下ともkct(mm)とする。kctを2度使って計算しているところが分かりにくいが、経験上バランスが取れる
  8. 新しいlastkyokaを"公民"とし、kctを1とする(現代社会の分)
  9. 横罫線は教科部分からに設定され、現代社会の上に引かれる
  10. 数学Ⅰでは教科名がlastkyokaと異なるので、lastkyoka(="公民")を書く
  11. ...以下同様に進める。最後の教科名は書かれないままになるので、科目名の繰り返しが終わった後に最後の教科名を書く

通知表印刷プログラムの構成

 通知表印刷プログラムのメインである、Tsuuchi.javaの全体を掲載する前に、Tsuuchi.javaから呼び出されるプログラムをまとめておきます。

プログラム 掲載回 内容
AdjustString.java 今回 横位置の均等割付けなどの配置。第4回に掲載したものに、今回禁則処理と姓名の均等割付けを追加した。
AdjustStringV.java 第6回 縦位置の均等割付けなどの配置。前回から変更なし。
Linemm.java 第4回 罫線描画。前回から変更なし。
MultiPageDialog.java 第5回 複数ページからなるプレビュー。前回から変更なし。
MultiPageViewable.java 第5回 プレビューで使えるように機能を規定するインターフェース。前回から変更なし。
Student.java 今回 成績と出欠データを保持する生徒のクラス。今回のプログラムの目的は、帳票印刷とプレビューなのでクラスの設計は簡略化してある。
HRdata.java 今回 Studentクラスにデモ用データをセットするためのクラス。9つのファイルから読み込んで、Studentのマップを返す。これもファイルは簡便なテキストファイルにしてある。
Tsuuchi.java 今回 プログラム本体。MultiPageViewableなクラスでHRdataでデータを取得し、MultiPageDialogでプレビューの後、帳票印刷をする。

Tsuuchi.java

Tsuuchi.java
/** 
通知表印刷の作成例プログラム
javaの基本機能だけで帳票印刷をする例として作成した。
均等割付、左寄せなどの指示をするAdjustString.javaに
追い出し禁則の機能を追加し、文章を印刷する。
他に、縦書きで同様な機能を持つAdjustStringV.java
罫線を引きやすくするLinemm.java
複数ページからなるプレビューMultiPageDialog.javaの
仕様例ともなっている。
(2020-2-21)
@author Adachi
*/
import java.awt.*;
import java.awt.print.*;
import java.util.List;
import java.util.Map;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaSize;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.swing.*;
public class Tsuuchi extends JPanel
                     implements Printable, MultiPageViewable {
    Map<Integer,Student> Students;
    HRdata hr;
    int gakki;
    int previewpage = 0;
    double wZh;
    Dimension motodims  = new Dimension();
    Dimension scaledims = new Dimension();
    float mm2pt = 72/25.4f;
    double trdx = 0;
    double trdy = 0;
    PrintRequestAttributeSet rqset ;
    double ratio = 1.0d; //用紙サイズに応じてsetPanelSize()で再設定

    public Tsuuchi(HRdata hr, int gakki){
        this.hr = hr;
        this.Students = hr.students;
        this.gakki = gakki;
        setBackground(Color.white);
        rqset = new HashPrintRequestAttributeSet();
        MediaSizeName msname = MediaSizeName.ISO_A4;
        rqset.add(msname);
        MediaSize msize = MediaSize.getMediaSizeForName(msname);
        float mwidth  = msize.getX(MediaPrintableArea.MM);
        float mheight = msize.getY(MediaPrintableArea.MM);
        float L = 5.1f;
        float R = 5.2f;
        float T = 5.3f;
        float B = 5.4f;
        rqset.add(new MediaPrintableArea(
            L, T, (mwidth - L - R), (mheight - T - B),
            MediaPrintableArea.MM));
        setPanelSize(mwidth,mheight);
    }
    public void setPanelSize(float w,float h){
        motodims.setSize(w*mm2pt,h*mm2pt); 
        setPreferredSize(motodims);
        wZh = motodims.getWidth()/motodims.getHeight();
        ratio = 1.0d;
    }
    @Override
    public double getRatio(){
        return ratio;
    }
    @Override
    public int incPreviewPage(){
        previewpage++;
        if (previewpage>=Students.size()) previewpage=0;
        repaint();
        return previewpage;
    }
    @Override
    public int decPreviewPage(){
        previewpage--;
        if (0>previewpage) previewpage = Students.size()-1;
        repaint();
        return previewpage;
    }
    @Override
    public int number(){
        return Students.size();
    }
    @Override
    public String getStatus(){
        String retv;
        if(Students.size()==0){
            retv ="....";
        }
        else{
             retv = (previewpage+1)+"/"+Students.size();
        }
        return retv;
    }
    @Override
    public String getCurrentData(){
        String retv;
        if (Students.containsKey(previewpage+1)){
            Student st = Students.get(previewpage+1);
            String bikou = (st.bikous.size()>0)?"備考あり":"備考なし";
            retv = st.no+" "+st.name +" "+ bikou;
        }else{
            retv = "init";
        }
        return retv;
    }
    //spinner-bidou
    @Override
    public void setTrdx(double x){
        trdx = x*mm2pt;
    }
    @Override
    public void setTrdy(double y){
        trdy = -y*mm2pt;
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        int viewpw = getParent().getWidth();
        int viewph = getParent().getHeight();
        JScrollPane sp = (JScrollPane) getParent().getParent();
        int hbarh = sp.getHorizontalScrollBar().getHeight();
        int vbarw = sp.getVerticalScrollBar().getWidth();
        boolean hbarAri = sp.getHorizontalScrollBar().isVisible();
        boolean vbarAri = sp.getVerticalScrollBar().isVisible();
        if (vbarAri) viewpw += vbarw;
        if (hbarAri) viewph += hbarh;
        double scale;
        if((viewpw-vbarw)/(double)viewph > wZh){
            scaledims.setSize(viewpw-vbarw, (viewpw-vbarw)/wZh);
            scale = (viewpw-vbarw)/motodims.getWidth();
        }else if( wZh > (double)viewpw / (viewph-hbarh)  ){
            scaledims.setSize((viewph-hbarh)*wZh, viewph-hbarh);
            scale = (viewph-hbarh)/motodims.getHeight();
        }else{
            if ( (double)viewpw/viewph > wZh ) {
                scaledims.setSize(viewph*wZh, viewph);
                scale = viewph/motodims.getHeight();
            }else{
                scaledims.setSize(viewpw, viewpw/wZh);
                scale = viewpw/motodims.getWidth();
            }
        }
        g2.scale(scale,scale);
        setPreferredSize(scaledims);
        drawPage(g2,previewpage);
    }
    @Override
    public int print(Graphics g, PageFormat pf, int pageIndex) {
        if (pageIndex >= Students.size()) return NO_SUCH_PAGE;
        Graphics2D g2 = (Graphics2D) g;
        drawPage(g2,pageIndex);
        return PAGE_EXISTS;
    }
    public void drawPage(Graphics2D g2,int idx){
        g2.translate(trdx,trdy); 
        Student st = Students.get(idx+1);
        List<String> kyoukas = st.kyoukas;
        List<String> kamokus = st.kamokus;
        List<Integer> tanis = st.tanis;
        List<Integer> zdns  = st.zdns;
        List<String> bundata = st.bikous;
        Map<Integer,List<Integer>> tensmap = st.tensmap ;
        Map<Integer,List<Integer>> kessmap = st.kessmap ;
        g2.setColor(Color.BLACK);
        //w:width ; v:virtical width ; pch:pitch
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        Font font18 = new Font("Serif", Font.PLAIN, 18);
        Font font14 = new Font("Serif", Font.PLAIN, 14);
        Font font12 = new Font("Serif", Font.PLAIN, 12);
        Font font10 = new Font("Serif", Font.PLAIN, 10);
        Font font09 = new Font("Serif", Font.PLAIN, 9);
        Font font08 = new Font("Serif", Font.PLAIN, 8);
        Font font06 = new Font("Serif", Font.PLAIN, 6);
        Font mfont11 = new Font("Sans", Font.PLAIN, 11);

        float vtitle = 24.2f;
        float vname = 35.0f;
        float hbas = 17.0f;  //左端の位置
        float hwkyo =7f;     //教科名の幅
        float hwkm = 27.5f;  //科目名の幅
        float hwtn = 7f;     //単位数の幅
        float hptch = 45f/4;  //学期などの幅
        float vthtop = 41.0f; //ヘッダ行の上の位置
        float vtdtop = 64.0f; //行データの上の位置
        float vptch  = 9.8f;  //行データの各行の高さ
        float mm2pt  = 72/25.4f;
        float pt2mm  = 25.4f/72;
        float hwall = hwkyo+hwkm+hwtn+hptch*4;
        float hwssk = hwkyo+hwkm+hwtn;
        float hbas2 = hbas+hwall+3.8f;
        float vschool= 246f; //学校名縦位置
        float vkouchou= 256f;//校長名縦位置
        float vtan  = 266f;  //担任名縦位置
        float vwbik = vptch*8f; //所見欄の高さ

        AdjustString ads;
        AdjustStringV adv;
        //タイトルなど
        g2.setFont(font18);
        ads = new AdjustString(g2,"成績通知表",62f);
        ads.drawKintou(hbas+14.5f,vtitle);
        g2.setFont(font14);
        ads = new AdjustString(g2, hr.nendo+"年度 "+gakki+"学期",hwall);
        ads.drawCenter(hbas,vname);
        g2.setFont(font12);
        ads = new AdjustString(g2,
              "第"+hr.HR.substring(0,1)+"学年 "
                  +hr.HR.substring(1,2)+"組 "+st.no+"番",hwall);
        ads.drawCenter(hbas2,vtitle);
        g2.setFont(font14);
        float hwname1 = 40f;
        ads = new AdjustString(g2, st.name, hwname1);
        if (!ads.hasNext()){
            ads.drawKintouSx(hbas2+(hwall-hwname1)/2,vname);
        }else{
            ads = new AdjustString(g2, st.name, hwall);
            ads.drawCenter(hbas2,vname);
        }
        //成績罫線
        BasicStroke boldstroke = new BasicStroke(1.0f);
        BasicStroke medmstroke = new BasicStroke(0.7f);
        BasicStroke thinstroke = new BasicStroke(0.0f);
        g2.setStroke(boldstroke);
        Linemm line = new Linemm();
        line.setTB(vthtop, vtdtop+vptch*kamokus.size());
        line.setX(hbas);
        g2.draw(line);
        line.setX(hbas+hwall);
        g2.draw(line);
        line.setLR(hbas, hbas+hwall);
        line.setY(vthtop);
        g2.draw(line);
        line.setY(vtdtop+vptch*kamokus.size());
        g2.draw(line);
        g2.setStroke(medmstroke);
        line.setY(vtdtop);
        g2.draw(line);

        g2.setStroke(thinstroke);
        line.setLR(hbas+hwkyo, hbas+hwall);
        for (int k=1; kamokus.size()>k; k++){ //1 not 0
            line.setY(vtdtop+vptch*k);
            g2.draw(line);
        }
        line.setTB(vthtop, vtdtop+vptch*kamokus.size());
        line.setX(hbas+hwkyo);
        g2.draw(line);
        line.setX(hbas+hwkyo+hwkm);
        g2.draw(line);
        for (int i=0; 4>i; i++){
            line.setX(hbas+hwkyo+hwkm+hwtn+hptch*i);
            g2.draw(line);
        }

        //成績titleheader部
        g2.setFont(font10);
        adv = new AdjustStringV(g2, "教科",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas+hwkyo/2f,vthtop+3f);
        ads = new AdjustString(g2, "科目",hwkm-16.4f);
        ads.drawKintou(hbas+hwkyo+8.2f,vtdtop-(vtdtop-vthtop)/2+10f*pt2mm/2f);
        adv = new AdjustStringV(g2, "単位数",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas+hwkyo+hwkm+hwtn/2f,vthtop+3f);
        adv = new AdjustStringV(g2, "一学期",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas+hwkyo+hwkm+hwtn+hptch/2f,vthtop+3f);
        adv = new AdjustStringV(g2, "二学期",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas+hwkyo+hwkm+hwtn+hptch*1.5f,vthtop+3f);
        adv = new AdjustStringV(g2, "三学期",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas+hwkyo+hwkm+hwtn+hptch*2.5f,vthtop+3f);
        adv = new AdjustStringV(g2, "学年",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas+hwkyo+hwkm+hwtn+hptch*3.5f,vthtop+3f);

        float padbtm = (vptch-g2.getFontMetrics().getHeight()*pt2mm)/2;
        float vm,hm;
        float padx = 2f;
        float kvwm;
        String lastkyoka = "";
        if(kyoukas.size()>0) lastkyoka = kyoukas.get(0);
        int kct = 0;
        for (int k=0; kamokus.size()>k; k++){
            //教科名
            g2.setFont(font09);
            if(kyoukas.get(k).equals(lastkyoka)){
                kct++;
                line.setLR(hbas+hwkyo,hbas+hwall);
            }else{
                kvwm = vptch*kct;
                adv = new AdjustStringV(g2, lastkyoka,kvwm-kct*2); //kct:use as padding
                if(!adv.hasNext()){
                    adv.drawTtoB(hbas+hwkyo/2f,vtdtop+vptch*(k-kct) +kct);
                }else{
                    String kawari=lastkyoka;
                    if(lastkyoka.equals("保健体育")) kawari = "保体";
                    if(lastkyoka.equals("地理歴史")) kawari = "地歴";
                    if(lastkyoka.equals("外国語"))  kawari = "外語";
                    adv = new AdjustStringV(g2, kawari,kvwm-kct); //kct:use as padding
                    adv.drawTtoB(hbas+hwkyo/2f,vtdtop+vptch*(k-kct) +kct/2f);
                }
                lastkyoka=kyoukas.get(k);
                kct=1;
                line.setLR(hbas,hbas+hwall);
            }
            line.setY(vtdtop+vptch*k); //upper line
            g2.draw(line);
            g2.setFont(font10);
            //科目名と単位 点数
            vm = vtdtop+vptch*(k+1)-padbtm;
            ads = new AdjustString(g2, kamokus.get(k) ,hwkm-padx*2f);
            if(ads.hasNext()){  //長い科目名を2行に
                ads.drawLeft(hbas+hwkyo+padx,vm+padbtm*3/4-vptch/2);
                ads = new AdjustString(g2, kamokus.get(k) 
                                    ,hwkm-padx*2f, ads.getNextPt());
                ads.drawRight(hbas+hwkyo+padx,vm+padbtm/2);
            }else{
                ads.drawKintou(hbas+hwkyo+padx,vm);
            }
            ads = new AdjustString(g2, String.valueOf(tanis.get(k)), hwtn);//単位数
            ads.drawCenter(hbas+hwkyo+hwkm,vm);
            for(int g=1;gakki>=g;g++){
                int ten = tensmap.get(g).get(k);//評点1~
                String strten = String.format("%3d",ten);
                if (ten==-1) strten = "( )";
                if (ten==-3) strten = " ";
                ads = new AdjustString(g2, strten, hptch);
                hm = hbas+hwkyo+hwkm+hwtn+hptch*(g-1);
                ads.drawCenter(hm,vm);
            }
            if (gakki==3) {//学年評点
                int ten = tensmap.get(gakki+1).get(k);
                String strten = String.format("%1d",ten);
                if (ten==-1) strten = "( )";
                if (ten==-3) strten = " ";
                ads = new AdjustString(g2, strten, hptch);
                hm = hbas+hwkyo+hwkm+hwtn+hptch*3;
                ads.drawCenter(hm,vm);
            }
        }
        //最後の教科名
        kvwm = vptch*kct;
        g2.setFont(font09);
        int k = kamokus.size();
        adv = new AdjustStringV(g2, lastkyoka,kvwm-kct*2); //kct:use as padding
        if(!adv.hasNext()){
            adv.drawTtoB(hbas+hwkyo/2f,vtdtop+vptch*(k-kct) +kct);
        }else{
            String kawari=lastkyoka;
            if(lastkyoka.equals("保健体育")) kawari = "保体";
            if(lastkyoka.equals("地理歴史")) kawari = "地歴";
            if(lastkyoka.equals("外国語"))  kawari = "外語";
            adv = new AdjustStringV(g2, kawari,kvwm-kct); //kct:use as padding
            adv.drawTtoB(hbas+hwkyo/2f,vtdtop+vptch*(k-kct) +kct/2f);
        }

        //出欠
        g2.setStroke(boldstroke);
        line.setLR(hbas2,hbas2+hwall);
        line.setY(vthtop);
        g2.draw(line); //Rectangle TOP
        line.setY(vtdtop);
        g2.draw(line); //Rectangle th/td
        line.setY(vtdtop+vptch*8);
        g2.draw(line); //Rectangle th/td
        line.setTB(vthtop,vtdtop+vptch*8);
        line.setX(hbas2);
        g2.draw(line); //Rectangle left
        line.setX(hbas2+hwall);
        g2.draw(line); //Rectangle right
        g2.setStroke(thinstroke);
        for(int gk=1;4>=gk;gk++){
            line.setX(hbas2+hwall-hptch*gk);
            g2.draw(line); //tate hwssk|hptch|hptch|...
        }
        line.setLR(hbas2,hbas2+hwall);
        for(int i=1;8>i;i++){
            line.setY(vtdtop+vptch*i);
            g2.draw(line);
        }
        ads = new AdjustString(g2, "項目",hwssk-16.4f);
        ads.drawKintou(hbas2+8.2f,vtdtop-(vtdtop-vthtop)/2+10f*pt2mm/2f);
        adv = new AdjustStringV(g2, "一学期",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas2+hwssk+hptch/2f,vthtop+3f);
        adv = new AdjustStringV(g2, "二学期",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas2+hwssk+hptch*1.5f,vthtop+3f);
        adv = new AdjustStringV(g2, "三学期",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas2+hwssk+hptch*2.5f,vthtop+3f);
        adv = new AdjustStringV(g2, "学年",vtdtop-vthtop-6f);
        adv.drawTtoB(hbas2+hwssk+hptch*3.5f,vthtop+3f);

        int no = st.no;
        vm = vtdtop-padbtm;
        hm = hbas2;
        ads = new AdjustString(g2,"授業日数",hwssk-4f);
        ads.drawKintou(hm+2f,vm+vptch);
        g2.setFont(font09);
        ads = new AdjustString(g2,"出校停止・忌引等の日数",hwssk-4f);
        ads.drawKintou(hm+2f,vm+vptch*2);
        g2.setFont(font10);
        ads = new AdjustString(g2,"出席すべき日数",hwssk-4f);
        ads.drawKintou(hm+2f,vm+vptch*3);
        ads = new AdjustString(g2,"欠席日数",hwssk-4f);
        ads.drawKintou(hm+2f,vm+vptch*4);
        ads = new AdjustString(g2,"出席日数",hwssk-4f);
        ads.drawKintou(hm+2f,vm+vptch*5);
        ads = new AdjustString(g2,"欠課時数",hwssk-4f);
        ads.drawKintou(hm+2f,vm+vptch*6);
        ads = new AdjustString(g2,"遅刻",hwssk-4f);
        ads.drawKintou(hm+2f,vm+vptch*7);
        ads = new AdjustString(g2,"早退",hwssk-4f);
        ads.drawKintou(hm+2f,vm+vptch*8);

        g2.setFont(mfont11);
        int gmax = (gakki==3)? 4:gakki;
        for (int g = 1; gmax>=g; g++){
            hm = hbas2+hwssk+hptch*(g-1);
            List<Integer> ks = kessmap.get(g);
            if(ks==null)continue;
            //int zd = zdn[gk];
            int zd = zdns.get(g-1);
            ads = new AdjustString(g2,String.valueOf(zd),hptch); //授業日数
            ads.drawCenter(hm,vm+vptch);
            ads = new AdjustString(g2,String.valueOf(ks.get(0)),hptch); //1:忌引き
            ads.drawCenter(hm,vm+vptch*2);
            ads = new AdjustString(g2,String.valueOf(zd-ks.get(0)),hptch);
            ads.drawCenter(hm,vm+vptch*3);
            ads = new AdjustString(g2,String.valueOf(ks.get(1)),hptch); //2:欠席
            ads.drawCenter(hm,vm+vptch*4);
            ads = new AdjustString(g2
                  ,String.valueOf(zd-ks.get(0)-ks.get(1)),hptch);
            ads.drawCenter(hm,vm+vptch*5);
            ads = new AdjustString(g2,String.valueOf(ks.get(2)),hptch);
                  //3:欠課時数 4:不使用
            ads.drawCenter(hm,vm+vptch*6);
            ads = new AdjustString(g2,String.valueOf(ks.get(4)),hptch); //5:遅刻
            ads.drawCenter(hm,vm+vptch*7);
            ads = new AdjustString(g2,String.valueOf(ks.get(5)),hptch); //6:早退
            ads.drawCenter(hm,vm+vptch*8);
        }
        //所見(備考)
        String kinsoku = "、。,.";
        g2.setFont(font08);
        vm = vtdtop+vptch*9f;
        ads = new AdjustString(g2,"所見",8f);
        ads.drawKintou(hbas2+2f,vm+5f);
        g2.setStroke(boldstroke);
        line.setLR(hbas2,hbas2+hwall);
        line.setY(vm);
        g2.draw(line); //Rectangle TOP
        line.setY(vm+vwbik);
        g2.draw(line); //Rectangle bottom
        line.setTB(vm,vm+vwbik);
        line.setX(hbas2);
        g2.draw(line); //Rectangle left
        line.setX(hbas2+hwall);
        g2.draw(line); //Rectangle right
        g2.setFont(font10);
        float fh = g2.getFont().getSize2D()*pt2mm*1.2f;
        int ln=0;
        vm = vm + fh+2f;
        if ( bundata!=null ){
            for(String bun :bundata){
                int bgpt=0;
                do{
                    ads = new AdjustString(g2,bun,hwall-4f,bgpt);
                    ads.setOidashiIfNeeded(kinsoku);
                    if(ads.hasNext()) ads.drawKintou(hbas2+2f,vm+fh*(++ln));
                    else              ads.drawLeft  (hbas2+2f,vm+fh*(++ln));
                }while((bgpt=ads.getNextPt()) > 0);
            }
        }
        g2.setFont(font12);
        ads = new AdjustString(g2,"高野学院",(hwall-5f)*0.3f);
        ads.drawKintou(hbas2+(hwall-5f)*0.1f,vschool);
        g2.setFont(font14);
        ads = new AdjustString(g2,"袰月高等学校",(hwall-5f)*0.45f);
        ads.drawKintou(hbas2+(hwall-5f)*0.5f,vschool);
        g2.setFont(font12);
        ads = new AdjustString(g2,"校長",11f);
        ads.drawKintou(hbas2+20f,vkouchou);
        g2.setFont(font14);
        ads = new AdjustString(g2,hr.kouchou,32f);
        ads.drawKintouSx(hbas2+38f,vkouchou);
        g2.setFont(font12);
        ads = new AdjustString(g2,"担任",11f);
        ads.drawKintou(hbas2+20f,vtan);
        g2.setFont(font14);
        ads = new AdjustString(g2,hr.hrtan,32f);
        ads.drawKintouSx(hbas2+38f,vtan);

        g2.setFont(font10);
        ads = new AdjustString(g2,"各学期は100点法、学年は5段階で評価。",hwall);
        ads.drawLeft(hbas+3f,vtan);

        g2.setFont(font06);
        ads = new AdjustString(g2,"担任印",8f);
        ads.drawKintou(hbas2+hwall-10,vtan-7f);

        g2.setStroke(thinstroke);
        line.setLR(hbas2+hwall-12f,hbas2+hwall);
        line.setY(vtan-10f);
        g2.draw(line); //Rectangle TOP
        line.setY(vtan+2f);
        g2.draw(line); //Rectangle bottom
        line.setTB(vtan-10f,vtan+2f);
        line.setX(hbas2+hwall-12f);
        g2.draw(line); //Rectangle left
        line.setX(hbas2+hwall);
        g2.draw(line); //Rectangle right
    }
    public void doPrint() {
        PrinterJob pj = PrinterJob.getPrinterJob();
        pj.setPrintable(this);
        if (pj.printDialog(rqset)) {
            try { pj.print(rqset); }
            catch (PrinterException e) {
                System.err.println(e);
            }
        }
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                createAndShowGUI();
            }
        });
    }
    public static void createAndShowGUI() {
        int gakki = 3;
        HRdata hr = new HRdata(2016,"1J",gakki);
        Tsuuchi pable = new Tsuuchi(hr,gakki);
        MultiPageDialog dialog = new MultiPageDialog(null,true,pable);
        dialog.showDialog();
        while (dialog.getValue()==1){
            System.out.println("印刷を開始");
            pable.doPrint();
            System.out.println("印刷を終了");
            dialog.showDialog();
        }
        System.out.println("Canseled:"+dialog.getValue());
        dialog.dispose();
    }
}

次のページ
Student.java

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング