import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.PrinterJob;
import java.awt.print.Printable;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class PrintingSample implements Printable {
private FormFormatter form;
public PrintingSample () {
form = new FormFormatter("さくらば ゆういち");
form.addMatter(new Date(), "パソコン", 100000);
form.addMatter(new Date(), "メモリ", 9900);
form.addMatter(new Date(), "HD", 12000);
int result = JOptionPane.showOptionDialog((JFrame)null, form, "Dialog Sample",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE,
null, new String[]{"Print", "Make Image", "Cancel"},
"Print");
if (result == 0) {
printDoc();
} else if (result == 1) {
createImage();
}
}
private void printDoc() {
PrinterJob printerJob = PrinterJob.getPrinterJob();
printerJob.setPrintable(this);
boolean doPrint = printerJob.printDialog();
if (doPrint) {
try {
printerJob.print();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public int print(Graphics g, PageFormat format, int pageIndex) {
if (pageIndex == 0) {
Graphics2D g2D = (Graphics2D)g;
g2D.translate(format.getImageableX(), format.getImageableY());
g2D.drawString("Date: " + new Date(), 0, 20);
g2D.drawString("Page: " + (pageIndex+1), 0, (int)format.getImageableHeight());
g2D.translate(0, 20);
form.print(g2D);
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}
private void createImage() {
BufferedImage image = new BufferedImage(400, 600, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, 600, 800);
g.setColor(Color.BLACK);
form.paintComponent(g);
g.dispose();
JFrame frame = new JFrame("Image View");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new JLabel(new ImageIcon(image)));
frame.pack();
frame.setVisible(true);
try {
ImageIO.write(image, "PNG", new File("result.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
new PrintingSample();
}
}
class FormFormatter extends JComponent {
private String name;
private DecimalFormat decFormat;
private DateFormat dateFormat;
private List matters;
class Matter {
Date date;
String item;
int charge;
Matter(Date date, String item, int charge) {
this.date = date;
this.item = item;
this.charge = charge;
}
}
public FormFormatter(String name) {
this.name = name;
matters = new ArrayList();
decFormat = new DecimalFormat("###,###,###");
dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
setPreferredSize(new Dimension(400, 600));
}
public void addMatter(Date date, String item, int charge) {
Matter matter = new Matter(date, item, charge);
matters.add(matter);
}
public void paintComponent(Graphics g) {
Graphics2D g2D = (Graphics2D)g;
g2D.draw(new Rectangle2D.Double(10, 10, 380, 580));
g2D.drawString("請求書", 50, 50);
g2D.draw(new Line2D.Double(20, 180, 360, 180));
g2D.drawString("日時", 50, 170);
g2D.drawString("費目", 150, 170);
g2D.drawString("金額", 250, 170);
g2D.drawString(name + " 様", 50, 100);
for (int i = 0; i < matters.size(); i++) {
Matter matter = (Matter)matters.get(i);
g2D.drawString(dateFormat.format(matter.date), 50, 200 + i * 20);
g2D.drawString(matter.item, 150, 200 + i * 20);
g2D.drawString(decFormat.format(matter.charge), 250, 200 + i * 20);
}
}
}
|