教科と科目
教科と科目はそれぞれ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); //科目名を書く部分(以下省略)
図に合わせてプログラムの動きを説明すると次のようになります。
- 最初にlastkyokaを"国語"にして繰り返しを開始する
- 国語総合では教科名がlastkyokaと同じなのでkctを+1する。結果kctは1.横罫線を科目部分からに設定する
- (横罫線は国語総合の上部に引かれてすでにある太い線に重なってしまう)
- 現代文Bでも教科名がlastkyokaと同じなのでkctを+1する。結果kctは2.横罫線を科目部分からに設定する
- 横罫線は現代文Bの上に引かれる
- 現代社会では教科名がlastkyokaと異なるので、lastkyoka(="国語")を書く
- 教科名の縦幅はvptch*kctを基本とするが、罫線に近すぎないように離す。離す量はkctが大きいほど余白があるので上下ともkct(mm)とする。kctを2度使って計算しているところが分かりにくいが、経験上バランスが取れる
- 新しいlastkyokaを"公民"とし、kctを1とする(現代社会の分)
- 横罫線は教科部分からに設定され、現代社会の上に引かれる
- 数学Ⅰでは教科名がlastkyokaと異なるので、lastkyoka(="公民")を書く
- ...以下同様に進める。最後の教科名は書かれないままになるので、科目名の繰り返しが終わった後に最後の教科名を書く
通知表印刷プログラムの構成
通知表印刷プログラムのメインである、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
/** 通知表印刷の作成例プログラム 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(); } }