import java.awt.*; import java.awt.print.*; import java.util.ArrayList; import javax.swing.*; public class PrintTest2Panel extends JPanel implements Printable { //Eclipseの場合、シリアライズ可能クラスでこれがないと警告が出る private static final long serialVersionUID=0; // String[] stringData; //印刷時のページ数と各ページ先頭 int page; int[] lineStart; int[] charStart; //その印刷設定でのページチェックをしたか(印刷の最初に1度だけする) boolean pageCheck; // public PrintTest2Panel(){ setBackground(Color.WHITE); // stringData=new String[0]; pageCheck=false; } public void setString(String[] s){ stringData=s; } //画面への描画 public void paintComponent(Graphics g){ super.paintComponent(g); //文字の幅と改行の高さを求めるため必要 FontMetrics metrics=g.getFontMetrics(); //周囲の空白 int margin=10; //文字の表示位置 int px=margin; int py=margin+metrics.getHeight(); //1文字づつ位置を指定して描画(画面下に隠れるのは考慮していない) for(int l=0;lgetWidth()-2*margin){ px=margin; py+=metrics.getHeight(); } } //次の行へ px=margin; py+=metrics.getHeight(); } } //プリンターへの出力 public int print(Graphics g, PageFormat fmt, int index) throws PrinterException { //文字の幅と改行の高さを求めるため必要 FontMetrics metrics=g.getFontMetrics(); //ページチェックしていなければする if(!pageCheck){ chaeckPageAttribute(metrics,fmt); } // if(index>=page){ //範囲外のページなら、NO_SUCH_PAGEを返す pageCheck=false; //その条件の印刷終了(次では新たな条件でページチェックする) return NO_SUCH_PAGE; }else{ //範囲内のページなら描画して、PAGE_EXISTSを返す //印刷可能な左上位置 int x=(int)fmt.getImageableX(); int y=(int)fmt.getImageableY(); g.translate(x,y); //文字の表示位置 int px=0; int py=metrics.getHeight(); //1文字づつ位置を指定して描画 for(int l=lineStart[index];lfmt.getImageableWidth()){ px=0; py+=metrics.getHeight(); //下にはみ出すならページ終了 if(py>fmt.getImageableHeight()){ return PAGE_EXISTS; } } //1文字描画 g.drawString(String.valueOf(stringData[l].charAt(c)),px,py); //表示位置を文字幅だけ右に移動 px+=metrics.charWidth(stringData[l].charAt(c)); } //行の最後の文字まで描画し終わったら改行 px=0; py+=metrics.getHeight(); //下にはみ出すならページ終了 if(py>fmt.getImageableHeight()){ return PAGE_EXISTS; } } //最後まで描画し終わったらページ終了 return PAGE_EXISTS; } } //その印刷設定で何ページになり、各ページの先頭はどこになるか(印刷の最初に1度だけする) private void chaeckPageAttribute(FontMetrics metrics,PageFormat fmt){ ArrayList lineArray=new ArrayList(); ArrayList charArray=new ArrayList(); //文字の表示位置 int px=0; int py=metrics.getHeight(); //最初のページ lineArray.add(Integer.valueOf(0)); charArray.add(Integer.valueOf(0)); //1文字づつ位置を確認(描画はせず、最初から最後まで流してページ確認する) for(int l=0;lfmt.getImageableWidth()){ px=0; py+=metrics.getHeight(); //下にはみ出すなら次ページへ if(py>fmt.getImageableHeight()){ px=0; py=metrics.getHeight(); //次ページの先頭を格納 lineArray.add(Integer.valueOf(l)); charArray.add(Integer.valueOf(c)); } } //ここで描画はしない //表示位置を文字幅だけ右に移動(ここで右にはみ出ることはあるまい) px+=metrics.charWidth(stringData[l].charAt(c)); } //行の最後の文字まで終わったら改行 px=0; py+=metrics.getHeight(); //下にはみ出すなら次ページへ if(py>fmt.getImageableHeight()){ px=0; py=metrics.getHeight(); //最終行でなければ、次ページの先頭を格納(最終行なら全て終了) if(l!=stringData.length-1){ lineArray.add(Integer.valueOf(l+1)); charArray.add(Integer.valueOf(0)); } } } //ページチェックの結果をセット page=lineArray.size(); lineStart=new int[page]; charStart=new int[page]; for(int p=0;p