您的位置:首页 > 编程语言 > Java开发

Java开发实例大全提高篇——图形图像篇(二)

2017-06-30 00:00 435 查看
第5章 打印报表
5.1 打印控制
实例094 “打印”对话框
public static void main(String[] args) {
PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
if (!job.printDialog()) { // 打开打印对话框
return; // 单击打印对话框的取消按钮或关闭打印对话框结束程序的执行
}
job.setJobName("测试打印对话框"); // 设置打印任务的名称
String jobName = job.getJobName(); // 获得 打印任务的名称
System.out.println("打印任务的名称是: " + jobName);
}

实例095 实现打印
PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintControlFrame frame = new PrintControlFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public PrintControlFrame() {
super();
setTitle("实现打印");
getContentPane().setLayout(null);
setBounds(100, 100, 281, 179);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
if (!job.printDialog()) // 打开打印对话框
return;// 单击打印对话框的取消按钮或关闭打印对话框结束程序的执行
job.setPrintable(new Printable() {
// 实现print()方法,绘制打印内容
public int print(Graphics graphics,
PageFormat pageFormat, int pageIndex)
throws PrinterException {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;// 返回该值表示没有打印页
Graphics2D g2 = (Graphics2D) graphics; // 获得图形上下文对象
g2.setColor(Color.BLUE); // 设置当前绘图颜色
Font font = new Font("宋体", Font.BOLD, 24);
g2.setFont(font); // 设置字体
g2.drawString("静夜思", 80, 40); // 绘制文本
font = new Font("宋体", Font.BOLD | Font.ITALIC, 18);
g2.setFont(font); // 设置字体
g2.drawString("李白", 130, 70); // 绘制文本
font = new Font("宋体", Font.PLAIN, 14);
g2.setFont(font); // 设置字体
g2.drawString("床前明月光,", 40, 100); // 绘制文本
g2.drawString("疑是地上霜。", 120, 100); // 绘制文本
g2.drawString("举头望明月,", 40, 120); // 绘制文本
g2.drawString("低头思故乡。", 120, 120); // 绘制文本
return Printable.PAGE_EXISTS;// 返回该值表示存在打印页
}
});
job.setJobName("打印唐诗《静夜思》"); // 设置打印任务的名称
job.print(); // 调用print()方法开始打印
} catch (PrinterException ee) {
ee.printStackTrace();
}
}
});
button.setText("打 印");
button.setBounds(28, 56, 86, 28);
getContentPane().add(button);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
button_1.setBounds(151, 56, 86, 28);
getContentPane().add(button_1);

//
}

实例096 打印图形
PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintShapeFrame frame = new PrintShapeFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public PrintShapeFrame() {
super();
setTitle("打印图形");
getContentPane().setLayout(null);
setBounds(100, 100, 281, 179);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
if (!job.printDialog()) // 打开打印对话框
return;// 单击打印对话框的取消按钮或关闭打印对话框结束程序的执行
job.setPrintable(new Printable() {
// 实现print()方法,绘制打印内容
public int print(Graphics graphics,
PageFormat pageFormat, int pageIndex)
throws PrinterException {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D)graphics; // 获得Graphics2D对象
BasicStroke stroke = new BasicStroke(3); // 创建宽度是3的笔画对象
g2.setStroke(stroke);// 设置笔画对象
Color color = new Color(0,162,232);// 创建颜色对象
g2.setColor(color);// 设置颜色
g2.drawOval(30, 40, 60, 60); // 绘制第一个圆
color = new Color(233,123,16); // 创建新的颜色对象
g2.setColor(color);// 设置颜色
g2.drawOval(60, 70, 60, 60); // 绘制第二个圆
color = new Color(28,20,100);// 创建新的颜色对象
g2.setColor(color);// 设置颜色
g2.drawOval(92, 40, 60, 60); // 绘制第三个圆
color = new Color(0,255,0);// 创建新的颜色对象
g2.setColor(color);// 设置颜色
g2.drawOval(122, 70, 60, 60); // 绘制第四个圆
color = new Color(255,0,0);// 创建新的颜色对象
g2.setColor(color);// 设置颜色
g2.drawOval(154, 40, 60, 60); // 绘制第五个圆
return Printable.PAGE_EXISTS;
}
});
job.setJobName("打印五环图形"); // 设置打印任务的名称
job.print(); // 调用print()方法开始打印
} catch (PrinterException ee) {
ee.printStackTrace();
}
}
});
button.setText("打印图形");
button.setBounds(28, 56, 86, 28);
getContentPane().add(button);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
button_1.setBounds(151, 56, 86, 28);
getContentPane().add(button_1);

//
}

实例097 打印图片
private JButton printButton;
private JButton previewButton;
private JPanel controlPanel;
private File imgFile = null;
private BufferedImage src;
private PrinterJob job;
private PageFormat pf;

public static void main(String[] args) {
JFrame frame = new JFrame("打印图片");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(360, 280);
PrintPicturePanel panel = new PrintPicturePanel();
frame.getContentPane().add(panel);
frame.setVisible(true);
}

public PrintPicturePanel() {
super();
setLayout(new BorderLayout());
setBackground(Color.WHITE);
add(getControlPanel(), BorderLayout.SOUTH);
pf = new PageFormat();// 创建PageFormat对象
pf.setOrientation(PageFormat.LANDSCAPE);// 设置打印方向
job = PrinterJob.getPrinterJob();// 获得打印对象
}

private void drawPage(Graphics2D g2) {
int imgW = 0;
int imgH = 0;
if (src != null) {
imgW = src.getWidth();
imgH = src.getHeight();
if (imgW > getWidth()) {
imgW = getWidth();
}
if (imgH > getHeight()) {
imgH = getHeight();
}
}
g2.drawImage(src, 0, 0, imgW, imgH, this);// 绘制图像
}

protected JButton getPreviewButton() {
if (previewButton == null) {
previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");// 创建过滤器
fileChooser.setFileFilter(filter);// 设置过滤器
int i = fileChooser.showOpenDialog(null);// 显示打开对话框
if (i == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中图片的File对象
}
if (imgFile != null) {
try {
src = ImageIO.read(imgFile);// 构造BufferedImage对象
} catch (IOException ex) {
ex.printStackTrace();
}
}
PrintPicturePanel.this.repaint();// 调用paintComponent()方法
}
});
previewButton.setText("选择图片");
}
return previewButton;
}

protected JButton getPrintButton() {
if (printButton == null) {
printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
job.setPrintable(PrintPicturePanel.this);// 为打印对象指定Printable对象
job.setJobName("打印图片");// 设置打印任务的名称
job.print();// 执行打印
} catch (PrinterException e1) {
e1.printStackTrace();
}
}
});
printButton.setText("打印");
}
return printButton;
}

protected JPanel getControlPanel() {
if (controlPanel == null) {
controlPanel = new JPanel();
controlPanel.setBorder(new LineBorder(Color.BLUE, 1, false));
final FlowLayout flowLayout = new FlowLayout();
flowLayout.setHgap(20);
controlPanel.setLayout(flowLayout);
controlPanel.add(getPreviewButton());
controlPanel.add(getPrintButton());
}
return controlPanel;
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
drawPage(g2);
}

public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;// 没有打印页
int x = (int) pageFormat.getImageableX();//获得可打印区域的x坐标
int y = (int) pageFormat.getImageableY();//获得可打印区域的y坐标
Graphics2D g2 = (Graphics2D) graphics;
int ableW = (int) pageFormat.getImageableWidth();//获得可打印区域的宽度
int ableH = (int) pageFormat.getImageableHeight();//获得可打印区域的高度
int imgW = 0;// 定义打印图片的宽度
int imgH = 0;// 定义打印图片的高度
if (src != null) {
imgW = src.getWidth();// 获得图片的宽度
imgH = src.getHeight();// 获得图片的高度
if (imgW > ableW) {// 图片宽度大于打印区域的宽度
imgW = ableW;// 图片宽度为打印区域的宽度
}
if (imgH > ableH) {// 图片高度大于打印区域的高度
imgH = ableH;// 图片高度为打印区域的高度
}
}
g2.drawImage(src, x, y, imgW, imgH, this);// 绘制打印内容
return Printable.PAGE_EXISTS;// 返回存在打印内容的信息
}

实例098 打印预览
private JTextField filePath;
private PageFormat pf;
private PreviewCanvas canvas;
private File imgFile = null;
private BufferedImage src;
private boolean isPreview = false; // 是否可以打印

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public MainFrame() {
super();
addComponentListener(new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {// 窗体大小改变时执行
// 打印预览
if (imgFile != null) {
isPreview = true; // 表示可以打印
canvas.repaint();// 调用paint()方法
}
}
});
getContentPane().setBackground(new Color(232, 162, 255));
setTitle("打印预览");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
pf.setOrientation(PageFormat.LANDSCAPE);
canvas = new PreviewCanvas();

this.setSize(new Dimension(840, 770));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel = new JPanel();
panel.setOpaque(false);
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打印预览
if (imgFile != null) {
isPreview = true; // 表示可以打印
canvas.repaint();// 调用paint()方法
} else {
JOptionPane.showMessageDialog(null, "请先选择要打印预览的图片!");
}
}
});
previewButton.setText("打印预览");
panel.add(previewButton);

final JButton printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});

printButton.setText("退 出");
panel.add(printButton);

final JPanel panel_1 = new JPanel();
panel_1.setOpaque(false);
panel_1.setLayout(null);
panel_1.setPreferredSize(new Dimension(0, 70));
getContentPane().add(panel_1, BorderLayout.NORTH);

final JLabel label = new JLabel();
label.setText("请选择要打印预览的图片:");
label.setBounds(30, 25, 156, 18);
panel_1.add(label);

filePath = new JTextField();
filePath.setPreferredSize(new Dimension(500, 24));
filePath.setBounds(195, 20, 466, 24);
panel_1.add(filePath);

final JButton selectButton = new JButton();
selectButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");// 创建过滤器
fileChooser.setFileFilter(filter);// 设置过滤器
int i = fileChooser.showOpenDialog(getContentPane());// 显示打开对话框
if (i == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中的图片对象
filePath.setText(imgFile.getAbsolutePath()); // 显示图片路径
}
}
});
selectButton.setText("选择文件");
selectButton.setBounds(676, 20, 86, 28);
panel_1.add(selectButton);
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS; // 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.translate(10, 10);// 平移绘图上下文
int x = (int) (pf.getImageableX() - 1);// 获得可打印区域的x坐标偏左,用于绘制虚线
int y = (int) (pf.getImageableY() - 1);// 获得可打印区域的y坐标偏上,用于绘制虚线
int width = (int) (pf.getImageableWidth() + 1);// 获得可打印区域的宽度偏右,用于绘制虚线
int height = (int) (pf.getImageableHeight() + 1);// 获得可打印区域的高度偏下,用于绘制虚线
int mw = (int) pf.getWidth();// 获得打印页的宽度
int mh = (int) pf.getHeight();// 获得打印页的高度
g2.drawRect(0, 0, mw, mh);// 绘制实线外框
g2.setColor(new Color(255, 253, 234)); // 设置前景色
g2.fillRect(1, 1, mw - 1, mh - 1);// 绘制填充区域
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));// 指定虚线模式
g2.setColor(Color.BLACK); // 设置前景色
g2.drawRect(x, y, width, height);// 绘制虚线内框
g2.setColor(Color.WHITE); // 设置前景色
g2.fillRect(x + 1, y + 1, width - 1, height - 1);// 绘制填充区域
MainFrame.this.print(g2, pf, 0);// 调用print()方法
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制打印内容
*
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX(); // 获取可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY(); // 获取可打印区域坐标的Y位置
Graphics2D g2 = (Graphics2D) graphics;
if (imgFile != null && isPreview) {
try {
src = ImageIO.read(imgFile);// 构造BufferedImage对象
} catch (IOException e) {
e.printStackTrace();
}
double imgWidth = src.getWidth(this);// 获得图像的宽度
double imgHeight = src.getHeight(this);// 获得图像的高度
int mw = (int) pf.getWidth() - x * 2;// 纸张宽度减去左右边缘
int mh = (int) pf.getHeight() - y * 2;// 纸张高度减去上下边缘
if (imgWidth > mw) { // 如果图像的宽度大于可打印区域
imgWidth = mw;
}
if (imgHeight > mh) { // 如果图像的高度大于可打印区域
imgHeight = mh;
}
g2.drawImage(src, x, y, (int) imgWidth, (int) imgHeight, this); // 绘制正常图像
}
isPreview = false; // 设置不可以打印
}

实例099 倒序打印
private JTextField filePath;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

private PageFormat pf;
private PreviewCanvas canvas;
private File imgFile = null;
private Image src;
private boolean isPreview = false; // 是否可以打印

/**
* Create the frame
*/
public MainFrame() {
super();
addComponentListener(new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {// 窗体大小改变时执行
// 打印预览
if (imgFile != null) {
isPreview = true; // 表示可以打印
canvas.repaint();// 调用paint()方法
}
}
});
setTitle("倒序打印");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
pf.setOrientation(PageFormat.LANDSCAPE);
canvas = new PreviewCanvas();

this.setSize(new Dimension(840, 750));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打印预览
if (imgFile != null) {
isPreview = true; // 表示可以打印
PrinterJob job = PrinterJob.getPrinterJob();// 获得打印对象
pf = job.pageDialog(pf);// 显示修改PageFormat实例的对话框
canvas.repaint();// 调用paint()方法
} else {
JOptionPane.showMessageDialog(null, "请先选择要打印的图片!");
}
}
});
previewButton.setText("打印预览");
panel.add(previewButton);

final JButton printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob对象的实例
if (!job.printDialog())// 打开打印对话框
return;// 单击打印对话框的取消按钮或关闭打印对话框结束程序的执行
// 设置打印内容
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
isPreview = true; // 设置可以打印
if (pageIndex < 1) {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}

});
job.setJobName("打印图形");
try {
job.print();// 调用print()方法,实现打印
} catch (PrinterException e1) {
e1.printStackTrace();
}

}
});

printButton.setText("开始打印");
panel.add(printButton);

final JPanel panel_1 = new JPanel();
getContentPane().add(panel_1, BorderLayout.NORTH);

final JLabel label = new JLabel();
label.setText("请选择要打印的图片:");
panel_1.add(label);

filePath = new JTextField();
filePath.setPreferredSize(new Dimension(300, 24));
panel_1.add(filePath);
// 选择文件按钮
final JButton selectButton = new JButton();
selectButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");// 创建过滤器
fileChooser.setFileFilter(filter);// 设置过滤器
int i = fileChooser.showOpenDialog(getContentPane());// 显示打开对话框
if (i == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中的图片对象
filePath.setText(imgFile.getAbsolutePath()); // 显示图片路径
}
}
});
selectButton.setText("选择文件");
panel_1.add(selectButton);

//
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS; // 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.translate(10, 10);// 平移绘图上下文
int x = (int) (pf.getImageableX() - 1);// 获得可打印区域的x坐标偏左,用于绘制虚线
int y = (int) (pf.getImageableY() - 1);// 获得可打印区域的y坐标偏上,用于绘制虚线
int width = (int) (pf.getImageableWidth() + 1);// 获得可打印区域的宽度偏右,用于绘制虚线
int height = (int) (pf.getImageableHeight() + 1);// 获得可打印区域的高度偏下,用于绘制虚线
int mw = (int) pf.getWidth();// 获得打印页的宽度
int mh = (int) pf.getHeight();// 获得打印页的高度
g2.drawRect(0, 0, mw, mh);// 绘制实线外框
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));// 指定虚线模式
g2.drawRect(x, y, width, height);// 绘制虚线内框
MainFrame.this.print(g2, pf, 0);// 调用print()方法
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制倒序的打印内容
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX(); // 获取可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY(); // 获取可打印区域坐标的Y位置
Graphics2D g2 = (Graphics2D) graphics;
if (imgFile != null && isPreview) {
try {
src = ImageIO.read(imgFile);// 构造BufferedImage对象
} catch (IOException e) {
e.printStackTrace();
}
double imgWidth = src.getWidth(this);// 获得图像的宽度
double imgHeight = src.getHeight(this);// 获得图像的高度
double imgWidthS = imgWidth;// 存储图像的宽度
double imgHeightS = imgHeight;// 存储图像的高度
int mw = (int) pf.getWidth();// 获得打印页的宽度
int mh = (int) pf.getHeight();// 获得打印页的高度
if (imgWidth > mw) { // 如果宽大于可打印区域
imgWidth = mw - x;// 设置新宽度值
}
if (imgHeight > mh) { // 如果高大于可打印区域
imgHeight = mh - y;// 设置新的高度值
}
g2.drawImage(src, x, y, (int) imgWidth, (int) imgHeight, x,
(int) imgHeightS, (int) imgWidthS, y, this);// 绘制倒序图像
}
isPreview = false; // 设置不可以打印
}

实例100 为打印内容添加水印
private JTextField filePath;
private PageFormat pf;
private PreviewCanvas canvas;
private File imgFile = null;
private BufferedImage src;
private boolean isPreview = false; // 是否可以打印
private String watermarkWord = "明日科技"; // 水印文字

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public MainFrame() {
super();
addComponentListener(new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {// 窗体大小改变时执行
// 打印预览
if (imgFile != null) {
isPreview = true; // 表示可以打印
canvas.repaint();// 调用paint()方法
}
}
});
getContentPane().setBackground(new Color(232, 162, 255));
setTitle("为打印内容添加水印");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
pf.setOrientation(PageFormat.LANDSCAPE);
canvas = new PreviewCanvas();

this.setSize(new Dimension(840, 770));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel = new JPanel();
panel.setOpaque(false);
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打印预览
if (imgFile != null) {
isPreview = true; // 表示可以打印
PrinterJob job = PrinterJob.getPrinterJob();// 获得打印对象
pf = job.pageDialog(pf);// 显示修改PageFormat实例的对话框
canvas.repaint();// 调用paint()方法
} else {
JOptionPane.showMessageDialog(null, "请先选择要打印的图片!");
}
}
});
previewButton.setText("打印预览");
panel.add(previewButton);

final JButton printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob对象的实例
if (!job.printDialog())// 打开打印对话框
return;
// 设置打印内容
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
isPreview = true; // 设置可以打印
if (pageIndex < 1) {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}

});
job.setJobName("打印图形");
try {
job.print();// 调用print()方法,实现打印
} catch (PrinterException e1) {
e1.printStackTrace();
}

}
});

printButton.setText("开始打印");
panel.add(printButton);

final JPanel panel_1 = new JPanel();
panel_1.setOpaque(false);
panel_1.setLayout(null);
panel_1.setPreferredSize(new Dimension(0, 70));
getContentPane().add(panel_1, BorderLayout.NORTH);

final JLabel label = new JLabel();
label.setText("请选择要打印的图片:");
label.setBounds(30, 25, 130, 18);
panel_1.add(label);

filePath = new JTextField();
filePath.setPreferredSize(new Dimension(500, 24));
filePath.setBounds(161, 20, 500, 24);
panel_1.add(filePath);

final JButton selectButton = new JButton();
selectButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");// 创建过滤器
fileChooser.setFileFilter(filter);// 设置过滤器
int i = fileChooser.showOpenDialog(getContentPane());// 显示打开对话框
if (i == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中的图片对象
filePath.setText(imgFile.getAbsolutePath()); // 显示图片路径
}
}
});
selectButton.setText("选择文件");
selectButton.setBounds(676, 20, 86, 28);
panel_1.add(selectButton);
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS; // 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.translate(10, 10);// 平移绘图上下文
int x = (int) (pf.getImageableX() - 1);// 获得可打印区域的x坐标偏左,用于绘制虚线
int y = (int) (pf.getImageableY() - 1);// 获得可打印区域的y坐标偏上,用于绘制虚线
int width = (int) (pf.getImageableWidth() + 1);// 获得可打印区域的宽度偏右,用于绘制虚线
int height = (int) (pf.getImageableHeight() + 1);// 获得可打印区域的高度偏下,用于绘制虚线
int mw = (int) pf.getWidth();// 获得打印页的宽度
int mh = (int) pf.getHeight();// 获得打印页的高度
g2.drawRect(0, 0, mw, mh);// 绘制实线外框
g2.setColor(new Color(255, 253, 234)); // 设置前景色
g2.fillRect(1, 1, mw - 1, mh - 1);// 绘制填充区域
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));// 指定虚线模式
g2.setColor(Color.BLACK); // 设置前景色
g2.drawRect(x, y, width, height);// 绘制虚线内框
g2.setColor(Color.WHITE); // 设置前景色
g2.fillRect(x + 1, y + 1, width - 1, height - 1);// 绘制填充区域
MainFrame.this.print(g, pf, 0);// 调用print()方法
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制打印内容
*
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX(); // 获取可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY(); // 获取可打印区域坐标的Y位置
Graphics2D g2 = (Graphics2D) graphics;
if (imgFile != null && isPreview) {
try {
src = ImageIO.read(imgFile);// 构造BufferedImage对象
} catch (IOException e) {
e.printStackTrace();
}
double imgWidth = src.getWidth(this);// 获得图像的宽度
double imgHeight = src.getHeight(this);// 获得图像的高度
int wordSize = (int) imgWidth / 10;
int mw = (int) pf.getWidth() - x * 2;
int mh = (int) pf.getHeight() - y * 2;
if (imgWidth > mw) { // 如果宽大于可打印区域
imgWidth = mw;
}
if (imgHeight > mh) { // 如果高大于可打印区域
imgHeight = mh;
}
/*********************** 添加水印文字 ****************************/
Graphics2D g = src.createGraphics(); // 获取图片绘图上下文
Font font = new Font("黑体", Font.BOLD, wordSize); // 创建字体对象
g.setFont(font); // 设置绘图字体
g.setPaint(Color.RED); // 设置绘图颜色
// 获取文字占用的像素区域
Rectangle2D rec = font.getStringBounds(watermarkWord, g
.getFontRenderContext());
double pw = rec.getWidth(); // 获取水印文字占用的像素宽度
double ph = rec.getHeight(); // 获取水印文字占用的像素高度
g.rotate(Math.toRadians(30), wordSize + pw / 2, wordSize + ph / 2); // 转换角度
g.setComposite(AlphaComposite.SrcOver.derive(0.4f));// 设置水印透明合成规则
g.drawString(watermarkWord, wordSize * 2 + (int) pw / 2, wordSize
* 2 + (int) ph / 2); // 绘制文字水印
/***************************************************************/
g2.drawImage(src, x, y, (int) imgWidth, (int) imgHeight, this); // 绘制图像
}
isPreview = false; // 设置不可以打印
}

实例101 自动为打印内容添加水印
private JTextField watermarkText;
private JTextField filePath;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

private PageFormat pf;
private PreviewCanvas canvas;
private File imgFile = null;
private BufferedImage src;
private boolean isPreview = false; // 是否可以打印
private String watermarkWord = "明日科技"; // 水印文字

/**
* Create the frame
*/
public MainFrame() {
super();
addComponentListener(new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {// 窗体大小改变时执行
// 打印预览
if (imgFile != null) {
isPreview = true; // 表示可以打印
canvas.repaint();// 调用paint()方法
}
}
});
getContentPane().setBackground(new Color(232, 162, 255));
setTitle("自动为打印内容添加水印");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
pf.setOrientation(PageFormat.LANDSCAPE);
canvas = new PreviewCanvas();

this.setSize(new Dimension(840, 770));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel = new JPanel();
panel.setOpaque(false);
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打印预览
if (imgFile != null) {
isPreview = true; // 表示可以打印
watermarkWord = watermarkText.getText(); // 获取输入的水印文字
PrinterJob job = PrinterJob.getPrinterJob();// 获得打印对象
pf = job.pageDialog(pf);// 显示修改PageFormat实例的对话框
canvas.repaint();// 调用paint()方法
} else {
JOptionPane.showMessageDialog(null, "请先选择要打印的图片!");
}
}
});
previewButton.setText("打印预览");
panel.add(previewButton);

final JButton printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob对象的实例
if (!job.printDialog())// 打开打印对话框
return;
// 设置打印内容
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
isPreview = true; // 设置可以打印
if (pageIndex < 1) {
watermarkWord = watermarkText.getText(); // 获取输入的文印文字
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}

});
job.setJobName("打印图形");
try {
job.print();// 调用print()方法,实现打印
} catch (PrinterException e1) {
e1.printStackTrace();
}

}
});

printButton.setText("开始打印");
panel.add(printButton);

final JPanel panel_1 = new JPanel();
panel_1.setOpaque(false);
panel_1.setLayout(null);
panel_1.setPreferredSize(new Dimension(0, 70));
getContentPane().add(panel_1, BorderLayout.NORTH);

final JLabel label = new JLabel();
label.setText("请选择要打印的图片:");
label.setBounds(34, 15, 130, 18);
panel_1.add(label);

filePath = new JTextField();
filePath.setPreferredSize(new Dimension(500, 24));
filePath.setBounds(165, 10, 500, 24);
panel_1.add(filePath);

final JButton selectButton = new JButton();
selectButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");// 创建过滤器
fileChooser.setFileFilter(filter);// 设置过滤器
int i = fileChooser.showOpenDialog(getContentPane());// 显示打开对话框
if (i == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中的图片对象
filePath.setText(imgFile.getAbsolutePath()); // 显示图片路径
}
}
});
selectButton.setText("选择文件");
selectButton.setBounds(680, 10, 86, 28);
panel_1.add(selectButton);

final JLabel label_1 = new JLabel();
label_1.setText("请输入水印文字:");
label_1.setBounds(60, 40, 104, 18);
panel_1.add(label_1);

watermarkText = new JTextField();
watermarkText.setPreferredSize(new Dimension(500, 24));
watermarkText.setBounds(165, 40, 500, 24);
panel_1.add(watermarkText);
// 选择文件按钮

//
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
// TODO Auto-generated method stub

printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容

return Printable.PAGE_EXISTS; // 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.translate(10, 10);// 平移绘图上下文
int x = (int) (pf.getImageableX() - 1);// 获得可打印区域的x坐标偏左,用于绘制虚线
int y = (int) (pf.getImageableY() - 1);// 获得可打印区域的y坐标偏上,用于绘制虚线
int width = (int) (pf.getImageableWidth() + 1);// 获得可打印区域的宽度偏右,用于绘制虚线
int height = (int) (pf.getImageableHeight() + 1);// 获得可打印区域的高度偏下,用于绘制虚线
int mw = (int) pf.getWidth();// 获得打印页的宽度
int mh = (int) pf.getHeight();// 获得打印页的高度
g2.drawRect(0, 0, mw, mh);// 绘制实线外框
g2.setColor(new Color(255, 253, 234)); // 设置前景色
g2.fillRect(1, 1, mw - 1, mh - 1);// 绘制填充区域
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));// 指定虚线模式
g2.setColor(Color.BLACK); // 设置前景色
g2.drawRect(x, y, width, height);// 绘制虚线内框
g2.setColor(Color.WHITE); // 设置前景色
g2.fillRect(x + 1, y + 1, width - 1, height - 1);// 绘制填充区域
MainFrame.this.print(g, pf, 0);// 调用print()方法
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制打印内容
*
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX(); // 获取可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY(); // 获取可打印区域坐标的Y位置
Graphics2D g2 = (Graphics2D) graphics;
if (imgFile != null && isPreview) {
try {
src = ImageIO.read(imgFile);// 构造BufferedImage对象
} catch (IOException e) {
e.printStackTrace();
}
double imgWidth = src.getWidth(this);// 获得图像的宽度
double imgHeight = src.getHeight(this);// 获得图像的高度
int wordSize = (int) imgWidth / 10;
int mw = (int) pf.getWidth() - x * 2;
int mh = (int) pf.getHeight() - y * 2;
if (imgWidth > mw) { // 如果宽大于可打印区域
imgWidth = mw;
}
if (imgHeight > mh) { // 如果高大于可打印区域
imgHeight = mh;
}
/*********************** 添加水印文字 ****************************/
Graphics2D g = src.createGraphics(); // 获取图片绘图上下文
Font font = new Font("黑体", Font.BOLD, wordSize); // 创建字体对象
g.setFont(font); // 设置绘图字体
g.setPaint(Color.RED); // 设置绘图颜色
// 获取文字占用的像素区域
Rectangle2D rec = font.getStringBounds(watermarkWord, g
.getFontRenderContext());
double pw = rec.getWidth(); // 获取水印文字占用的像素宽度
double ph = rec.getHeight(); // 获取水印文字占用的像素高度
g.rotate(Math.toRadians(30), wordSize + pw / 2, wordSize + ph / 2); // 转换角度
g.setComposite(AlphaComposite.SrcOver.derive(0.4f));// 设置水印透明合成规则
g.drawString(watermarkWord, wordSize * 2, wordSize * 2 + (int) ph); // 绘制文字水印
/***************************************************************/
g2.drawImage(src, x, y, (int) imgWidth, (int) imgHeight, this); // 绘制图像
}
isPreview = false; // 设置不可以打印
}

5.2 打印的应用
实例102 打印快递单
BackgroundPanel.java
private static final long serialVersionUID = 1L;
private Image image; // 定义图像对象
public BackgroundPanel(Image image) {
super(); // 调用超类的构造方法
this.image = image; // 为图像对象赋值
initialize();
}
/*
* 重写paintComponent方法
*/
protected void paintComponent(Graphics g) {
super.paintComponent(g); // 调用父类的方法
Graphics2D g2 = (Graphics2D) g; // 创建Graphics2D对象
if (image != null) {
int width = getWidth(); // 获得面板的宽度
int height = getHeight(); // 获得面板的高度
// 绘制图像
g2.drawImage(image, 0, 0, width, height, this);
}
}
private void initialize() {
this.setSize(300, 200);
}

ExpressPrintFrame.java
private URL url = null;// 声明图片的URL
private Image image = null;// 声明图像对象
private BackgroundPanel backPanel = null;// 声明自定义背景面板对象
private Robot robot = null; // 声明Robot对象
private BufferedImage buffImage = null; // 声明缓冲图像对象
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ExpressPrintFrame frame = new ExpressPrintFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public ExpressPrintFrame() {
super();
setTitle("打印快递单");
setBounds(0, 0, 900, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
url = ExpressPrintFrame.class.getResource("/image/express.jpg"); // 获得图片的URL
image = new ImageIcon(url).getImage(); // 创建图像对象
backPanel = new BackgroundPanel(image);
backPanel.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {// 单击鼠标右键
int x = e.getX();// 获得鼠标位置的X坐标
int y = e.getY();// 获得鼠标位置的Y坐标
TargetTextField tf = new TargetTextField();// 创建自定义文本框的实例
tf.addMouseListener(tf);// 添加鼠标监听器
tf.addMouseMotionListener(tf);// 添加鼠标监听器
tf.addActionListener(tf);// 添加动作监听器
tf.setBounds(x, y, 147, 22);// 指定文本框的位置和大小
backPanel.add(tf);// 添加到背景面板上
tf.requestFocus();// 使文本框获得焦点
}
}
});
backPanel.setLayout(null);
getContentPane().add(backPanel);
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
final PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
if (!job.printDialog()) // 打开打印对话框
return;// 单击打印对话框的取消按钮或关闭打印对话框结束程序的执行
job.setPrintable(new Printable() {
// 实现print()方法,绘制打印内容
public int print(Graphics graphics,
PageFormat pf, int pageIndex)
throws PrinterException {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D) graphics; // 获得图形上下文对象
int x = (int)(ExpressPrintFrame.this.getBounds().getX())+8;// 背景面板在屏幕上的X坐标
int y = (int)(ExpressPrintFrame.this.getBounds().getY())+30;// 背景面板在屏幕上的Y坐标
int w = (int)backPanel.getBounds().getWidth();// 背景面板的宽度
int h = (int)backPanel.getBounds().getHeight();// 背景面板的高度
Rectangle rect = new Rectangle(x, y, w, h);// 创建Rectangle对象
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
int imgWidth = buffImage.getWidth();// 图像的宽度
int imgHeight = buffImage.getHeight();// 图像的高度
float wh = imgWidth / imgHeight;// 图像宽高比
int printX = (int) pf.getImageableX();// 获得可打印区域的x坐标
int printY = (int) pf.getImageableY();// 获得可打印区域的y坐标
int width = (int) pf.getImageableWidth();// 获得可打印区域的宽度
int height = (int) pf.getImageableHeight();// 获得可打印区域的高度
if (imgWidth > width) { // 如果宽大于可打印区域
imgWidth = width;
imgHeight = (int)(imgHeight * wh);
}
if (imgHeight > height) { // 如果高大于可打印区域
imgHeight = height;
imgWidth = (int)(imgWidth * wh);
}
g2.drawImage(buffImage, printX, printY, imgWidth, imgHeight, ExpressPrintFrame.this);// 将缓冲图像绘制到打印页
return Printable.PAGE_EXISTS;
}
});
job.setJobName("打印快递单"); // 设置打印任务的名称
job.print(); // 调用print()方法开始打印
} catch (PrinterException ee) {
ee.printStackTrace();
}
}
});
button.setText("打印快递单");
panel.add(button);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
panel.add(button_1);
}

TargetTextField.java
private int mousePressX = 0;// 鼠标按下点的x坐标
private int mousePressY = 0;// 鼠标按下点的y坐标
final Border border = getBorder();// 获得文本框的边框
public TargetTextField() {
super();
setBorder(border);
}

@Override
public void mouseClicked(MouseEvent e) {
setBorder(border);
}

@Override
public void mouseEntered(MouseEvent e) {
}

@Override
public void mouseExited(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
mousePressX = e.getX();// 鼠标按下点的x坐标
mousePressY = e.getY();// 鼠标按下点的y坐标
}

@Override
public void mouseReleased(MouseEvent e) {
Cursor cursorD = new Cursor(Cursor.DEFAULT_CURSOR);// 默认的光标类型
setCursor(cursorD);
}

@Override
public void mouseDragged(MouseEvent e) {
JTextField textField = (JTextField) e.getSource();
int textW = textField.getWidth();
int textH = textField.getHeight();
Rectangle rect = textField.getBounds();
if (getCursor().getType()==Cursor.W_RESIZE_CURSOR){// 调整窗口左边框的大小和位置
textField.setBounds((int)rect.getX() + e.getX(),(int)rect.getY(),textW - e.getX(),textH);
textField.requestFocus();
} else if (getCursor().getType()==Cursor.E_RESIZE_CURSOR){// 调整窗口右边框的大小和位置
textField.setBounds((int)rect.getX(),(int)rect.getY(),e.getX(),textH);
textField.requestFocus();
} else if (getCursor().getType()==Cursor.N_RESIZE_CURSOR){// 调整窗口上边框的大小和位置
textField.setBounds((int)rect.getX(),(int)rect.getY()+e.getY(),textW,textH - e.getY());
textField.requestFocus();
} else if (getCursor().getType()==Cursor.S_RESIZE_CURSOR){// 调整窗口下边框的大小和位置
textField.setBounds((int)rect.getX(),(int)rect.getY(),textW,e.getY());
textField.requestFocus();
} else {// 移动文本框的位置
textField.setBounds((int)rect.getX() + e.getX()-mousePressX,(int)rect.getY()+e.getY()-mousePressY,textW,textH);
textField.requestFocus();
}

}

@Override
public void mouseMoved(MouseEvent e) {

Cursor cursorW = new Cursor(Cursor.W_RESIZE_CURSOR);// 调整窗口左边框大小的光标类型
Cursor cursorN = new Cursor(Cursor.N_RESIZE_CURSOR);// 调整窗口上边框大小的光标类型
Cursor cursorE = new Cursor(Cursor.E_RESIZE_CURSOR);// 调整窗口右边框大小的光标类型
Cursor cursorS = new Cursor(Cursor.S_RESIZE_CURSOR);// 调整窗口下边框大小的光标类型
Cursor cursorD = new Cursor(Cursor.DEFAULT_CURSOR);// 默认光标类型
JTextField textField = (JTextField) e.getSource();
int textW = textField.getWidth();
int textH = textField.getHeight();
if (e.getX() == 0){
setCursor(cursorW);// 设置左边框光标
}else if (e.getY() == 0){
setCursor(cursorN);// 设置上边框光标
}else if (e.getX() == textW-3){
setCursor(cursorE);// 设置右边框光标
}else if (e.getY() == textH-3){
setCursor(cursorS);// 设置下边框光标
}else{
setCursor(cursorD);// 设置默认光标
}
}

@Override
public void actionPerformed(ActionEvent e) {
setBorder(null);
}

实例103 打印报表
QueryResultSet.java
static {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* 获得查询结果集
*/
public static ResultSet gainRecord() {
Connection conn = null; // 声明连接
Statement st = null; // 声明Statement对象
ResultSet rs = null; // 声明结果集对象
try {
String url = "jdbc:jtds:sqlserver://localhost:1433/db_database"; // 数据库db_database的URL
String username = "sa"; // 数据库的用户名
String password = ""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st = conn.createStatement(); // 创建Statement对象
String sql = "select * from tb_employee"; // 定义SQL查询语句
rs = st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}

MainFrame.java
private PageFormat pf;
private PreviewCanvas canvas;
private boolean isPreview = false; // 是否可以打印
private boolean previewFlag = false; // 是否已经进行预览

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public MainFrame() {
super();
addWindowListener(new WindowAdapter() {
public void windowActivated(final WindowEvent e) {
if (previewFlag) {
isPreview = true;// 设置为可以打印
canvas.repaint();// 调用paint()方法
}
}
});
addComponentListener(new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {// 窗体大小改变时执行
if (previewFlag) {
isPreview = true;// 设置为可以打印
canvas.repaint();// 调用paint()方法
}
}
});
getContentPane().setBackground(new Color(232, 162, 255));
setTitle("打印报表");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
pf.setOrientation(PageFormat.LANDSCAPE);
canvas = new PreviewCanvas();

this.setSize(new Dimension(830, 704));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel = new JPanel();
panel.setOpaque(false);
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打印预览
if (QueryResultSet.gainRecord() != null) {
isPreview = true;// 表示可以打印
previewFlag = true;// 设置为已经打印预览
PrinterJob job = PrinterJob.getPrinterJob();// 获得打印对象
pf = job.pageDialog(pf);// 显示修改PageFormat实例的对话框
canvas.repaint();// 调用paint()方法
}
}
});
previewButton.setText("预览报表");
panel.add(previewButton);

final JButton printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!previewFlag){
return;
}
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob对象的实例
if (!job.printDialog())// 打开打印对话框
return;
// 设置打印内容
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
isPreview = true; // 设置可以打印
if (pageIndex < 1) {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}

});
job.setJobName("打印报表");
try {
job.print();// 调用print()方法,实现打印
} catch (PrinterException e1) {
e1.printStackTrace();
}

}
});

printButton.setText("打印报表");
panel.add(printButton);
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
printPicture(graphics, pageFormat, pageIndex);// 绘制打印内容
return Printable.PAGE_EXISTS;// 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.translate(10, 10);// 平移绘图上下文
int x = (int) (pf.getImageableX() - 1);// 获得可打印区域的x坐标偏左,用于绘制虚线
int y = (int) (pf.getImageableY() - 1);// 获得可打印区域的y坐标偏上,用于绘制虚线
int width = (int) (pf.getImageableWidth() + 1);// 获得可打印区域的宽度偏右,用于绘制虚线
int height = (int) (pf.getImageableHeight() + 1);// 获得可打印区域的高度偏下,用于绘制虚线
int mw = (int) pf.getWidth();// 获得打印页的宽度
int mh = (int) pf.getHeight();// 获得打印页的高度
g2.drawRect(0, 0, mw, mh);// 绘制实线外框
g2.setColor(new Color(255, 253, 234));// 设置前景色
g2.fillRect(1, 1, mw - 1, mh - 1);// 绘制填充区域
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));// 指定虚线模式
g2.setColor(Color.BLACK);// 设置前景色
g2.drawRect(x, y, width, height);// 绘制虚线内框
g2.setColor(Color.WHITE);// 设置前景色
g2.fillRect(x + 1, y + 1, width - 1, height - 1);// 绘制填充区域
MainFrame.this.print(g, pf, 0);// 调用print()方法
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制打印内容
*
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX();// 获得可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY();// 获得可打印区域坐标的Y位置
int w = (int) pageFormat.getImageableWidth();// 获得可打印区域的宽度
Graphics2D g2 = (Graphics2D) graphics;// 转换为Graphics2D对象
ResultSet rs = QueryResultSet.gainRecord();// 获得查询结果集
if (rs != null && isPreview) {
g2.setColor(Color.BLUE);// 设置为蓝色
g2.setFont(new Font("华文行楷",Font.BOLD,60));// 设置字体
g2.drawString("员工基本信息报表", x + 40, y + 70);// 绘制报表标题
g2.setColor(Color.BLACK);// 设置为黑色
g2.setFont(new Font("宋体",Font.PLAIN,12));// 设置字体
g2.setStroke(new BasicStroke(1f));// 指定实线模式
try {
y = y + 80;// 调整打印位置的y值
int y1 = y;// 保存调整后打印位置的y值
while (rs.next()) {
y = y + 30;// 调整打印位置的y值
g2.drawLine(x + 20, y - 20, x + w - 20, y - 20);// 绘制水平直线
g2.drawString(String.valueOf(rs.getInt(1)), x + 30, y);// 绘制报表内容
g2.drawString(rs.getString(2), x + 60, y);// 绘制报表内容
g2.drawString(rs.getString(3), x + 120, y);// 绘制报表内容
g2.drawString(String.valueOf(rs.getInt(4)), x + 170, y);// 绘制报表内容
g2.drawString(rs.getString(5), x + 220, y);// 绘制报表内容
g2.drawString(rs.getString(6), x + 420, y);// 绘制报表内容
g2.drawString(rs.getString(7), x + 480, y);// 绘制报表内容
}
g2.drawLine(x + 20, y1 + 10, x + 20, y + 10);// 绘制垂直直线
g2.drawLine(x + 50, y1 + 10, x + 50, y + 10);// 绘制垂直直线
g2.drawLine(x + 110, y1 + 10, x + 110, y + 10);// 绘制垂直直线
g2.drawLine(x + 160, y1 + 10, x + 160, y + 10);// 绘制垂直直线
g2.drawLine(x + 210, y1 + 10, x + 210, y + 10);// 绘制垂直直线
g2.drawLine(x + 410, y1 + 10, x + 410, y + 10);// 绘制垂直直线
g2.drawLine(x + 470, y1 + 10, x + 470, y + 10);// 绘制垂直直线
g2.drawLine(x + w - 20, y1 + 10, x + w - 20, y + 10);// 绘制垂直直线
g2.drawLine(x + 20, y + 30 - 20, x + w - 20, y + 30 - 20);// 绘制水平直线
rs.close();// 关闭结果集
} catch (Exception ex) {
ex.printStackTrace();
}
}
isPreview = true; // 设置不可以打印
previewFlag = true;
}

实例104 打印桌面图片
PrintDesktop.java
private PrinterJob job;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintDesktop frame = new PrintDesktop();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public PrintDesktop() {
super();
setTitle("打印桌面图片");
job = PrinterJob.getPrinterJob();

setBounds(100, 100, 800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBorder(new BevelBorder(BevelBorder.LOWERED));
getContentPane().add(scrollPane);

final JPanel panel_1 = new JPanel();
final FlowLayout flowLayout = new FlowLayout();
flowLayout.setVgap(30);
flowLayout.setHgap(30);
panel_1.setLayout(flowLayout);
scrollPane.setViewportView(panel_1);

final PrintPanel printPanel = new PrintPanel();
printPanel.setBorder(new LineBorder(Color.ORANGE, 2, false));
printPanel.setName("printPanel");
panel_1.add(printPanel);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton getDesktopBtn = new JButton();
getDesktopBtn.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
Robot robot = new Robot();// 创建Robot类的实例对象
Dimension size = getToolkit().getScreenSize();// 获取屏幕大小
Rectangle screenRect = new Rectangle(0, 0, size.width,
size.height);// 创建屏幕大小的矩形对象
setVisible(false);// 隐藏窗体
Thread.sleep(1000);// 休眠1秒钟
BufferedImage image = robot.createScreenCapture(screenRect);// 抓起屏幕图像
setVisible(true);// 显示窗体
printPanel.setImage(image);// 为打印面板设置图像
printPanel.repaint();// 重新绘制打印面板
} catch (AWTException e1) {
e1.printStackTrace();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
});
getDesktopBtn.setText("获取桌面");
panel.add(getDesktopBtn);

final JButton pageSetBtn = new JButton();
pageSetBtn.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (job != null) {// 如果打印对象不为NULL
printPanel.pageSet(job);// 调用打印面板的页面设置方法
}
}
});
pageSetBtn.setText("页面设置");
panel.add(pageSetBtn);

final JButton printBtn = new JButton();
printBtn.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
boolean print = job.printDialog();// 显示打印对话框
if (print) {// 如果用户确认打印
try {
job.setJobName("打印桌面图片");// 设置打印任务名称
job.setPrintable(printPanel);// 设置打印页面为打印面板
job.print();// 开始打印任务
} catch (PrinterException e1) {
e1.printStackTrace();
}
}
}
});
printBtn.setText("打印");
panel.add(printBtn);
//
}

PrintPanel.java
private Image image;
private PageFormat pageFormat;
private int px;
private int py;
private int pwidth;
private int pheight;

/**
* 构造方法
*/
public PrintPanel() {
super();
setLayout(null);
pageFormat = new PageFormat();// 创建页面格式对象
pageFormat.setOrientation(PageFormat.LANDSCAPE);// 设置横向页面
}

public void setImage(Image image) {
this.image = image;
}

@Override
protected void paintComponent(Graphics g1) {
Graphics2D g = (Graphics2D) g1;
super.paintComponent(g);
try {
print(g, pageFormat, 0);// 调用打印方法绘制面板界面
} catch (PrinterException e) {
e.printStackTrace();
}
}

@Override
public int print(Graphics g1, PageFormat pageFormat, int pageIndex)
throws PrinterException {
Graphics2D g = (Graphics2D) g1;
px = (int) pageFormat.getImageableX();// 获取可打印区域的x坐标
py = (int) pageFormat.getImageableY();// 获取可打印区域的y坐标
pwidth = (int) pageFormat.getImageableWidth();// 获取可打印的宽度
pheight = (int) pageFormat.getImageableHeight();// 获取可打印的高度
int pageWidth = (int) pageFormat.getWidth();// 获取打印页面宽度
int pageHeight = (int) pageFormat.getHeight();// 获取打印页面高度
Dimension preferredSize = new Dimension(pageWidth, pageHeight);
setPreferredSize(preferredSize);// 设置面板大小
getParent().doLayout();// 重写布局父容器
g.setColor(Color.WHITE);// 设置前景色为白色
g.fill3DRect(0, 0, pageWidth, pageHeight, true);// 绘制与打印页面相同大小的矩形
if (pageIndex < 1) {// 如果当前打印页数小于1
g.drawImage(image, px, py, pwidth, pheight, this);// 绘制打印内容
return Printable.PAGE_EXISTS;// 返回可打印标识
} else// 否则
return Printable.NO_SUCH_PAGE;// 返回不支持打印标识
}

public void pageSet(PrinterJob job) {
pageFormat = job.pageDialog(pageFormat);
repaint();
}

实例105 打印柱形图表
PrintHistogramFrame.java
PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
ChartPanel chartPanel = null;
private Robot robot = null; // 声明Robot对象
private BufferedImage buffImage = null; // 声明缓冲图像对象

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintHistogramFrame frame = new PrintHistogramFrame();
RefineryUtilities.centerFrameOnScreen(frame);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public PrintHistogramFrame() {
super();
setTitle("打印柱形图表");
setBounds(0, 0, 500, 360);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

CategoryDataset dataset = createDataset();
JFreeChart chart = createChart(dataset);
chartPanel = new ChartPanel(chart);
chartPanel.setFillZoomRectangle(true);
chartPanel.setMouseWheelEnabled(true);
getContentPane().add(chartPanel);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
final JButton button = new JButton();
panel.add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
final PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
if (!job.printDialog()) // 打开打印对话框
return;// 单击打印对话框的取消按钮或关闭打印对话框结束程序的执行
job.setPrintable(new Printable() {
// 实现print()方法,绘制打印内容
public int print(Graphics graphics, PageFormat pf,
int pageIndex) throws PrinterException {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D) graphics; // 获得图形上下文对象
int x = (int) (PrintHistogramFrame.this.getBounds()
.getX()) + 8;// 背景面板在屏幕上的X坐标
int y = (int) (PrintHistogramFrame.this.getBounds()
.getY()) + 30;// 背景面板在屏幕上的Y坐标
int w = (int) chartPanel.getBounds().getWidth();// 图表的宽度
int h = (int) chartPanel.getBounds().getHeight();// 图表的高度
Rectangle rect = new Rectangle(x, y, w, h);// 创建Rectangle对象
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
int imgWidth = buffImage.getWidth();// 图像的宽度
int imgHeight = buffImage.getHeight();// 图像的高度
float wh = imgWidth / imgHeight;// 图像宽高比
int printX = (int) pf.getImageableX();// 获得可打印区域的x坐标
int printY = (int) pf.getImageableY();// 获得可打印区域的y坐标
int width = (int) pf.getImageableWidth();// 获得可打印区域的宽度
int height = (int) pf.getImageableHeight();// 获得可打印区域的高度
if (imgWidth > width) { // 如果宽大于可打印区域
imgWidth = width;
imgHeight = (int) (imgHeight * wh);
}
if (imgHeight > height) { // 如果高大于可打印区域
imgHeight = height;
imgWidth = (int) (imgWidth * wh);
}
g2.drawImage(buffImage, printX, printY, imgWidth,
imgHeight, PrintHistogramFrame.this);
return Printable.PAGE_EXISTS;
}
});
job.setJobName("打印柱形图表"); // 设置打印任务的名称
job.print(); // 调用print()方法开始打印
} catch (PrinterException ee) {
ee.printStackTrace();
}
}
});
button.setText("打 印");
button.setBounds(28, 56, 86, 28);

final JButton button_1 = new JButton();
panel.add(button_1);
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
button_1.setBounds(151, 56, 86, 28);

//
}

private static CategoryDataset createDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();// 创建数据集对象
ResultSet rs = QueryResultSet.gainRecord();// 获得查询结果集
try {
while (rs.next()) {
int value = rs.getInt(1);// 获得年龄
String sex = rs.getString(2);// 获得性别
String address = rs.getString(3);// 获得地址
dataset.addValue(value, sex, address);// 在数据集中添加数据信息
}
} catch (SQLException e) {
e.printStackTrace();
}
return dataset;// 返回数据集对象
}

private static JFreeChart createChart(CategoryDataset dataset) {
JFreeChart chart = ChartFactory.createBarChart("\n\n统计来自各城市男女员工的平均年龄", // 图表的标题文本
"所在城市 ", // x轴上的标签文字
"平均年龄", // y轴上的标签文字
dataset, // 数据集
PlotOrientation.VERTICAL, // 垂直方向
true, // 显示图例
true, // 显示说明文字
false // 不生成链接
);
chart.setBackgroundPaint(Color.white);// 设置背景颜色
CategoryPlot plot = (CategoryPlot) chart.getPlot();// 获得图表的CategoryPlot对象
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();// 获得y轴的实例
rangeAxis.setTickLabelFont(new Font("Sans-serif", Font.PLAIN, 12));// 设置y轴显示值的字体
rangeAxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));// 设置y轴上标签文字的字体
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());// 设置y轴显示标准的整数单元
BarRenderer renderer = (BarRenderer) plot.getRenderer();// 获得柱形的描述对象
GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue, 0.0f,
0.0f, new Color(0, 0, 64));// 创建渐变色对象
GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f,
0.0f, new Color(0, 64, 0));// 创建渐变色对象
renderer.setSeriesPaint(0, gp0);// 指定柱的颜色
renderer.setSeriesPaint(1, gp1);// 指定柱的颜色
CategoryAxis domainAxis = plot.getDomainAxis();// 获得x轴的实例
domainAxis.setTickLabelFont(new Font("Sans-serif", Font.PLAIN, 12));// 设置x轴显示信息的字体
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));// 设置x轴上标签文字的字体
domainAxis.setCategoryLabelPositions(CategoryLabelPositions
.createUpRotationLabelPositions(Math.PI / 6.0));// 指定x轴上显示信息的位置
TextTitle textTitle = chart.getTitle();// 获得标题对象
textTitle.setFont(new Font("黑体", Font.PLAIN, 20));// 设置标题的字体
chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));// 设置图例文本的字体
chart.getLegend().setHorizontalAlignment(HorizontalAlignment.CENTER);// 设置图例的对齐方式
return chart;
}

QueryResultSet.java
static {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获得查询结果集
*/
public static ResultSet gainRecord(){
Connection conn=null; // 声明连接
Statement st=null; // 声明Statement对象
ResultSet rs=null; // 声明结果集对象
try {
String url="jdbc:jtds:sqlserver://192.168.1.122:1433/db_database"; // 数据库db_database的URL
String username="sa"; // 数据库的用户名
String password=""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st=conn.createStatement(); // 创建Statement对象
String sql="select avg(age) as avgAge,sex,address from tb_employee group by address,sex"; // 定义SQL查询语句
rs=st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}

实例106 打印饼形图表
PrintPieChartFrame.java
PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
ChartPanel chartPanel = null;
private Robot robot = null; // 声明Robot对象
private BufferedImage buffImage = null; // 声明缓冲图像对象

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintPieChartFrame frame = new PrintPieChartFrame();
RefineryUtilities.centerFrameOnScreen(frame);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public PrintPieChartFrame() {
super();
setTitle("打印饼形图表");
setBounds(0, 0, 500, 360);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

PieDataset dataset = createDataset();
JFreeChart chart = createChart(dataset);
chartPanel = new ChartPanel(chart);
chartPanel.setFillZoomRectangle(true);
chartPanel.setMouseWheelEnabled(true);
getContentPane().add(chartPanel);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
final JButton button = new JButton();
panel.add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
final PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
if (!job.printDialog()) // 打开打印对话框
return;// 单击打印对话框的取消按钮或关闭打印对话框结束程序的执行
job.setPrintable(new Printable() {
// 实现print()方法,绘制打印内容
public int print(Graphics graphics, PageFormat pf,
int pageIndex) throws PrinterException {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D) graphics; // 获得图形上下文对象
int x = (int) (PrintPieChartFrame.this.getBounds()
.getX()) + 8;// 背景面板在屏幕上的X坐标
int y = (int) (PrintPieChartFrame.this.getBounds()
.getY()) + 30;// 背景面板在屏幕上的Y坐标
int w = (int) chartPanel.getBounds().getWidth();// 图表的宽度
int h = (int) chartPanel.getBounds().getHeight();// 图表的高度
Rectangle rect = new Rectangle(x, y, w, h);// 创建Rectangle对象
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
int imgWidth = buffImage.getWidth();// 图像的宽度
int imgHeight = buffImage.getHeight();// 图像的高度
float wh = imgWidth / imgHeight;// 图像宽高比
int printX = (int) pf.getImageableX();// 获得可打印区域的x坐标
int printY = (int) pf.getImageableY();// 获得可打印区域的y坐标
int width = (int) pf.getImageableWidth();// 获得可打印区域的宽度
int height = (int) pf.getImageableHeight();// 获得可打印区域的高度
if (imgWidth > width) { // 如果宽大于可打印区域
imgWidth = width;
imgHeight = (int) (imgHeight * wh);
}
if (imgHeight > height) { // 如果高大于可打印区域
imgHeight = height;
imgWidth = (int) (imgWidth * wh);
}
g2.drawImage(buffImage, printX, printY, imgWidth,
imgHeight, PrintPieChartFrame.this);
return Printable.PAGE_EXISTS;
}
});
job.setJobName("打印饼形图表"); // 设置打印任务的名称
job.print(); // 调用print()方法开始打印
} catch (PrinterException ee) {
ee.printStackTrace();
}
}
});
button.setText("打 印");
button.setBounds(28, 56, 86, 28);

final JButton button_1 = new JButton();
panel.add(button_1);
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
button_1.setBounds(151, 56, 86, 28);

//
}

private static PieDataset createDataset() {
DefaultPieDataset dataset = new DefaultPieDataset();// 创建数据集对象
ResultSet rs = QueryResultSet.gainRecord();// 获得查询结果集
try {
while (rs.next()) {
int value = rs.getInt(1);// 获得平均年龄
String sex = rs.getString(2);// 获得性别
String address = rs.getString(3);// 获得地址
dataset.setValue(address + "," + sex, value);// 设置数据集的值
}
} catch (SQLException e) {
e.printStackTrace();
}
return dataset;
}

private static JFreeChart createChart(PieDataset dataset) {
JFreeChart chart = ChartFactory.createPieChart("\n\n统计来自各城市男女员工的平均年龄", // 图表的标题文本
dataset, // 数据集
true, // 显示图例
true, // 显示说明文字
false // 不生成链接
);
chart.setBackgroundPaint(Color.white);// 设置背景颜色
chart.getTitle().setFont(new Font("黑体", Font.PLAIN, 20));// 设置标题字体
chart.getLegend().setItemFont(new Font("黑体", Font.PLAIN, 12));// 设置图例文本的字体
PiePlot plot = (PiePlot) chart.getPlot();// 获得图表的PiePlot对象
plot.setLabelFont(new Font("黑体", Font.PLAIN, 12));// 设置饼状图标签的字体
return chart;
}

QueryResultSet.java
static {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获得查询结果集
*/
public static ResultSet gainRecord(){
Connection conn=null; // 声明连接
Statement st=null; // 声明Statement对象
ResultSet rs=null; // 声明结果集对象
try {
String url="jdbc:jtds:sqlserver://192.168.1.122:1433/db_database"; // 数据库db_database的URL
String username="sa"; // 数据库的用户名
String password=""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st=conn.createStatement(); // 创建Statement对象
String sql="select avg(age) as avgAge,sex,address from tb_employee group by address,sex"; // 定义SQL查询语句
rs=st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}

实例107 打印折线图表
PrintLineChartFrame.java
PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
ChartPanel chartPanel = null;
private Robot robot = null; // 声明Robot对象
private BufferedImage buffImage = null; // 声明缓冲图像对象

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintLineChartFrame frame = new PrintLineChartFrame();
RefineryUtilities.centerFrameOnScreen(frame);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public PrintLineChartFrame() {
super();
setTitle("打印折线图表");
setBounds(0, 0, 500, 360);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

CategoryDataset dataset = createDataset();
JFreeChart chart = createChart(dataset);
chartPanel = new ChartPanel(chart);
chartPanel.setFillZoomRectangle(true);
chartPanel.setMouseWheelEnabled(true);
getContentPane().add(chartPanel);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
final JButton button = new JButton();
panel.add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
final PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
if (!job.printDialog()) // 打开打印对话框
return;// 单击打印对话框的取消按钮或关闭打印对话框结束程序的执行
job.setPrintable(new Printable() {
// 实现print()方法,绘制打印内容
public int print(Graphics graphics, PageFormat pf,
int pageIndex) throws PrinterException {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D) graphics; // 获得图形上下文对象
int x = (int) (PrintLineChartFrame.this.getBounds()
.getX()) + 8;// 背景面板在屏幕上的X坐标
int y = (int) (PrintLineChartFrame.this.getBounds()
.getY()) + 30;// 背景面板在屏幕上的Y坐标
int w = (int) chartPanel.getBounds().getWidth();// 图表的宽度
int h = (int) chartPanel.getBounds().getHeight();// 图表的高度
Rectangle rect = new Rectangle(x, y, w, h);// 创建Rectangle对象
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
int imgWidth = buffImage.getWidth();// 图像的宽度
int imgHeight = buffImage.getHeight();// 图像的高度
float wh = imgWidth / imgHeight;// 图像宽高比
int printX = (int) pf.getImageableX();// 获得可打印区域的x坐标
int printY = (int) pf.getImageableY();// 获得可打印区域的y坐标
int width = (int) pf.getImageableWidth();// 获得可打印区域的宽度
int height = (int) pf.getImageableHeight();// 获得可打印区域的高度
if (imgWidth > width) { // 如果宽大于可打印区域
imgWidth = width;
imgHeight = (int) (imgHeight * wh);
}
if (imgHeight > height) { // 如果高大于可打印区域
imgHeight = height;
imgWidth = (int) (imgWidth * wh);
}
g2.drawImage(buffImage, printX, printY, imgWidth,
imgHeight, PrintLineChartFrame.this);
return Printable.PAGE_EXISTS;
}
});
job.setJobName("打印折线图表"); // 设置打印任务的名称
job.print(); // 调用print()方法开始打印
} catch (PrinterException ee) {
ee.printStackTrace();
}
}
});
button.setText("打 印");
button.setBounds(28, 56, 86, 28);

final JButton button_1 = new JButton();
panel.add(button_1);
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
button_1.setBounds(151, 56, 86, 28);

//
}

private static CategoryDataset createDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();// 创建数据集对象
ResultSet rs = QueryResultSet.gainRecord();// 获得查询结果集
try {
while (rs.next()) {
int value = rs.getInt(1);// 获得平均年龄
String sex = rs.getString(2);// 获得性别
String address = rs.getString(3);// 获得地址
dataset.addValue(value, sex, address);// 向数据集添加数据
}
} catch (SQLException e) {
e.printStackTrace();
}
return dataset;
}

private static JFreeChart createChart(CategoryDataset dataset) {
JFreeChart chart = ChartFactory.createLineChart("\n\n统计来自各城市男女员工的平均年龄", // 图表的标题文本
"所在城市 ", // x轴上的标签文字
"平均年龄", // y轴上的标签文字
dataset, // 数据集
PlotOrientation.VERTICAL, // 垂直方向
true, // 显示图例
true, // 显示说明文字
false // 不生成链接
);
chart.setBackgroundPaint(Color.white);// 设置背景颜色
CategoryPlot plot = (CategoryPlot) chart.getPlot();// 获得图表的CategoryPlot对象
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();// 获得y轴的实例
rangeAxis.setTickLabelFont(new Font("Sans-serif", Font.PLAIN, 12));// 设置y轴显示值的字体
rangeAxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));// 设置y轴上标签文字的字体
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());// 设置y轴显示标准的整数单元
CategoryAxis domainAxis = plot.getDomainAxis();// 获得x轴的实例
domainAxis.setTickLabelFont(new Font("Sans-serif", Font.PLAIN, 12));// 设置x轴显示信息的字体
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));// 设置x轴上标签文字的字体
domainAxis.setCategoryLabelPositions(CategoryLabelPositions
.createUpRotationLabelPositions(Math.PI / 6.0));// 指定x轴上显示信息的位置
TextTitle textTitle = chart.getTitle();// 获得标题对象
textTitle.setFont(new Font("黑体", Font.PLAIN, 20));// 设置标题的字体
chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));// 设置图例文本的字体
chart.getLegend().setHorizontalAlignment(HorizontalAlignment.CENTER);// 设置图例的对齐方式
return chart;
}

QueryResultSet.java
static {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获得查询结果集
*/
public static ResultSet gainRecord(){
Connection conn=null; // 声明连接
Statement st=null; // 声明Statement对象
ResultSet rs=null; // 声明结果集对象
try {
String url="jdbc:jtds:sqlserver://192.168.1.122:1433/db_database"; // 数据库db_database的URL
String username="sa"; // 数据库的用户名
String password=""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st=conn.createStatement(); // 创建Statement对象
String sql="select avg(age) as avgAge,sex,address from tb_employee group by address,sex"; // 定义SQL查询语句
rs=st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}

实例108 打印区域图表
PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
ChartPanel chartPanel = null;
private Robot robot = null; // 声明Robot对象
private BufferedImage buffImage = null; // 声明缓冲图像对象

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintAreaChartFrame frame = new PrintAreaChartFrame();
RefineryUtilities.centerFrameOnScreen(frame);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public PrintAreaChartFrame() {
super();
setTitle("打印区域图表");
setBounds(0, 0, 820, 360);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

XYDataset xydataset = createDataset(); // 创建数据集对象
JFreeChart chart = createChart(xydataset); // 创建JFreeChart对象

chartPanel = new ChartPanel(chart);
chartPanel.setFillZoomRectangle(true);
chartPanel.setMouseWheelEnabled(true);
getContentPane().add(chartPanel);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
final JButton button = new JButton();
panel.add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
final PrinterJob job = PrinterJob.getPrinterJob(); // 获得打印对象
if (!job.printDialog()) // 打开打印对话框
return;// 单击打印对话框的取消按钮或关闭打印对话框结束程序的执行
job.setPrintable(new Printable() {
// 实现print()方法,绘制打印内容
public int print(Graphics graphics, PageFormat pf,
int pageIndex) throws PrinterException {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D) graphics; // 获得图形上下文对象
int x = (int) (PrintAreaChartFrame.this.getBounds()
.getX()) + 8;// 背景面板在屏幕上的X坐标
int y = (int) (PrintAreaChartFrame.this.getBounds()
.getY()) + 30;// 背景面板在屏幕上的Y坐标
int w = (int) chartPanel.getBounds().getWidth();// 图表的宽度
int h = (int) chartPanel.getBounds().getHeight();// 图表的高度
Rectangle rect = new Rectangle(x, y, w, h);// 创建Rectangle对象
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
int imgWidth = buffImage.getWidth();// 图像的宽度
int imgHeight = buffImage.getHeight();// 图像的高度
float wh = imgWidth / imgHeight;// 图像宽高比
int printX = (int) pf.getImageableX();// 获得可打印区域的x坐标
int printY = (int) pf.getImageableY();// 获得可打印区域的y坐标
int width = (int) pf.getImageableWidth();// 获得可打印区域的宽度
int height = (int) pf.getImageableHeight();// 获得可打印区域的高度
if (imgWidth > width) { // 如果宽大于可打印区域
imgWidth = width;
imgHeight = (int) (imgHeight * wh);
}
if (imgHeight > height) { // 如果高大于可打印区域
imgHeight = height;
imgWidth = (int) (imgWidth * wh);
}
g2.drawImage(buffImage, printX, printY, imgWidth,
imgHeight, PrintAreaChartFrame.this);
return Printable.PAGE_EXISTS;
}
});
job.setJobName("打印区域图表"); // 设置打印任务的名称
job.print(); // 调用print()方法开始打印
} catch (PrinterException ee) {
ee.printStackTrace();
}
}
});
button.setText("打 印");
button.setBounds(28, 56, 86, 28);
final JButton button_1 = new JButton();
panel.add(button_1);
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
button_1.setBounds(151, 56, 86, 28);
}

private XYDataset createDataset() {
long value = 0;
Day day = new Day(1, 1, 2009);// 获得2009年1月1日的Day对象
long seed = System.currentTimeMillis();// 获得当前时间的毫秒数
Random ran = new Random(seed);// 创建随机数种子为seed的Random对象
TimeSeries soft = new TimeSeries("明日科技图书");// 创建时间序列
for (int i = 0; i < 365; i++) { //添加一年365天的数据
value += ran.nextInt() / 10000;// 随机获得数据
soft.add(day, value);// 添加数据
day = (Day) day.next();// 获得下一个日期的Day对象
}
TimeSeriesCollection dataset = new TimeSeriesCollection(soft);// 创建数据集对象
return dataset;
}

@SuppressWarnings("deprecation")
private JFreeChart createChart(XYDataset xydataset) {
StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
standardChartTheme.setExtraLargeFont(new Font("隶书", Font.BOLD, 24));//设置标题字体
standardChartTheme.setRegularFont(new Font("宋体", Font.BOLD, 14));//设置图例的字体
standardChartTheme.setLargeFont(new Font("宋体", Font.BOLD, 18));//设置轴向的字体
ChartFactory.setChartTheme(standardChartTheme);//设置主题样式
JFreeChart jfreechart = ChartFactory.createXYAreaChart(
"明日科技图书,年度用户满意度统计", // 图表标题
"年统计月份", // X轴标题
"用户满意度", // Y轴标题
xydataset, // 制图的数据集
PlotOrientation.VERTICAL, // 定义区域图的方向为纵向
false, // 是否显示图例标识
true, // 是否显示提示信息
false); // 是否支持超链接
jfreechart.setBackgroundPaint(Color.PINK); // 设置背景
XYPlot xyplot = (XYPlot) jfreechart.getPlot(); //获得XYPlot对象
xyplot.setDomainGridlinePaint(Color.GREEN);// 设置图表网格线的颜色
xyplot.setDomainGridlineStroke(new BasicStroke(1f));// 设置网格线的粗细
XYPlot plot = jfreechart.getXYPlot();// 获取图表的绘制属性
// 创建指定样式的日期格式对象
DateFormat format = new SimpleDateFormat("MM月份");
DateAxis domainAxis = new DateAxis("2009年统计月份 ");// 创建时间轴对象
DateTickUnit dtu = new DateTickUnit(DateTickUnit.DAY, 29, format);
domainAxis.setTickUnit(dtu); // 设置横轴上的时间刻度的显示格式
domainAxis.setLowerMargin(0.0); // 设置图表空白
domainAxis.setUpperMargin(0.0); // 设置图表空白
domainAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 14)); // 设置轴标记字体
domainAxis.setLabelFont(new Font("宋体", Font.ITALIC, 20)); // 设置横轴字体
plot.setDomainAxis(domainAxis); // 为绘图属性添加横轴对象
plot.setForegroundAlpha(0.5f);// 设置前景透明度为50%
return jfreechart;
}

实例109 打印带柱形图表的报表
PrintBarReportFrame.java
private PageFormat pf;
private PreviewCanvas canvas;
private boolean isPreview = false; // 是否可以打印
private boolean previewFlag = false; // 是否已经进行预览
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintBarReportFrame frame = new PrintBarReportFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public PrintBarReportFrame() {
super();

CategoryDataset dataset = createDataset();// 创建数据集对象
JFreeChart chart = createChart(dataset);// 创建图表对象
String path = System.getProperty("user.dir")+"/src/chartImg/chart.jpg";// 图表的存储位置
try {
ChartUtilities.writeChartAsJPEG(new FileOutputStream(path), chart, 450, 360);// 将图表存储为图片
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}

addWindowListener(new WindowAdapter() {
public void windowActivated(final WindowEvent e) {
if (previewFlag) {
isPreview = true;// 设置为可以打印
canvas.repaint();// 调用paint()方法
}
}
});
addComponentListener(new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {// 窗体大小改变时执行
if (previewFlag) {
isPreview = true;// 设置为可以打印
canvas.repaint();// 调用paint()方法
}
}
});
getContentPane().setBackground(new Color(232, 162, 255));
setTitle("打印带柱形图表的报表");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
//pf.setOrientation(PageFormat.LANDSCAPE);// 打印起始点,也就是打印方向
canvas = new PreviewCanvas();

this.setSize(new Dimension(633, 931));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel = new JPanel();
panel.setOpaque(false);
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打印预览
if (QueryResultSet.gainRecord() != null) {
isPreview = true;// 表示可以打印
previewFlag = true;// 设置为已经打印预览
PrinterJob job = PrinterJob.getPrinterJob();// 获得打印对象
pf = job.pageDialog(pf);// 显示修改PageFormat实例的对话框
canvas.repaint();// 调用paint()方法
}
}
});
previewButton.setText("预览报表");
panel.add(previewButton);

final JButton printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!previewFlag){
return;
}
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob对象的实例
if (!job.printDialog())// 打开打印对话框
return;
// 设置打印内容
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
isPreview = true; // 设置可以打印
if (pageIndex < 1) {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}

});
job.setJobName("打印报表");
try {
job.print();// 调用print()方法,实现打印
} catch (PrinterException e1) {
e1.printStackTrace();
}

}
});
printButton.setText("打印报表");
panel.add(printButton);
}

private static CategoryDataset createDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();// 创建数据集对象
ResultSet rs = QueryResultSet.gainRecord();// 获得查询结果集
try {
while (rs.next()) {
int value = rs.getInt(1);// 获得年龄
String sex = rs.getString(2);// 获得性别
String address = rs.getString(3);// 获得地址
dataset.addValue(value, sex, address);// 在数据集中添加数据信息
}
} catch (SQLException e) {
e.printStackTrace();
}
return dataset;// 返回数据集对象
}

private static JFreeChart createChart(CategoryDataset dataset) {
JFreeChart chart = ChartFactory.createBarChart("\n\n统计来自各城市男女员工的平均年龄", // 图表的标题文本
"所在城市 ", // x轴上的标签文字
"平均年龄", // y轴上的标签文字
dataset, // 数据集
PlotOrientation.VERTICAL, // 垂直方向
true, // 显示图例
true, // 显示说明文字
false // 不生成链接
);
chart.setBackgroundPaint(Color.white);// 设置背景颜色
CategoryPlot plot = (CategoryPlot) chart.getPlot();// 获得图表的CategoryPlot对象
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();// 获得y轴的实例
rangeAxis.setTickLabelFont(new Font("Sans-serif", Font.PLAIN, 12));// 设置y轴显示值的字体
rangeAxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));// 设置y轴上标签文字的字体
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());// 设置y轴显示标准的整数单元
BarRenderer renderer = (BarRenderer) plot.getRenderer();// 获得柱形的描述对象
GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue, 0.0f,
0.0f, new Color(0, 0, 64));// 创建渐变色对象
GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f,
0.0f, new Color(0, 64, 0));// 创建渐变色对象
renderer.setSeriesPaint(0, gp0);// 指定柱的颜色
renderer.setSeriesPaint(1, gp1);// 指定柱的颜色
CategoryAxis domainAxis = plot.getDomainAxis();// 获得x轴的实例
domainAxis.setTickLabelFont(new Font("Sans-serif", Font.PLAIN, 12));// 设置x轴显示信息的字体
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));// 设置x轴上标签文字的字体
domainAxis.setCategoryLabelPositions(CategoryLabelPositions
.createUpRotationLabelPositions(Math.PI / 6.0));// 指定x轴上显示信息的位置
TextTitle textTitle = chart.getTitle();// 获得标题对象
textTitle.setFont(new Font("黑体", Font.PLAIN, 20));// 设置标题的字体
chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));// 设置图例文本的字体
chart.getLegend().setHorizontalAlignment(HorizontalAlignment.CENTER);// 设置图例的对齐方式
return chart;
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
printPicture(graphics, pageFormat, pageIndex);// 绘制打印内容
return Printable.PAGE_EXISTS;// 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.translate(10, 10);// 平移绘图上下文
int x = (int) (pf.getImageableX() - 1);// 获得可打印区域的x坐标偏左,用于绘制虚线
int y = (int) (pf.getImageableY() - 1);// 获得可打印区域的y坐标偏上,用于绘制虚线
int width = (int) (pf.getImageableWidth() + 1);// 获得可打印区域的宽度偏右,用于绘制虚线
int height = (int) (pf.getImageableHeight() + 1);// 获得可打印区域的高度偏下,用于绘制虚线
int mw = (int) pf.getWidth();// 获得打印页的宽度
int mh = (int) pf.getHeight();// 获得打印页的高度
g2.drawRect(0, 0, mw, mh);// 绘制实线外框
g2.setColor(new Color(255, 253, 234));// 设置前景色
g2.fillRect(1, 1, mw - 1, mh - 1);// 绘制填充区域
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));// 指定虚线模式
g2.setColor(Color.BLACK);// 设置前景色
g2.drawRect(x, y, width, height);// 绘制虚线内框
g2.setColor(Color.WHITE);// 设置前景色
g2.fillRect(x + 1, y + 1, width - 1, height - 1);// 绘制填充区域
PrintBarReportFrame.this.print(g, pf, 0);// 调用print()方法
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制打印内容
*
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX();// 获得可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY();// 获得可打印区域坐标的Y位置
int w = (int) pageFormat.getImageableWidth();// 获得可打印区域的宽度
Graphics2D g2 = (Graphics2D) graphics;// 转换为Graphics2D对象
ResultSet rs = QueryResultSet.gainReport();// 获得查询结果集
if (rs != null && isPreview) {
g2.setColor(Color.BLUE);// 设置为蓝色
g2.setFont(new Font("华文行楷",Font.BOLD,40));// 设置字体
g2.drawString("员工基本信息报表", x + 60, y + 50);// 绘制报表标题
g2.setColor(Color.BLACK);// 设置为黑色
g2.setFont(new Font("宋体",Font.PLAIN,12));// 设置字体
g2.setStroke(new BasicStroke(1f));// 指定实线模式
try {
y = y + 80;// 调整打印位置的y值
int y1 = y;// 保存调整后打印位置的y值
/**************绘制报表的标题*******************/
g2.drawLine(x + 10, y - 20, x + w - 10, y - 20);// 绘制水平直线
g2.drawString("编号", x + 20, y);// 绘制报表内容
g2.drawString("姓名", x + 60, y);// 绘制报表内容
g2.drawString("性别", x + 110, y);// 绘制报表内容
g2.drawString("年龄", x + 150, y);// 绘制报表内容
g2.drawString("联系地址", x + 190, y);// 绘制报表内容
g2.drawString("邮政编码", x + 290, y);// 绘制报表内容
g2.drawString("电话号码", x + 360, y);// 绘制报表内容
g2.drawLine(x + 10, y1 - 20, x + 10, y + 10);// 绘制垂直直线
g2.drawLine(x + 50, y1 - 20, x + 50, y + 10);// 绘制垂直直线
g2.drawLine(x + 100, y1 - 20, x + 100, y + 10);// 绘制垂直直线
g2.drawLine(x + 140, y1 - 20, x + 140, y + 10);// 绘制垂直直线
g2.drawLine(x + 180, y1 - 20, x + 180, y + 10);// 绘制垂直直线
g2.drawLine(x + 280, y1 - 20, x + 280, y + 10);// 绘制垂直直线
g2.drawLine(x + 350, y1 - 20, x + 350, y + 10);// 绘制垂直直线
g2.drawLine(x + w - 10, y1 - 20, x + w - 10, y + 10);// 绘制垂直直线
/************************************************/
while (rs.next()) {
y = y + 30;// 调整打印位置的y值
g2.drawLine(x + 10, y - 20, x + w - 10, y - 20);// 绘制水平直线
g2.drawString(String.valueOf(rs.getInt(1)), x + 30, y);// 绘制报表内容
g2.drawString(rs.getString(2), x + 60, y);// 绘制报表内容
g2.drawString(rs.getString(3), x + 110, y);// 绘制报表内容
g2.drawString(String.valueOf(rs.getInt(4)), x + 150, y);// 绘制报表内容
g2.drawString(rs.getString(5), x + 190, y);// 绘制报表内容
g2.drawString(rs.getString(6), x + 290, y);// 绘制报表内容
g2.drawString(rs.getString(7), x + 360, y);// 绘制报表内容
}
g2.drawLine(x + 10, y1 + 10, x + 10, y + 10);// 绘制垂直直线
g2.drawLine(x + 50, y1 + 10, x + 50, y + 10);// 绘制垂直直线
g2.drawLine(x + 100, y1 + 10, x + 100, y + 10);// 绘制垂直直线
g2.drawLine(x + 140, y1 + 10, x + 140, y + 10);// 绘制垂直直线
g2.drawLine(x + 180, y1 + 10, x + 180, y + 10);// 绘制垂直直线
g2.drawLine(x + 280, y1 + 10, x + 280, y + 10);// 绘制垂直直线
g2.drawLine(x + 350, y1 + 10, x + 350, y + 10);// 绘制垂直直线
g2.drawLine(x + w - 10, y1 + 10, x + w - 10, y + 10);// 绘制垂直直线
g2.drawLine(x + 10, y + 30 - 20, x + w - 10, y + 30 - 20);// 绘制水平直线
/*********************绘制图表图片*****************************/
URL imgUrl = PrintBarReportFrame.class.getResource("/chartImg/chart.jpg");// 获取图片资源的路径
Image img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图表图片的图像对象
g2.drawImage(img, x+10, y+20,420,300, this);// 在打印页绘制图表图片

rs.close();// 关闭结果集
} catch (Exception ex) {
ex.printStackTrace();
}
}
isPreview = true; // 设置不可以打印
previewFlag = true;
}

QueryResultSet.java
static {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获得查询结果集
*/
public static ResultSet gainReport() {
Connection conn = null; // 声明连接
Statement st = null; // 声明Statement对象
ResultSet rs = null; // 声明结果集对象
try {
String url = "jdbc:jtds:sqlserver://localhost:1433/db_database"; // 数据库db_database的URL
String username = "sa"; // 数据库的用户名
String password = ""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st = conn.createStatement(); // 创建Statement对象
String sql = "select * from tb_employee"; // 定义SQL查询语句
rs = st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}
/**
* 获得查询结果集
*/
public static ResultSet gainRecord(){
Connection conn=null; // 声明连接
Statement st=null; // 声明Statement对象
ResultSet rs=null; // 声明结果集对象
try {
String url="jdbc:jtds:sqlserver://192.168.1.122:1433/db_database"; // 数据库db_database的URL
String username="sa"; // 数据库的用户名
String password=""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st=conn.createStatement(); // 创建Statement对象
String sql="select avg(age) as avgAge,sex,address from tb_employee group by address,sex"; // 定义SQL查询语句
rs=st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}

实例110 打印带饼形图表的报表
QueryResultSet.java
static {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获得查询结果集
*/
public static ResultSet gainReport() {
Connection conn = null; // 声明连接
Statement st = null; // 声明Statement对象
ResultSet rs = null; // 声明结果集对象
try {
String url = "jdbc:jtds:sqlserver://localhost:1433/db_database"; // 数据库db_database的URL
String username = "sa"; // 数据库的用户名
String password = ""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st = conn.createStatement(); // 创建Statement对象
String sql = "select * from tb_employee"; // 定义SQL查询语句
rs = st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}
/**
* 获得查询结果集
*/
public static ResultSet gainRecord(){
Connection conn=null; // 声明连接
Statement st=null; // 声明Statement对象
ResultSet rs=null; // 声明结果集对象
try {
String url="jdbc:jtds:sqlserver://192.168.1.122:1433/db_database"; // 数据库db_database的URL
String username="sa"; // 数据库的用户名
String password=""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st=conn.createStatement(); // 创建Statement对象
String sql="select avg(age) as avgAge,sex,address from tb_employee group by address,sex"; // 定义SQL查询语句
rs=st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}

PrintPieReportFrame.java
private PageFormat pf;
private PreviewCanvas canvas;
private boolean isPreview = false; // 是否可以打印
private boolean previewFlag = false; // 是否已经进行预览

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintPieReportFrame frame = new PrintPieReportFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public PrintPieReportFrame() {
super();
PieDataset dataset = createDataset();// 创建数据集对象
JFreeChart chart = createChart(dataset);// 创建图表对象
String path = System.getProperty("user.dir")
+ "/src/chartImg/chart.jpg";// 图表的存储位置
try {
ChartUtilities.writeChartAsJPEG(new FileOutputStream(path), chart,
450, 360);// 将图表存储为图片
} catch (FileNotFoundException e2) {
e2.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}

addWindowListener(new WindowAdapter() {
public void windowActivated(final WindowEvent e) {
if (previewFlag) {
isPreview = true;// 设置为可以打印
canvas.repaint();// 调用paint()方法
}
}
});
addComponentListener(new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {// 窗体大小改变时执行
if (previewFlag) {
isPreview = true;// 设置为可以打印
canvas.repaint();// 调用paint()方法
}
}
});
getContentPane().setBackground(new Color(232, 162, 255));
setTitle("打印带饼形图表的报表");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
// pf.setOrientation(PageFormat.LANDSCAPE);// 打印起始点,也就是打印方向
canvas = new PreviewCanvas();

this.setSize(new Dimension(633, 931));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel = new JPanel();
panel.setOpaque(false);
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打印预览
if (QueryResultSet.gainRecord() != null) {
isPreview = true;// 表示可以打印
previewFlag = true;// 设置为已经打印预览
PrinterJob job = PrinterJob.getPrinterJob();// 获得打印对象
pf = job.pageDialog(pf);// 显示修改PageFormat实例的对话框
canvas.repaint();// 调用paint()方法
}
}
});
previewButton.setText("预览报表");
panel.add(previewButton);

final JButton printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!previewFlag) {
return;
}
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob对象的实例
if (!job.printDialog())// 打开打印对话框
return;
// 设置打印内容
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
isPreview = true; // 设置可以打印
if (pageIndex < 1) {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}

});
job.setJobName("打印报表");
try {
job.print();// 调用print()方法,实现打印
} catch (PrinterException e1) {
e1.printStackTrace();
}

}
});
printButton.setText("打印报表");
panel.add(printButton);
}

private static PieDataset createDataset() {
DefaultPieDataset dataset = new DefaultPieDataset();// 创建数据集对象
ResultSet rs = QueryResultSet.gainRecord();// 获得查询结果集
try {
while (rs.next()) {
int value = rs.getInt(1);// 获得平均年龄
String sex = rs.getString(2);// 获得性别
String address = rs.getString(3);// 获得地址
dataset.setValue(address + "," + sex, value);// 设置数据集的值
}
} catch (SQLException e) {
e.printStackTrace();
}
return dataset;
}

private static JFreeChart createChart(PieDataset dataset) {
JFreeChart chart = ChartFactory.createPieChart("\n\n统计来自各城市男女员工的平均年龄", // 图表的标题文本
dataset, // 数据集
true, // 显示图例
true, // 显示说明文字
false // 不生成链接
);
chart.setBackgroundPaint(Color.white);// 设置背景颜色
chart.getTitle().setFont(new Font("黑体", Font.PLAIN, 20));// 设置标题字体
chart.getLegend().setItemFont(new Font("黑体", Font.PLAIN, 12));// 设置图例文本的字体
PiePlot plot = (PiePlot) chart.getPlot();// 获得图表的PiePlot对象
plot.setLabelFont(new Font("黑体", Font.PLAIN, 12));// 设置饼状图标签的字体
return chart;
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
printPicture(graphics, pageFormat, pageIndex);// 绘制打印内容
return Printable.PAGE_EXISTS;// 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.translate(10, 10);// 平移绘图上下文
int x = (int) (pf.getImageableX() - 1);// 获得可打印区域的x坐标偏左,用于绘制虚线
int y = (int) (pf.getImageableY() - 1);// 获得可打印区域的y坐标偏上,用于绘制虚线
int width = (int) (pf.getImageableWidth() + 1);// 获得可打印区域的宽度偏右,用于绘制虚线
int height = (int) (pf.getImageableHeight() + 1);// 获得可打印区域的高度偏下,用于绘制虚线
int mw = (int) pf.getWidth();// 获得打印页的宽度
int mh = (int) pf.getHeight();// 获得打印页的高度
g2.drawRect(0, 0, mw, mh);// 绘制实线外框
g2.setColor(new Color(255, 253, 234));// 设置前景色
g2.fillRect(1, 1, mw - 1, mh - 1);// 绘制填充区域
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));// 指定虚线模式
g2.setColor(Color.BLACK);// 设置前景色
g2.drawRect(x, y, width, height);// 绘制虚线内框
g2.setColor(Color.WHITE);// 设置前景色
g2.fillRect(x + 1, y + 1, width - 1, height - 1);// 绘制填充区域
PrintPieReportFrame.this.print(g, pf, 0);// 调用print()方法
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制打印内容
*
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX();// 获得可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY();// 获得可打印区域坐标的Y位置
int w = (int) pageFormat.getImageableWidth();// 获得可打印区域的宽度
Graphics2D g2 = (Graphics2D) graphics;// 转换为Graphics2D对象
ResultSet rs = QueryResultSet.gainReport();// 获得查询结果集
if (rs != null && isPreview) {
g2.setColor(Color.BLUE);// 设置为蓝色
g2.setFont(new Font("华文行楷", Font.BOLD, 40));// 设置字体
g2.drawString("员工基本信息报表", x + 60, y + 50);// 绘制报表标题
g2.setColor(Color.BLACK);// 设置为黑色
g2.setFont(new Font("宋体", Font.PLAIN, 12));// 设置字体
g2.setStroke(new BasicStroke(1f));// 指定实线模式
try {
y = y + 80;// 调整打印位置的y值
int y1 = y;// 保存调整后打印位置的y值
/************** 绘制报表的标题 *******************/
g2.drawLine(x + 10, y - 20, x + w - 10, y - 20);// 绘制水平直线
g2.drawString("编号", x + 20, y);// 绘制报表内容
g2.drawString("姓名", x + 60, y);// 绘制报表内容
g2.drawString("性别", x + 110, y);// 绘制报表内容
g2.drawString("年龄", x + 150, y);// 绘制报表内容
g2.drawString("联系地址", x + 190, y);// 绘制报表内容
g2.drawString("邮政编码", x + 290, y);// 绘制报表内容
g2.drawString("电话号码", x + 360, y);// 绘制报表内容
g2.drawLine(x + 10, y1 - 20, x + 10, y + 10);// 绘制垂直直线
g2.drawLine(x + 50, y1 - 20, x + 50, y + 10);// 绘制垂直直线
g2.drawLine(x + 100, y1 - 20, x + 100, y + 10);// 绘制垂直直线
g2.drawLine(x + 140, y1 - 20, x + 140, y + 10);// 绘制垂直直线
g2.drawLine(x + 180, y1 - 20, x + 180, y + 10);// 绘制垂直直线
g2.drawLine(x + 280, y1 - 20, x + 280, y + 10);// 绘制垂直直线
g2.drawLine(x + 350, y1 - 20, x + 350, y + 10);// 绘制垂直直线
g2.drawLine(x + w - 10, y1 - 20, x + w - 10, y + 10);// 绘制垂直直线
/************************************************/
while (rs.next()) {
y = y + 30;// 调整打印位置的y值
g2.drawLine(x + 10, y - 20, x + w - 10, y - 20);// 绘制水平直线
g2.drawString(String.valueOf(rs.getInt(1)), x + 30, y);// 绘制报表内容
g2.drawString(rs.getString(2), x + 60, y);// 绘制报表内容
g2.drawString(rs.getString(3), x + 110, y);// 绘制报表内容
g2.drawString(String.valueOf(rs.getInt(4)), x + 150, y);// 绘制报表内容
g2.drawString(rs.getString(5), x + 190, y);// 绘制报表内容
g2.drawString(rs.getString(6), x + 290, y);// 绘制报表内容
g2.drawString(rs.getString(7), x + 360, y);// 绘制报表内容
}
g2.drawLine(x + 10, y1 + 10, x + 10, y + 10);// 绘制垂直直线
g2.drawLine(x + 50, y1 + 10, x + 50, y + 10);// 绘制垂直直线
g2.drawLine(x + 100, y1 + 10, x + 100, y + 10);// 绘制垂直直线
g2.drawLine(x + 140, y1 + 10, x + 140, y + 10);// 绘制垂直直线
g2.drawLine(x + 180, y1 + 10, x + 180, y + 10);// 绘制垂直直线
g2.drawLine(x + 280, y1 + 10, x + 280, y + 10);// 绘制垂直直线
g2.drawLine(x + 350, y1 + 10, x + 350, y + 10);// 绘制垂直直线
g2.drawLine(x + w - 10, y1 + 10, x + w - 10, y + 10);// 绘制垂直直线
g2.drawLine(x + 10, y + 30 - 20, x + w - 10, y + 30 - 20);// 绘制水平直线
/********************* 绘制图表图片 *****************************/
URL imgUrl = PrintPieReportFrame.class.getResource("/chartImg/chart.jpg");// 获取图片资源的路径
Image img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图表图片的图像对象
g2.drawImage(img, x + 10, y + 20, 420, 300, this);// 在打印页绘制图表图片

rs.close();// 关闭结果集
} catch (Exception ex) {
ex.printStackTrace();
}
}
isPreview = true; // 设置不可以打印
previewFlag = true;
}

实例111 打印带折线图表的报表
PrintLineReportFrame.java
private PageFormat pf;
private PreviewCanvas canvas;
private boolean isPreview = false; // 是否可以打印
private boolean previewFlag = false; // 是否已经进行预览

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintLineReportFrame frame = new PrintLineReportFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public PrintLineReportFrame() {
super();

CategoryDataset dataset = createDataset();// 创建数据集对象
JFreeChart chart = createChart(dataset);// 创建图表对象
String path = System.getProperty("user.dir") + "/src/chartImg/chart.jpg";// 图表的存储位置
try {
ChartUtilities.writeChartAsJPEG(new FileOutputStream(path), chart, 450, 360);// 将图表存储为图片
} catch (FileNotFoundException e2) {
e2.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}

addWindowListener(new WindowAdapter() {
public void windowActivated(final WindowEvent e) {
if (previewFlag) {
isPreview = true;// 设置为可以打印
canvas.repaint();// 调用paint()方法
}
}
});
addComponentListener(new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {// 窗体大小改变时执行
if (previewFlag) {
isPreview = true;// 设置为可以打印
canvas.repaint();// 调用paint()方法
}
}
});
getContentPane().setBackground(new Color(232, 162, 255));
setTitle("打印带折线图表的报表");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
// pf.setOrientation(PageFormat.LANDSCAPE);// 打印起始点,也就是打印方向
canvas = new PreviewCanvas();

this.setSize(new Dimension(633, 931));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel = new JPanel();
panel.setOpaque(false);
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打印预览
if (QueryResultSet.gainRecord() != null) {
isPreview = true;// 表示可以打印
previewFlag = true;// 设置为已经打印预览
PrinterJob job = PrinterJob.getPrinterJob();// 获得打印对象
pf = job.pageDialog(pf);// 显示修改PageFormat实例的对话框
canvas.repaint();// 调用paint()方法
}
}
});
previewButton.setText("预览报表");
panel.add(previewButton);

final JButton printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!previewFlag) {
return;
}
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob对象的实例
if (!job.printDialog())// 打开打印对话框
return;
// 设置打印内容
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
isPreview = true; // 设置可以打印
if (pageIndex < 1) {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}

});
job.setJobName("打印报表");
try {
job.print();// 调用print()方法,实现打印
} catch (PrinterException e1) {
e1.printStackTrace();
}

}
});
printButton.setText("打印报表");
panel.add(printButton);
}

private static CategoryDataset createDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();// 创建数据集对象
ResultSet rs = QueryResultSet.gainRecord();// 获得查询结果集
try {
while (rs.next()) {
int value = rs.getInt(1);// 获得平均年龄
String sex = rs.getString(2);// 获得性别
String address = rs.getString(3);// 获得地址
dataset.addValue(value, sex, address);// 向数据集添加数据
}
} catch (SQLException e) {
e.printStackTrace();
}
return dataset;
}

private static JFreeChart createChart(CategoryDataset dataset) {
JFreeChart chart = ChartFactory.createLineChart("\n\n统计来自各城市男女员工的平均年龄", // 图表的标题文本
"所在城市 ", // x轴上的标签文字
"平均年龄", // y轴上的标签文字
dataset, // 数据集
PlotOrientation.VERTICAL, // 垂直方向
true, // 显示图例
true, // 显示说明文字
false // 不生成链接
);
chart.setBackgroundPaint(Color.white);// 设置背景颜色
CategoryPlot plot = (CategoryPlot) chart.getPlot();// 获得图表的CategoryPlot对象
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();// 获得y轴的实例
rangeAxis.setTickLabelFont(new Font("Sans-serif", Font.PLAIN, 12));// 设置y轴显示值的字体
rangeAxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));// 设置y轴上标签文字的字体
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());// 设置y轴显示标准的整数单元
CategoryAxis domainAxis = plot.getDomainAxis();// 获得x轴的实例
domainAxis.setTickLabelFont(new Font("Sans-serif", Font.PLAIN, 12));// 设置x轴显示信息的字体
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));// 设置x轴上标签文字的字体
domainAxis.setCategoryLabelPositions(CategoryLabelPositions
.createUpRotationLabelPositions(Math.PI / 6.0));// 指定x轴上显示信息的位置
TextTitle textTitle = chart.getTitle();// 获得标题对象
textTitle.setFont(new Font("黑体", Font.PLAIN, 20));// 设置标题的字体
chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));// 设置图例文本的字体
chart.getLegend().setHorizontalAlignment(HorizontalAlignment.CENTER);// 设置图例的对齐方式
return chart;
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
printPicture(graphics, pageFormat, pageIndex);// 绘制打印内容
return Printable.PAGE_EXISTS;// 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.translate(10, 10);// 平移绘图上下文
int x = (int) (pf.getImageableX() - 1);// 获得可打印区域的x坐标偏左,用于绘制虚线
int y = (int) (pf.getImageableY() - 1);// 获得可打印区域的y坐标偏上,用于绘制虚线
int width = (int) (pf.getImageableWidth() + 1);// 获得可打印区域的宽度偏右,用于绘制虚线
int height = (int) (pf.getImageableHeight() + 1);// 获得可打印区域的高度偏下,用于绘制虚线
int mw = (int) pf.getWidth();// 获得打印页的宽度
int mh = (int) pf.getHeight();// 获得打印页的高度
g2.drawRect(0, 0, mw, mh);// 绘制实线外框
g2.setColor(new Color(255, 253, 234));// 设置前景色
g2.fillRect(1, 1, mw - 1, mh - 1);// 绘制填充区域
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));// 指定虚线模式
g2.setColor(Color.BLACK);// 设置前景色
g2.drawRect(x, y, width, height);// 绘制虚线内框
g2.setColor(Color.WHITE);// 设置前景色
g2.fillRect(x + 1, y + 1, width - 1, height - 1);// 绘制填充区域
PrintLineReportFrame.this.print(g, pf, 0);// 调用print()方法
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制打印内容
*
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX();// 获得可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY();// 获得可打印区域坐标的Y位置
int w = (int) pageFormat.getImageableWidth();// 获得可打印区域的宽度
Graphics2D g2 = (Graphics2D) graphics;// 转换为Graphics2D对象
ResultSet rs = QueryResultSet.gainReport();// 获得查询结果集
if (rs != null && isPreview) {
g2.setColor(Color.BLUE);// 设置为蓝色
g2.setFont(new Font("华文行楷", Font.BOLD, 40));// 设置字体
g2.drawString("员工基本信息报表", x + 60, y + 50);// 绘制报表标题
g2.setColor(Color.BLACK);// 设置为黑色
g2.setFont(new Font("宋体", Font.PLAIN, 12));// 设置字体
g2.setStroke(new BasicStroke(1f));// 指定实线模式
try {
y = y + 80;// 调整打印位置的y值
int y1 = y;// 保存调整后打印位置的y值
/************** 绘制报表的标题 *******************/
g2.drawLine(x + 10, y - 20, x + w - 10, y - 20);// 绘制水平直线
g2.drawString("编号", x + 20, y);// 绘制报表内容
g2.drawString("姓名", x + 60, y);// 绘制报表内容
g2.drawString("性别", x + 110, y);// 绘制报表内容
g2.drawString("年龄", x + 150, y);// 绘制报表内容
g2.drawString("联系地址", x + 190, y);// 绘制报表内容
g2.drawString("邮政编码", x + 290, y);// 绘制报表内容
g2.drawString("电话号码", x + 360, y);// 绘制报表内容
g2.drawLine(x + 10, y1 - 20, x + 10, y + 10);// 绘制垂直直线
g2.drawLine(x + 50, y1 - 20, x + 50, y + 10);// 绘制垂直直线
g2.drawLine(x + 100, y1 - 20, x + 100, y + 10);// 绘制垂直直线
g2.drawLine(x + 140, y1 - 20, x + 140, y + 10);// 绘制垂直直线
g2.drawLine(x + 180, y1 - 20, x + 180, y + 10);// 绘制垂直直线
g2.drawLine(x + 280, y1 - 20, x + 280, y + 10);// 绘制垂直直线
g2.drawLine(x + 350, y1 - 20, x + 350, y + 10);// 绘制垂直直线
g2.drawLine(x + w - 10, y1 - 20, x + w - 10, y + 10);// 绘制垂直直线
/************************************************/
while (rs.next()) {
y = y + 30;// 调整打印位置的y值
g2.drawLine(x + 10, y - 20, x + w - 10, y - 20);// 绘制水平直线
g2.drawString(String.valueOf(rs.getInt(1)), x + 30, y);// 绘制报表内容
g2.drawString(rs.getString(2), x + 60, y);// 绘制报表内容
g2.drawString(rs.getString(3), x + 110, y);// 绘制报表内容
g2.drawString(String.valueOf(rs.getInt(4)), x + 150, y);// 绘制报表内容
g2.drawString(rs.getString(5), x + 190, y);// 绘制报表内容
g2.drawString(rs.getString(6), x + 290, y);// 绘制报表内容
g2.drawString(rs.getString(7), x + 360, y);// 绘制报表内容
}
g2.drawLine(x + 10, y1 + 10, x + 10, y + 10);// 绘制垂直直线
g2.drawLine(x + 50, y1 + 10, x + 50, y + 10);// 绘制垂直直线
g2.drawLine(x + 100, y1 + 10, x + 100, y + 10);// 绘制垂直直线
g2.drawLine(x + 140, y1 + 10, x + 140, y + 10);// 绘制垂直直线
g2.drawLine(x + 180, y1 + 10, x + 180, y + 10);// 绘制垂直直线
g2.drawLine(x + 280, y1 + 10, x + 280, y + 10);// 绘制垂直直线
g2.drawLine(x + 350, y1 + 10, x + 350, y + 10);// 绘制垂直直线
g2.drawLine(x + w - 10, y1 + 10, x + w - 10, y + 10);// 绘制垂直直线
g2.drawLine(x + 10, y + 30 - 20, x + w - 10, y + 30 - 20);// 绘制水平直线
/********************* 绘制图表图片 *****************************/
URL imgUrl = PrintLineReportFrame.class.getResource("/chartImg/chart.jpg");// 获取图片资源的路径
Image img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图表图片的图像对象
g2.drawImage(img, x + 10, y + 20, 420, 300, this);// 在打印页绘制图表图片

rs.close();// 关闭结果集
} catch (Exception ex) {
ex.printStackTrace();
}
}
isPreview = true; // 设置不可以打印
previewFlag = true;
}

QueryResultSet.java
static {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获得查询结果集
*/
public static ResultSet gainReport() {
Connection conn = null; // 声明连接
Statement st = null; // 声明Statement对象
ResultSet rs = null; // 声明结果集对象
try {
String url = "jdbc:jtds:sqlserver://localhost:1433/db_database"; // 数据库db_database的URL
String username = "sa"; // 数据库的用户名
String password = ""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st = conn.createStatement(); // 创建Statement对象
String sql = "select * from tb_employee"; // 定义SQL查询语句
rs = st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}
/**
* 获得查询结果集
*/
public static ResultSet gainRecord(){
Connection conn=null; // 声明连接
Statement st=null; // 声明Statement对象
ResultSet rs=null; // 声明结果集对象
try {
String url="jdbc:jtds:sqlserver://192.168.1.122:1433/db_database"; // 数据库db_database的URL
String username="sa"; // 数据库的用户名
String password=""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st=conn.createStatement(); // 创建Statement对象
String sql="select avg(age) as avgAge,sex,address from tb_employee group by address,sex"; // 定义SQL查询语句
rs=st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}

实例112 导出报表到Excel表格
ReportToExcelFrame.java
private JTable table;
private String[] title = { "编号", "姓名", "性别", "年龄", "地址", "邮编", "电话" };

/**
* @return JTable表格的标题向量
*/
public Vector getTitleVector() {
Vector titleVec = new Vector();
for (int i = 0; i < title.length; i++) {
titleVec.add(title[i]);
}
return titleVec;
}

/**
* @return JTable表格的内容向量
*/
public Vector getDataVectors() {
ResultSet rs = QueryResultSet.gainRecord();
Vector dataVector = new Vector();
try {
while (rs.next()) {
Vector rowVector = new Vector();
for (int i = 0; i < title.length; i++) {
if (i == 0 || i == 3) {
rowVector.add(rs.getInt(i + 1));
} else {
rowVector.add(rs.getString(i + 1));
}
}
dataVector.add(rowVector);
}
} catch (SQLException e) {
e.printStackTrace();
}
return dataVector;
}

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ReportToExcelFrame frame = new ReportToExcelFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public ReportToExcelFrame() {
super();
setTitle("导出报表到Excel表格");
setBounds(100, 100, 420, 281);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
writeExcel("c:/report.xls");// 调用方法,导出报表到Excel
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
button.setText("导出到Excel");
panel.add(button);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退出系统");
panel.add(button_1);

final JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, BorderLayout.CENTER);

table = new JTable(getDataVectors(), getTitleVector());
scrollPane.setViewportView(table);
//
}

@SuppressWarnings("deprecation")
public void writeExcel(String filename) throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook();// 创建工作簿对象
HSSFSheet sheet = workbook.createSheet("ReportToExcel");// 创建名称为“ReportToExcel”的工作表
HSSFRow row = sheet.createRow(0);// 在工作表中创建行,其行索引为0
HSSFCell cell = null;// 声明单元格
// 导出的报表在Excel中的标题
for (int i = 0; i < title.length; i++) {
cell = row.createCell((short) i);// 创建单元格
cell.setCellType(HSSFCell.CELL_TYPE_STRING);// 设置单元格类型
cell.setCellValue(title[i]);// 设置单元格的内容
}
// 导出的报表在Excel中的内容
ResultSet rs = QueryResultSet.gainRecord();// 获得数据库表的结果集对象
int rowIndex = 1;// 单元格内容的行索引值
try {
while (rs.next()) {// 遍历结果集
row = sheet.createRow(rowIndex);
for (int i = 0; i < title.length; i++) {
String cellContent = "";// 定义存放单元格内容的变量
if (i == 0 || i == 3) {
cellContent = String.valueOf(rs.getInt(i + 1));// 从记录集获得单元格内容
} else {
cellContent = rs.getString(i + 1);// 从记录集获得单元格内容
}
cell = row.createCell((short) i);// 创建单元格对象
cell.setCellType(HSSFCell.CELL_TYPE_STRING);// 设置单元格类型
cell.setCellValue(cellContent);// 指定单元格的值
}
rowIndex++;// 调整单元格内容的行索引值
}
FileOutputStream fout = new FileOutputStream(filename);// 创建导出Excel的输出流
workbook.write(fout);// 将工作簿写入输出流
fout.flush();// 刷新输出流并强制写出所有缓冲的输出字节
fout.close();// 关闭输出流对象
JOptionPane.showMessageDialog(null, "已经成功地将报表\n导出到“C:/report.xls”中。");
} catch (SQLException e) {
e.printStackTrace();
}
}

QueryResultSet.java
static {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* 获得查询结果集
*/
public static ResultSet gainRecord() {
Connection conn = null; // 声明连接
Statement st = null; // 声明Statement对象
ResultSet rs = null; // 声明结果集对象
try {
String url = "jdbc:jtds:sqlserver://localhost:1433/db_database"; // 数据库db_database的URL
String username = "sa"; // 数据库的用户名
String password = ""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st = conn.createStatement(); // 创建Statement对象
String sql = "select * from tb_employee"; // 定义SQL查询语句
rs = st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}

实例113 导出报表到PDF文档
QueryResultSet.java
static {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* 获得查询结果集
*/
public static ResultSet gainRecord() {
Connection conn = null; // 声明连接
Statement st = null; // 声明Statement对象
ResultSet rs = null; // 声明结果集对象
try {
String url = "jdbc:jtds:sqlserver://localhost:1433/db_database"; // 数据库db_database的URL
String username = "sa"; // 数据库的用户名
String password = ""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
st = conn.createStatement(); // 创建Statement对象
String sql = "select * from tb_employee"; // 定义SQL查询语句
rs = st.executeQuery(sql); // 执行SQL语句获得结果集
return rs;// 返回结果集
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常:\n" + e.getMessage());
return null;
}
}

ReportToPdfFrame.java
private JTable table;
private String[] title = { "编号", "姓名", "性别", "年龄", "地址", "邮编", "电话" };

/**
* @return JTable表格的标题向量
*/
public Vector getTitleVector() {
Vector titleVec = new Vector();
for (int i = 0; i < title.length; i++) {
titleVec.add(title[i]);
}
return titleVec;
}

/**
* @return JTable表格的内容向量
*/
public Vector getDataVectors() {
ResultSet rs = QueryResultSet.gainRecord();
Vector dataVector = new Vector();
try {
while (rs.next()) {
Vector rowVector = new Vector();
for (int i = 0; i < title.length; i++) {
if (i == 0 || i == 3) {
rowVector.add(rs.getInt(i + 1));
} else {
rowVector.add(rs.getString(i + 1));
}
}
dataVector.add(rowVector);
}
} catch (SQLException e) {
e.printStackTrace();
}
return dataVector;
}

public void toPdf() {
try {
Document document = new Document(PageSize.A4, 71.4f, 71.4f, 71.4f, 71.4f);// 定义文档以A4纸张的格式打印
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream("c:\\report.pdf"));// 设置输出的位置及文件名
document.open();// 打开文档
BaseFont bfChinese = BaseFont.createFont("STSong-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 定义基本字体
Font titleFont = new Font(bfChinese, 12, Font.BOLD);// 定义加粗字体,用于设置表格标题的字体
Font contentFont = new Font(bfChinese, 12);// 定义普通字体
PdfPCell cell = null;// 定义PDF单元格
PdfPTable table = new PdfPTable(new float[] { 40.9f, 40.9f, 40.9f,
40.9f, 79.1f, 40.9f, 79.1f });// 建立一个7列的pdf表格
table.setTotalWidth(460);// 设置表格的宽度为460
table.setLockedWidth(true);// 锁定表格的宽度
for (int i = 0; i < title.length; i++) {
cell = new PdfPCell(new Paragraph(title[i], titleFont));// 创建单元格对象
cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 单元格内容水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);// 单元格内容垂直居中
cell.setFixedHeight(20.0f);// 设置单元格的高度
table.addCell(cell);// 为表格添加单元格
}

ResultSet rs = QueryResultSet.gainRecord();// 获得数据库表的结果集对象
while (rs.next()) {// 遍历结果集
for (int i = 0; i < title.length; i++) {
String cellContent = "";// 定义存放单元格内容的变量
if (i == 0 || i == 3) {
cellContent = String.valueOf(rs.getInt(i + 1));// 从记录集获得单元格内容
} else {
cellContent = rs.getString(i + 1);// 从记录集获得单元格内容
}
cell = new PdfPCell(new Paragraph(cellContent, contentFont));// 创建单元格对象
if (i == 6) {
cell.setBorderWidthRight(0.01f);// 单元格右边框的宽度
} else {
cell.setBorderWidthRight(0f);// 单元格右边框的宽度
}
cell.setBorderWidthTop(0f);// 单元格上边框的宽度
cell.setBorderWidthBottom(0.01f);// 单元格下边框的宽度
cell.setFixedHeight(20.0f);// 单元格的高度
table.addCell(cell);// 为表格添加单元格
}
}
titleFont = new Font(bfChinese, 36, Font.BOLD);// 定义加粗字体,用于设置标题的字体
Paragraph pdfTitle = new Paragraph("员工基本信息报表\n\n", titleFont);// 创建用于指定标题的Paragraph对象
pdfTitle.setAlignment(Element.ALIGN_CENTER);// 居中Paragraph对象
document.add(pdfTitle);// 为PDF文档添加标题
document.add(table);// 为PDF文档添加表格
document.close();// 关闭文档
JOptionPane.showMessageDialog(null, "已经成功地将报表\n导出到“C:/report.pdf”中。");
} catch (Exception e2) {
e2.printStackTrace();
}
}

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ReportToPdfFrame frame = new ReportToPdfFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public ReportToPdfFrame() {
super();
setTitle("导出报表到PDF文档");
setBounds(100, 100, 383, 264);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, BorderLayout.CENTER);
table = new JTable(getDataVectors(), getTitleVector());
scrollPane.setViewportView(table);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
toPdf();
}
});
button.setText("导出为PDF");
panel.add(button);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退出系统");
panel.add(button_1);
//
}

实例114 批量打印条形码
PrintCodingFrame.java
private JTextField textField;
private CodePanel codePanel;
public static PrintCodingFrame frame;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
frame = new PrintCodingFrame();
frame.setVisible(true);
}

/**
* Create the frame
*/
public PrintCodingFrame() {
super();
setTitle("批量打印条形码");
setBounds(100, 100, 760, 520);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane);

final JPanel panel = new JPanel();
scrollPane.setViewportView(panel);

codePanel = new CodePanel();
panel.add(codePanel);

final JPanel panel_1 = new JPanel();
getContentPane().add(panel_1, BorderLayout.SOUTH);

final JLabel label = new JLabel();
label.setText("输入13位以内的编号:");
panel_1.add(label);

textField = new JTextField();
textField.addCaretListener(new CaretListener() {
public void caretUpdate(final CaretEvent arg0) {
String text = textField.getText();// 获取文本框内容
Component[] codes = codePanel.getComponents();// 获取面板所有组件
for (Component component : codes) {// 遍历组件数组
if (component instanceof JBarcodeBean) {// 如果组件是条形码组件
JBarcodeBean bean = (JBarcodeBean) component;// 强制转换为条形码对象
bean.setCode(text);// 设置组件的编码
}
}
codePanel.repaint();
}
});
textField.setColumns(15);
panel_1.add(textField);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 创建打印预览对话框
PreviewDialog dialog = new PreviewDialog(PrintCodingFrame.this, true);
dialog.setSize(600, 400);// 设置对话框大小
dialog.setVisible(true);// 显示对话框
}
});
button_1.setText("打印预览");
panel_1.add(button_1);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
codePanel.pageSetup();// 调用页面设置方法
}
});
button.setText("页面设置");
panel_1.add(button);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
codePanel.doPrint();// 调用打印方法
}
});
button_2.setText("打印");
panel_1.add(button_2);
//
}

public CodePanel getCodePanel() {
return codePanel;
}

PreviewDialog.java
private static PrintCodingFrame frame;
private CodePanel codePanel;

/**
* Create the panel
*/
private PreviewDialog() {
super();
}

public PreviewDialog(PrintCodingFrame frame) {
super(frame);
this.frame = frame;
codePanel = frame.getCodePanel();// 获取条形码面板
}
public PreviewDialog(PrintCodingFrame frame,boolean modal) {
super(frame,modal);
setTitle("打印预览");
this.frame = frame;
codePanel = frame.getCodePanel();// 获取条形码面板
}

@Override
public int print(Graphics graphics, PageFormat pf, int pageIndex)
throws PrinterException {// 实现Printable接口的方法
if(pageIndex>0)// 只打印1页
return Printable.NO_SUCH_PAGE;
Graphics2D g = (Graphics2D) graphics;
int px = (int) pf.getImageableX();// 获取可打印区域
int py = (int) pf.getImageableY();
int pw = (int) pf.getImageableWidth();
int ph = (int) pf.getImageableHeight();
int width = (int) pf.getWidth();// 获取页面大小
int height = (int) pf.getHeight();
setSize(new Dimension(width, height));// 设置组件与页面大小相同

g.setColor(Color.WHITE);
g.fill3DRect(0, 0, width, height, true);// 使用白色绘制纸张界面
g.translate(px, py);
g.setClip(0, 0, pw, ph);
codePanel.print(g);// 绘制条形码界面
return Printable.PAGE_EXISTS;
}

@Override
public void paint(Graphics g) {// 重新绘制界面的方法
try {
print(g,codePanel.getFormat(),0);// 调用print()方法
} catch (PrinterException e) {
e.printStackTrace();
}
}

public static Printable getPage(){
return new PreviewDialog(PrintCodingFrame.frame);
}

CodePanel.java
private PageFormat format;// 定义页面格式
private PrinterJob job = PrinterJob.getPrinterJob();// 获得打印任务

/**
* Create the panel
*/
public CodePanel() {
super();
setBackground(Color.WHITE);
final GridLayout gridLayout = new GridLayout(0, 3);
gridLayout.setHgap(-2);
setLayout(gridLayout);
format = new PageFormat();
format.setOrientation(PageFormat.LANDSCAPE);

final JBarcodeBean barcodeBean_9 = new JBarcodeBean();// 创建条形码对象
barcodeBean_9.setBorder(new TitledBorder(null, "Code 11 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));// 设置条形码的边框
barcodeBean_9.setShowText(true);// 设置显示条形码上的编码
barcodeBean_9.setCodeType(new jbarcodebean.Code11());// 设置条形码的类型
add(barcodeBean_9);

final JBarcodeBean barcodeBean = new JBarcodeBean();
barcodeBean.setBorder(new TitledBorder(null, "Code 128 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean.setAngleDegrees(0);
barcodeBean.setCodeType(new jbarcodebean.Code128());
barcodeBean.setShowText(true);
add(barcodeBean);

final JBarcodeBean barcodeBean_1 = new JBarcodeBean();
barcodeBean_1.setBorder(new TitledBorder(null, "Code 39 3:1 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_1.setShowText(true);
add(barcodeBean_1);

final JBarcodeBean barcodeBean_2 = new JBarcodeBean();
barcodeBean_2.setBorder(new TitledBorder(null, "Code 39 2:1 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_2.setShowText(true);
barcodeBean_2.setCodeType(new jbarcodebean.Code39_2to1());
add(barcodeBean_2);

final JBarcodeBean barcodeBean_3 = new JBarcodeBean();
barcodeBean_3.setShowText(true);
barcodeBean_3.setBorder(new TitledBorder(null, "Ext Code 39 3:1 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_3.setCodeType(new jbarcodebean.ExtendedCode39());
add(barcodeBean_3);
barcodeBean_3.setPreferredSize(new Dimension(barcodeBean_3.getWidth(),
0));

final JBarcodeBean barcodeBean_4 = new JBarcodeBean();
barcodeBean_4.setBorder(new TitledBorder(null, "Ext Code 39 2:1 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_4.setShowText(true);
barcodeBean_4.setCodeType(new jbarcodebean.ExtendedCode39_2to1());
add(barcodeBean_4);

final JBarcodeBean barcodeBean_5 = new JBarcodeBean();
barcodeBean_5.setBorder(new TitledBorder(null, "Code 93 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_5.setShowText(true);
barcodeBean_5.setCodeType(new jbarcodebean.Code93());
add(barcodeBean_5);

final JBarcodeBean barcodeBean_6 = new JBarcodeBean();
barcodeBean_6.setBorder(new TitledBorder(null, "Code 93 Extended 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_6.setShowText(true);
barcodeBean_6.setCodeType(new jbarcodebean.Code93Extended());
add(barcodeBean_6);

final JBarcodeBean barcodeBean_7 = new JBarcodeBean();
barcodeBean_7.setBorder(new TitledBorder(null, "Interleaved 25 3:1 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_7.setShowText(true);
barcodeBean_7.setCodeType(new jbarcodebean.Interleaved25());
add(barcodeBean_7);

final JBarcodeBean barcodeBean_8 = new JBarcodeBean();
barcodeBean_8.setBorder(new TitledBorder(null, "Interleaved 25 2:1 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_8.setShowText(true);
barcodeBean_8.setCodeType(new jbarcodebean.Interleaved25_2to1());
add(barcodeBean_8);

final JBarcodeBean barcodeBean_10 = new JBarcodeBean();
barcodeBean_10.setBorder(new TitledBorder(null,
"MSI (mod 10 check) 编码", TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
add(barcodeBean_10);
barcodeBean_10.setShowText(true);
barcodeBean_10.setCodeType(new jbarcodebean.MSI());

final JBarcodeBean barcodeBean_11 = new JBarcodeBean();
barcodeBean_11.setBorder(new TitledBorder(null, "Codabar 3:1 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_11.setShowText(true);
barcodeBean_11.setCodeType(new jbarcodebean.Codabar());
add(barcodeBean_11);

final JBarcodeBean barcodeBean_12 = new JBarcodeBean();
barcodeBean_12.setBorder(new TitledBorder(null, "Codabar 2:1 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
barcodeBean_12.setShowText(true);
barcodeBean_12.setCodeType(new jbarcodebean.Codabar_2to1());
add(barcodeBean_12);

final JBarcodeBean barcodeBean_13 = new JBarcodeBean();
barcodeBean_13.setBorder(new TitledBorder(null, "EAN-13 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
add(barcodeBean_13);
barcodeBean_13.setShowText(true);
barcodeBean_13.setCodeType(new jbarcodebean.Ean13());

final JBarcodeBean barcodeBean_14 = new JBarcodeBean();
barcodeBean_14.setBorder(new TitledBorder(null, "EAN-8 编码",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
add(barcodeBean_14);
barcodeBean_14.setShowText(true);
barcodeBean_14.setCodeType(new jbarcodebean.Ean8());
//
}

/**
* 页面设置的方法
*/
public void pageSetup() {
if (job != null) {
format = job.pageDialog(format);// 打开页面设置对话框
repaint();// 重新绘制界面
}
}

/**
* 执行打印操作的方法
*/
public void doPrint() {
if (job != null) {
try {
if (job.printDialog()) {// 如果用户确认打印
job.setJobName("批量条形码打印");// 设置打印任务名称
Printable page = PreviewDialog.getPage();// 获取页面对象
job.setPrintable(page);// 设置打印页面
job.print();// 执行打印
}
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

public PageFormat getFormat() {
return format;// 获得页面格式
}

实例115 相册特效打印程序
MainFrame.java
private JTextField filePath;
private String border = ""; // 边框类型
private PageFormat pf; // 描述页面大小和方向的对象
private PreviewCanvas canvas; // 打印预览画布
private File imgFile = null; // 相片文件
private Image src;// 相片图片
private boolean isPreview = false; // 是否可以打印

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
MainFrame frame = new MainFrame();
frame.setVisible(true);
}

/**
* Create the frame
*/
public MainFrame() {
super();
setTitle("相册特效打印程序");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
pf.setOrientation(PageFormat.LANDSCAPE);
canvas = new PreviewCanvas();

this.setSize(new Dimension(840, 780));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel_1 = new JPanel();
panel_1.setPreferredSize(new Dimension(0, 80));
panel_1.setLayout(null);
getContentPane().add(panel_1, BorderLayout.NORTH);

final JLabel label = new JLabel();
label.setBounds(50, 15, 130, 18);
label.setText("请选择要打印的相片:");
panel_1.add(label);

filePath = new JTextField();
filePath.setBounds(186, 12, 502, 24);
filePath.setPreferredSize(new Dimension(300, 24));
panel_1.add(filePath);
// 选择文件按钮
final JButton selectButton = new JButton();
selectButton.setBounds(694, 10, 86, 28);
selectButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");
fileChooser.setFileFilter(filter);
int i = fileChooser.showOpenDialog(getContentPane());
if (i == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中的图片对象
filePath.setText(imgFile.getAbsolutePath()); // 显示图片路径
}
}
});
selectButton.setText("选择文件");
panel_1.add(selectButton);

final ImgLabel imgLabel1 = new ImgLabel();
imgLabel1.addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON1_MASK) { // 按下鼠标左键
border = "border1"; // 设置边框类型
if (imgFile != null) {
isPreview = true; // 表示可以打印
canvas.repaint(); // 重绘画布
} else {
JOptionPane.showMessageDialog(null, "请先选择要打印的图片!");
}
}
}
});
imgLabel1.setIcon(SwingResourceManager.getIcon(MainFrame.class,
"/com/zzk/border1.png"));
imgLabel1.setBounds(186, 42, 86, 35);
panel_1.add(imgLabel1);

final ImgLabel imgLabel2 = new ImgLabel();
imgLabel2.addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON1_MASK) { // 按下鼠标左键
border = "border2"; // 设置边框类型
if (imgFile != null) {
isPreview = true; // 表示可以打印
canvas.repaint(); // 重绘画布
} else {
JOptionPane.showMessageDialog(null, "请先选择要打印的图片!");
}
}
}
});
imgLabel2.setIcon(SwingResourceManager.getIcon(MainFrame.class,
"/com/zzk/border2.png"));
imgLabel2.setBounds(289, 42, 86, 35);
panel_1.add(imgLabel2);

final JLabel label_1 = new JLabel();
label_1.setText("选择边框观看预览效果:");
label_1.setBounds(37, 50, 143, 18);
panel_1.add(label_1);

final JButton pageSetButton = new JButton();
pageSetButton.setBounds(602, 43, 86, 28);
panel_1.add(pageSetButton);
pageSetButton.addActionListener(new ActionListener() {
//
/*
* “页面设置”按钮的单击事件
* @see
* java.awt.event.ActionListener#actionPerformed(java.awt.event.
* ActionEvent)
*/
public void actionPerformed(final ActionEvent e) {
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob类的实例
pf = job.pageDialog(pf); // 打开页面设置对话框
isPreview = true; // 表示可以打印
canvas.repaint(); // 重绘画面
}
});
pageSetButton.setText("页面设置");

final JButton printButton = new JButton();
printButton.setBounds(694, 43, 86, 28);
panel_1.add(printButton);
printButton.addActionListener(new ActionListener() {
/*
* “开始打印”按钮的单击事件
* @see
* java.awt.event.ActionListener#actionPerformed(java.awt.event.
* ActionEvent)
*/
public void actionPerformed(final ActionEvent e) {
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob对象的实例
if (!job.printDialog())
return;
// 设置打印内容
job.setPrintable(new Printable() {

@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
isPreview = true; // 设置可以打印
if (pageIndex < 1) {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS; // 返回PAGE_EXISTS
} else {
return Printable.NO_SUCH_PAGE; // 返回NO_SUCH_PAGE
}
}

});
job.setJobName("打印相片"); // 设置打印文档的名称
try {
job.print(); // 开始打印
} catch (PrinterException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

}
});

printButton.setText("开始打印");

final ImgLabel imgLabel3 = new ImgLabel();
imgLabel3.addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON1_MASK) { // 按下鼠标左键
border = "border3"; // 设置边框类型
if (imgFile != null) {
isPreview = true; // 表示可以打印
canvas.repaint(); // 重绘画布
} else {
JOptionPane.showMessageDialog(null, "请先选择要打印的图片!");
}
}
}
});
imgLabel3.setIcon(SwingResourceManager.getIcon(MainFrame.class,
"/com/zzk/border3.png"));
imgLabel3.setBounds(393, 42, 86, 35);
panel_1.add(imgLabel3);

final ImgLabel imgLabel4 = new ImgLabel();
imgLabel4.addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON1_MASK) { // 按下鼠标左键
border = "border4"; // 设置边框类型
if (imgFile != null) {
isPreview = true; // 表示可以打印
canvas.repaint(); // 重绘画布
} else {
JOptionPane.showMessageDialog(null, "请先选择要打印的图片!");
}
}
}
});
imgLabel4.setIcon(SwingResourceManager.getIcon(MainFrame.class,
"/com/zzk/border4.PNG"));
imgLabel4.setText("New ImgLabel");
imgLabel4.setBounds(497, 42, 86, 35);
panel_1.add(imgLabel4);

//
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
// TODO Auto-generated method stub
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS; // 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g; // 获取Graphics2D对象
g2.translate(10, 10); // 将原点坐标平移10个象素
int x = (int) (pf.getImageableX() - 1); // 获取可打印区域起始点的x轴坐标
int y = (int) (pf.getImageableY() - 1); // 获取可打印区域起始点的y轴坐标
int width = (int) (pf.getImageableWidth() + 1); // 获取可打印区域结束点的x轴坐标
int height = (int) (pf.getImageableHeight() + 1); // 获取可打印区域结束点的y轴坐标
int mw = (int) pf.getWidth(); // 获取页面宽度
int mh = (int) pf.getHeight();// 获取页面高度
g2.drawRect(0, 0, mw, mh);
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f)); // 设置线条的样式
g2.drawRect(x, y, width, height); // 绘制矩形边框
g2.setColor(Color.WHITE); // 设置前景色
g2.fillRect(x + 1, y + 1, width - 1, height - 1); // 绘制白色背景的矩形
MainFrame.this.print(g, pf, 0);
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制打印内容
*
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX(); // 获取可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY(); // 获取可打印区域坐标的Y位置
Graphics2D g2 = (Graphics2D) graphics;
if (imgFile != null && isPreview) {
try {
src = ImageIO.read(imgFile);// 构造Image对象
} catch (IOException e) {
e.printStackTrace();
}
double imgWidth = src.getWidth(this); // 获取图片的宽
double imgHeight = src.getHeight(this); // 获取图片的高
double percent = imgWidth / imgHeight; // 长宽比例
int mw = (int) pf.getWidth() - x * 2; // 计算可打印区域的宽
int mh = (int) pf.getHeight() - y * 2; // 计算可打印区域的高
if (imgWidth > mw) { // 如果宽大于可打印区域
imgWidth = mw;
imgHeight = mw * percent;
}
if (imgHeight > mh) { // 如果高大于可打印区域
imgHeight = mh;
imgWidth = mh * percent;
}
g2.drawImage(src, x, y, (int) imgWidth, (int) imgHeight, this); // 绘制正常图像,如图片、照片等
/********************* 绘制边框 *************************/
if (!border.equals("")) {
ImageIcon icon = SwingResourceManager.getIcon(MainFrame.class,
"/com/zzk/" + border + ".png"); // 获取ImageIcon对象
Image borderImg = icon.getImage(); // 获取用于绘制边框的Image对象
g2.drawImage(borderImg, x, y, (int) imgWidth, (int) imgHeight,
this); // 绘制边框
}
/*****************************************************/
}
isPreview = false; // 设置不可以打印
}

ImgLabel.java
public ImgLabel() {
super();
}
@Override
public void paint(Graphics g) {
try {
int width = this.getWidth(); // 获取图片宽度
int height = this.getHeight(); // 获取图片高度
ImageIcon icon = (ImageIcon) getIcon(); // 获取ImageIcon对象
if (icon != null) {// 图片不为空
g.drawImage(icon.getImage(), 0, 0, width, height, this); // 绘制图片
}
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
}

实例116 镜面效果文本打印
PrintReverseTextFrame.java
private PrinterJob job;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PrintReverseTextFrame frame = new PrintReverseTextFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public PrintReverseTextFrame() {
super();
setTitle("镜面效果文本打印");
job = PrinterJob.getPrinterJob();

setBounds(100, 100, 800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBorder(new BevelBorder(BevelBorder.LOWERED));
getContentPane().add(scrollPane);

final JPanel panel_1 = new JPanel();
final FlowLayout flowLayout = new FlowLayout();
flowLayout.setVgap(20);
flowLayout.setHgap(20);
panel_1.setLayout(flowLayout);
scrollPane.setViewportView(panel_1);

final PrintPanel printPanel = new PrintPanel();
printPanel.setLayout(null);
panel_1.add(printPanel);
printPanel.setBorder(new LineBorder(Color.ORANGE, 2, false));
printPanel.setName("printPanel");

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JToggleButton reverseBtn = new JToggleButton();
reverseBtn.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
boolean reverse = reverseBtn.isSelected();
printPanel.setReverse(reverse);// 重新绘制打印面板
}
});
reverseBtn.setText("镜面效果/还原");
panel.add(reverseBtn);

final JButton pageSetBtn = new JButton();
pageSetBtn.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (job != null) {// 如果打印对象不为NULL
printPanel.pageSet(job);// 调用打印面板的页面设置方法
}
}
});
pageSetBtn.setText("页面设置");
panel.add(pageSetBtn);

final JButton printBtn = new JButton();
printBtn.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
boolean print = job.printDialog();// 显示打印对话框
if (print) {// 如果用户确认打印
try {
job.setJobName("打印桌面图片");// 设置打印任务名称
job.setPrintable(printPanel);// 设置打印页面为打印面板
job.print();// 开始打印任务
} catch (PrinterException e1) {
e1.printStackTrace();
}
}
}
});
printBtn.setText("打印");
panel.add(printBtn);
//
}

PrintPanel.java
private PageFormat pageFormat;// 打印格式对象
private JTextArea textArea;// 文本域组件
private int px;// 可打印区域的水平坐标
private int py;// 可打印区域的垂直坐标
private int pwidth;// 可打印区域的宽度
private int pheight;// 可打印区域的高度
private boolean reverse = false;// 是否反转

/**
* 构造方法
*/
public PrintPanel() {
super();
setLayout(null);
pageFormat = new PageFormat();// 创建页面格式对象
pageFormat.setOrientation(PageFormat.LANDSCAPE);// 设置横向页面
textArea = new JTextArea();// 创建文本域组件
textArea.setBackground(new Color(250, 250, 250));
textArea.setBounds(200, 5, 100, 54);
textArea.setLineWrap(true);// 自动换行
textArea.setOpaque(false);
// 设置初识文本
textArea.setText("请在这里输入要打印的文本,单击镜面效果按钮可以看效果,打印按钮将以当前效果打印。");
add(textArea);
setVisible(true);// 显示窗体
}

@Override
protected void paintComponent(Graphics g1) {
Graphics2D g = (Graphics2D) g1;
super.paintComponent(g);// 绘制原有组件内容
try {
print(g, pageFormat, 0);// 调用打印方法绘制面板界面
} catch (PrinterException e) {
e.printStackTrace();
}
}

@Override
public int print(Graphics g1, PageFormat pageFormat, int pageIndex)
throws PrinterException {
Graphics2D g = (Graphics2D) g1;
px = (int) pageFormat.getImageableX();// 获取可打印区域的x坐标
py = (int) pageFormat.getImageableY();// 获取可打印区域的y坐标
pwidth = (int) pageFormat.getImageableWidth();// 获取可打印的宽度
pheight = (int) pageFormat.getImageableHeight();// 获取可打印的高度
textArea.setBounds(px, py, pwidth, pheight);// 设置文本域组件大小
int pageWidth = (int) pageFormat.getWidth();// 获取打印页面宽度
int pageHeight = (int) pageFormat.getHeight();// 获取打印页面高度
Dimension preferredSize = new Dimension(pageWidth, pageHeight);
setPreferredSize(preferredSize);// 设置面板大小
getParent().doLayout();// 重写布局父容器
g.setColor(Color.WHITE);// 设置前景色为白色
g.fill3DRect(0, 0, pageWidth, pageHeight, true);// 绘制与打印页面相同大小的矩形
if (pageIndex < 1 && textArea != null && reverse) {// 如果当前打印页数小于1并且开启镜面效果
BufferedImage image = new BufferedImage(pwidth - px, pheight - py,
BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
Graphics2D graphics = image.createGraphics();// 获取图片对象的绘图上下文
graphics.setColor(Color.WHITE);// 设置前景色为白色
graphics.fillRect(0, 0, image.getWidth(), image.getHeight());// 使用白色填充界面
graphics.setColor(Color.BLACK);// 设置前景色为黑色
Font font = textArea.getFont();// 获取文本域组件的字体对象
graphics.setFont(font);// 把字体对象设置给图片的绘图上下文
textArea.print(graphics);// 把文本域界面绘制到缓冲图像对象上
image.flush();// 刷新图片绘图缓冲区
g.drawImage(image, px, py, pwidth, pheight, image.getWidth(), 0, 0,
image.getHeight(), this);// 反向绘制打印内容,实现镜面效果
return Printable.PAGE_EXISTS;// 返回可打印标识
} else {// 否则
return Printable.NO_SUCH_PAGE;// 返回不支持打印标识
}
}

public void setReverse(boolean reverse) {
this.reverse = reverse;
if (reverse) {
textArea.setVisible(false);
textArea.setEditable(false);
} else {
textArea.setVisible(true);
textArea.setEditable(true);
}
}

public void pageSet(PrinterJob job) {
pageFormat = job.pageDialog(pageFormat);// 打开页面设置对话框
repaint();// 重新绘制界面
}

public boolean isReverse() {
return reverse;
}

实例117 透明的打印预览对话框
private JTextField filePath;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
MainFrame frame = new MainFrame();// 创建窗体对象
AWTUtilities.setWindowOpacity(frame, 0.8f); // 设置窗体80%透明
frame.setVisible(true);// 显示窗体
}

private PageFormat pf;
private PreviewCanvas canvas;
private File imgFile = null;
private Image src;
private boolean isPreview = false; // 是否可以打印

/**
* Create the frame
*/
public MainFrame() {
super();
getContentPane().setBackground(new Color(70, 130, 180));
setTitle("透明的打印预览对话框");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pf = new PageFormat();
pf.setOrientation(PageFormat.LANDSCAPE);
canvas = new PreviewCanvas();

this.setSize(new Dimension(840, 750));
BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(10);
setLayout(borderLayout);
add(canvas, BorderLayout.CENTER);

final JPanel panel = new JPanel();
panel.setOpaque(false);
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton previewButton = new JButton();
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打印预览
if (imgFile != null) {
isPreview = true; // 表示可以打印
PrinterJob job = PrinterJob.getPrinterJob();
pf = job.pageDialog(pf);
canvas.repaint();
} else {
JOptionPane.showMessageDialog(null, "请先选择要打印的图片!");
}
}
});
previewButton.setText("打印预览");
panel.add(previewButton);

final JButton printButton = new JButton();
printButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
PrinterJob job = PrinterJob.getPrinterJob(); // 获取PrinterJob对象的实例
if (!job.printDialog())
return;
// 设置打印内容
job.setPrintable(new Printable() {

@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
isPreview = true; // 设置可以打印
if (pageIndex < 1) {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}

});
job.setJobName("打印图形");
try {
job.print();
} catch (PrinterException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

}
});

printButton.setText("开始打印");
panel.add(printButton);

final JPanel panel_1 = new JPanel();
panel_1.setOpaque(false);
getContentPane().add(panel_1, BorderLayout.NORTH);

final JLabel label = new JLabel();
label.setText("请选择要打印的图片:");
panel_1.add(label);

filePath = new JTextField();
filePath.setPreferredSize(new Dimension(300, 24));
panel_1.add(filePath);
// 选择文件按钮
final JButton selectButton = new JButton();
selectButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");
fileChooser.setFileFilter(filter);
int i = fileChooser.showOpenDialog(getContentPane());
if (i == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中的图片对象
filePath.setText(imgFile.getAbsolutePath()); // 显示图片路径
}
}
});
selectButton.setText("选择文件");
panel_1.add(selectButton);
// setGlassPane(getContentPane());
//
}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
printPicture(graphics, pageFormat, pageIndex); // 绘制打印内容
return Printable.PAGE_EXISTS; // 返回PAGE_EXISTS
}

// 画布
class PreviewCanvas extends Canvas {
public void paint(Graphics g) {
try {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.translate(10, 10);
int x = (int) (pf.getImageableX() - 1);
int y = (int) (pf.getImageableY() - 1);
int width = (int) (pf.getImageableWidth() + 1);
int height = (int) (pf.getImageableHeight() + 1);
int mw = (int) pf.getWidth();
int mh = (int) pf.getHeight();
g2.setColor(new Color(255, 253, 234)); // 设置前景色
g2.fillRect(1, 1, mw - 1, mh - 1);
g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));
g2.setColor(Color.BLACK); // 设置前景色
g2.drawRect(x, y, width, height);
g2.setColor(Color.WHITE); // 设置前景色
g2.fillRect(x + 1, y + 1, width - 1, height - 1);
MainFrame.this.print(g, pf, 0);
} catch (PrinterException e) {
e.printStackTrace();
}
}
}

/**
* 绘制打印内容
*
* @param graphics
* @param pageFormat
* @param pageIndex
*/
public void printPicture(Graphics graphics, PageFormat pageFormat,
int pageIndex) {
int x = (int) pageFormat.getImageableX(); // 获取可打印区域坐标的X位置
int y = (int) pageFormat.getImageableY(); // 获取可打印区域坐标的Y位置
Graphics2D g2 = (Graphics2D) graphics;
if (imgFile != null && isPreview) {
try {
src = ImageIO.read(imgFile);// 构造Image对象
} catch (IOException e) {
e.printStackTrace();
}

double imgWidth = src.getWidth(this);
double imgHeight = src.getHeight(this);
double percent = imgWidth / imgHeight; // 长宽比例
int mw = (int) pf.getWidth() - x * 2;
int mh = (int) pf.getHeight() - y * 2;
if (imgWidth > mw) { // 如果宽大于可打印区域
imgWidth = mw;
imgHeight = mw * percent;
}
if (imgHeight > mh) { // 如果高大于可打印区域
imgHeight = mh;
imgWidth = mh * percent;
}
g2.drawImage(src, x, y, (int) imgWidth, (int) imgHeight, this); // 绘制正常图像
}
isPreview = false; // 设置不可以打印
}

第6章 管理图像文件
6.1 图像的修改与保存
实例118 保存图片文件
private Image img = null; // 声明图像对象
private DrawImagePanel imagePanel = null; // 声明图像面板对象

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SaveImageFrame frame = new SaveImageFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public SaveImageFrame() {
super();
setTitle("保存图片文件"); // 设置窗体标题
setBounds(200, 160, 316, 237); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
URL imgUrl = SaveImageFrame.class.getResource("/img/image.jpg");// 获取图片资源的路径
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图像资源
imagePanel = new DrawImagePanel(); // 创建图像面板对象
add(imagePanel); // 在窗体上添加图像面板对象

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
BufferedImage bufferImage = new BufferedImage(img
.getWidth(SaveImageFrame.this), img
.getHeight(SaveImageFrame.this),
BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
Graphics g = bufferImage.getGraphics();// 获得绘图上下文对象
g.drawImage(img, 0, 0, null);// 在缓冲图像上绘制图像
try {
ImageIO.write(bufferImage, "jpg", new File("c:/image.jpg"));// 将缓冲图像保存到磁盘
JOptionPane.showMessageDialog(null,
"已将图片image.jpg\n成功地保存到C:盘");// 显示提示信息
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
button.setText("保存图片");
panel.add(button);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
panel.add(button_1);
//
}

// 创建面板类
class DrawImagePanel extends JPanel {
public void paint(Graphics g) {
g.drawImage(img, 0, 0, this); // 绘制指定的图片
}
}

实例119 修改图片文件名
private JTextField tf_newFileName;
private JTextField tf_fileName;
private File imgFile = null;
private BufferedImage src;
private String path = null;// 图片的路径
private String fileName = null;// 原图片的文件名
private DrawImagePanel imagePanel = null; // 声明图像面板对象

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
RenameImageFrame frame = new RenameImageFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public RenameImageFrame() {
super();
setTitle("修改图片文件名"); // 设置窗体标题
setBounds(200, 160, 391, 288); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
imagePanel = new DrawImagePanel(); // 创建图像面板对象
add(imagePanel); // 在窗体上添加图像面板对象

final JPanel panel = new JPanel();
final FlowLayout flowLayout = new FlowLayout();
flowLayout.setAlignment(FlowLayout.LEFT);
panel.setLayout(flowLayout);
getContentPane().add(panel, BorderLayout.NORTH);

final JLabel label_1 = new JLabel();
label_1.setText("选择图片:");
panel.add(label_1);

tf_fileName = new JTextField();
tf_fileName.setPreferredSize(new Dimension(200, 25));
panel.add(tf_fileName);

final JButton button_2 = new JButton();
panel.add(button_2);
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");// 创建过滤器
fileChooser.setFileFilter(filter);// 设置过滤器
int i = fileChooser.showOpenDialog(null);// 显示打开对话框
if (i == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中图片的File对象
path = imgFile.getParent();// 获得图片的路径
fileName = imgFile.getName();// 获得原图片文件名
tf_fileName.setText(path + "\\" + fileName);// 在文本框中显示图片的完整路径
}
if (imgFile != null) {
try {
src = ImageIO.read(imgFile);// 构造BufferedImage对象
} catch (IOException ex) {
ex.printStackTrace();
}
}
imagePanel.repaint();// 调用paint方法
}
});
button_2.setText("选择图片");

final JPanel panel_1 = new JPanel();
getContentPane().add(panel_1, BorderLayout.SOUTH);

final JLabel label = new JLabel();
label.setText("输入新文件名:");
panel_1.add(label);

tf_newFileName = new JTextField();
tf_newFileName.setPreferredSize(new Dimension(160, 25));
panel_1.add(tf_newFileName);

final JButton button = new JButton();
panel_1.add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (path != null && fileName != null) {
String newName = tf_newFileName.getText().trim();// 获得新输入的文件名
if (newName.indexOf(":") >= 0 || newName.indexOf("\\") >= 0) {// 判断文件名是否包含路径
JOptionPane.showMessageDialog(null, "请直接输入新文件名。\n不需要指定路径。");
return;
} else if (newName.equals("")) {// 如果没有输入文件名则进行提示
JOptionPane.showMessageDialog(null, "请输入新文件名。");
return;
} else {
if (newName.indexOf(".") > 0) {
imgFile.renameTo(new File(path + "\\" + newName));// 新文件名带扩展名
} else {
imgFile.renameTo(new File(path + "\\" + newName + fileName.substring(fileName.indexOf("."))));// 新文件名不带扩展名
}
}
JOptionPane.showMessageDialog(null, "修改成功。");
}
}
});
button.setText("重命名图片");
}

// 创建面板类
class DrawImagePanel extends JPanel {
public void paint(Graphics g) {
g.drawImage(src, 0, 0, getWidth(), getHeight(), this); // 绘制指定的图片
}
}

实例120 缩放图片并保存
private JButton button_3;
private JButton button_2;
private JButton button_1;
private JButton button;
private JPanel panel;
private Image img = null; // 声明图像对象
private ZoomImagePanel imagePanel = null; // 声明图像面板对象
private int imgWidth, imgHeight;// 用于存储图片的宽度和高度
private int newW, newH;// 用于存储图片缩放后的宽度和高度
private float value = 50.0f;// 控制图像大小的变量

public static void main(String args[]) {
SaveZoomImageFrame frame = new SaveZoomImageFrame();
frame.setVisible(true);
}

public SaveZoomImageFrame() {
super();
this.setTitle("缩放图片并保存"); // 设置窗体标题
URL imgUrl = SaveZoomImageFrame.class.getResource("/img/image.jpg");// 获取图片资源的路径
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图像资源
imagePanel = new ZoomImagePanel(); // 创建图像面板对象
this.setBounds(200, 160, 355, 253); // 设置窗体大小和位置
this.add(imagePanel); // 在窗体中部位置添加图像面板对象
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
getContentPane().add(getPanel(), BorderLayout.SOUTH);
}

/**
* @return
*/
protected JPanel getPanel() {
if (panel == null) {
panel = new JPanel();
panel.add(getButton());
panel.add(getButton_1());
panel.add(getButton_2());
panel.add(getButton_3());
}
return panel;
}

/**
* @return
*/
protected JButton getButton() {
if (button == null) {
button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
value += 5;// 调整value的值,用于放大图片
if (value >= 200.0f) {// 如果value的值大于等于200
value = 200.0f;// 使value的值等于200
}
imagePanel.repaint();// 重新调用面板类的paint()方法
}
});
button.setText("放 大");
}
return button;
}

/**
* @return
*/
protected JButton getButton_1() {
if (button_1 == null) {
button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
value -= 5;// 调整value的值,用于缩小图片
if (value <= 0.0f) {// 如果value的值小于等于0
value = 0.0f;// 使value的值等于0
}
imagePanel.repaint();// 重新调用面板类的paint()方法
}
});
button_1.setText("缩 小");
}
return button_1;
}

/**
* @return
*/
protected JButton getButton_2() {
if (button_2 == null) {
button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (newW <= 0 || newH <= 0) {
JOptionPane.showMessageDialog(null, "图像的宽度和高度必须大于0");// 显示提示信息
return;
}
FileDialog dialog = new FileDialog(SaveZoomImageFrame.this,
"保存");// 创建对话框
dialog.setMode(FileDialog.SAVE);// 设置对话框为保存对话框
dialog.setVisible(true);// 显示保存对话框
String path = dialog.getDirectory();// 获得文件的保存路径
String fileName = dialog.getFile();// 获得保存的文件名
if (path == null || fileName == null) {
return;
}
String fileExtName = fileName.substring(fileName
.indexOf(".") + 1);// 文件扩展名,不含点
String pathAndName = path + "\\" + fileName;// 文件的完整路径
BufferedImage bufferImage = new BufferedImage(newW, newH,
BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
Graphics g = bufferImage.getGraphics();// 获得绘图上下文对象
g.drawImage(img, 0, 0, newW, newH, null);// 在缓冲图像上绘制图像
try {
ImageIO.write(bufferImage, fileExtName, new File(
pathAndName));// 将缓冲图像保存到磁盘
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "保存失败\n"
+ e1.getMessage());// 显示提示信息
}
}
});
button_2.setText("保 存");
}
return button_2;
}

/**
* @return
*/
protected JButton getButton_3() {
if (button_3 == null) {
button_3 = new JButton();
button_3.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_3.setText("退 出");
}
return button_3;
}

// 创建面板类
class ZoomImagePanel extends JPanel {
public void paint(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());// 清除绘图上下文的内容
imgWidth = img.getWidth(this); // 获取图片宽度
imgHeight = img.getHeight(this); // 获取图片高度
newW = (int) (imgWidth * value / 100);// 计算图片缩放后的宽度
newH = (int) (imgHeight * value / 100);// 计算图片缩放后的高度
g.drawImage(img, 0, 0, newW, newH, this);// 绘制指定大小的图片
}
}

实例121 为图片添加水印并保存
private boolean watermark = false;// 水印标记,为true时绘制水印
private Image img = null; // 声明图像对象
private DrawWatermarkPanel watermarkPanel = null; // 声明图像面板对象

public static void main(String args[]) {
SaveWatermarkPictureFrame frame = new SaveWatermarkPictureFrame();
frame.setVisible(true);
}

public SaveWatermarkPictureFrame() {
super();
setTitle("为图片添加水印并保存"); // 设置窗体标题
URL imgUrl = SaveWatermarkPictureFrame.class
.getResource("/img/image.jpg");// 获取图片资源的路径
img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图像资源
watermarkPanel = new DrawWatermarkPanel(); // 创建图像面板对象
this.setBounds(200, 160, 420, 320); // 设置窗体大小和位置
this.add(watermarkPanel); // 在窗体上添加图像面板对象
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
watermark = true;
watermarkPanel.repaint();// 调用paint()方法绘制水印
}
});
button.setText("添加水印");
panel.add(button);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!watermark) {
JOptionPane.showMessageDialog(null,"还没有为图片添加水印。");// 显示提示信息
return;
}
FileDialog dialog = new FileDialog(SaveWatermarkPictureFrame.this,"保存");// 创建对话框
dialog.setMode(FileDialog.SAVE);// 设置对话框为保存对话框
dialog.setVisible(true);// 显示保存对话框
String path = dialog.getDirectory();// 获得文件的保存路径
String fileName = dialog.getFile();// 获得保存的文件名
if (path == null || fileName == null){
return;
}
String fileExtName = fileName.substring(fileName.indexOf(".")+1);// 文件扩展名,不含点
String pathAndName = path + "\\" + fileName;// 文件的完整路径
BufferedImage bufferImage = new BufferedImage(img
.getWidth(SaveWatermarkPictureFrame.this), img
.getHeight(SaveWatermarkPictureFrame.this),
BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
Graphics2D g2 = (Graphics2D)bufferImage.getGraphics();// 获得绘图上下文对象
g2.drawImage(img, 0, 0, img.getWidth(SaveWatermarkPictureFrame.this),
img.getHeight(SaveWatermarkPictureFrame.this), null);// 在缓冲图像上绘制图像
g2.rotate(Math.toRadians(-30));// 旋转绘图上下文对象
Font font = new Font("楷体", Font.BOLD, 72);// 创建字体对象
g2.setFont(font);// 指定字体
g2.setColor(Color.RED);// 指定颜色
AlphaComposite alpha = AlphaComposite.SrcOver.derive(0.4f);// 获得表示透明度的AlphaComposite对象
g2.setComposite(alpha);// 指定AlphaComposite对象
g2.drawString("编程词典", -30, 240);// 绘制文本,实现水印
try {
ImageIO.write(bufferImage, fileExtName, new File(
pathAndName));// 将缓冲图像保存到磁盘
} catch (IOException e1) {
JOptionPane.showMessageDialog(null,"保存失败\n"+e1.getMessage());// 显示提示信息
}
}
});
button_1.setText("保存图片");
panel.add(button_1);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_2.setText("退 出");
panel.add(button_2);
}

// 创建面板类
class DrawWatermarkPanel extends JPanel {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;// 获得Graphics2D对象
g2.drawImage(img, 0, 0, getWidth(), getHeight(), this);// 绘制图像
if (watermark) {
g2.rotate(Math.toRadians(-30));// 旋转绘图上下文对象
Font font = new Font("楷体", Font.BOLD, 72);// 创建字体对象
g2.setFont(font);// 指定字体
g2.setColor(Color.RED);// 指定颜色
AlphaComposite alpha = AlphaComposite.SrcOver.derive(0.4f);// 获得表示透明度的AlphaComposite对象
g2.setComposite(alpha);// 指定AlphaComposite对象
g2.drawString("编程词典", -30, 240);// 绘制文本,实现水印
}
}
}

实例122 溶合两张图片并保存
private Image img1 = null; // 声明图像对象
private Image img2 = null; // 声明图像对象
private boolean mixFlag = false;// 用于决定是否溶合图片,为true时溶合图片
private boolean firstOrSecondFlag = false;// 为false时显示第一张图片,为true时显示第二张图片
private MixPicturePanel mixPicturePanel = null; // 声明图像面板对象
private int panelWidth = 0;// 图像面板的宽度
private int panelHeight = 0;// 图像面板的高度
public static void main(String args[]) {
SaveMixPictureFrame frame = new SaveMixPictureFrame();
frame.setVisible(true);
}

public SaveMixPictureFrame() {
super();
URL imgUrl = SaveMixPictureFrame.class.getResource("/img/img.jpg");// 获取图片资源的路径
img1 = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图像资源
imgUrl = SaveMixPictureFrame.class.getResource("/img/imag.jpg");// 获取图片资源的路径
img2 = Toolkit.getDefaultToolkit().getImage(imgUrl); // 获取图像资源
mixPicturePanel = new MixPicturePanel(); // 创建图像面板对象
this.setBounds(200, 160, 476, 336); // 设置窗体大小和位置
this.add(mixPicturePanel); // 在窗体上添加图像面板对象
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
this.setTitle("溶合两张图片并保存"); // 设置窗体标题

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
firstOrSecondFlag = false;// 标记不绘制第二张图片
mixFlag = false;// 标记没溶合图片
mixPicturePanel.repaint();// 调用paint()方法绘制第一张图片
}
});
button_2.setText("第一张");
panel.add(button_2);

final JButton button_3 = new JButton();
button_3.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
firstOrSecondFlag = true;// 标记绘制第二张图片
mixFlag = false;// 标记没溶合图片
mixPicturePanel.repaint();// 调用paint()方法绘制第一张图片
}
});
button_3.setText("第二张");
panel.add(button_3);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
firstOrSecondFlag = true;// 标记绘制第二张图片
mixFlag = true;// 标记溶合图片
mixPicturePanel.repaint();// 调用paint()方法绘制第一张图片
}
});
button.setText("溶合图片");
panel.add(button);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!mixFlag) {
JOptionPane.showMessageDialog(null,"还没有溶合图片。");// 显示提示信息
return;
}
FileDialog dialog = new FileDialog(SaveMixPictureFrame.this,"保存");// 创建对话框
dialog.setMode(FileDialog.SAVE);// 设置对话框为保存对话框
dialog.setVisible(true);// 显示保存对话框
String path = dialog.getDirectory();// 获得文件的保存路径
String fileName = dialog.getFile();// 获得保存的文件名
if (path == null || fileName == null){
return;
}
String fileExtName = fileName.substring(fileName.indexOf(".")+1);// 文件扩展名,不含点
String pathAndName = path + "\\" + fileName;// 文件的完整路径
BufferedImage bufferImage = new BufferedImage(panelWidth, panelHeight,
BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
Graphics2D g2 = (Graphics2D)bufferImage.getGraphics();// 获得绘图上下文对象
g2.drawImage(img1, 0, 0, panelWidth, panelHeight, SaveMixPictureFrame.this);// 绘制图像
AlphaComposite alpha = AlphaComposite.SrcOver.derive(0.4f);// 获得表示透明度的AlphaComposite对象
g2.setComposite(alpha);// 指定AlphaComposite对象
g2.drawImage(img2, 0, 0, panelWidth, panelHeight, SaveMixPictureFrame.this);// 绘制调整透明度后的图片
try {
ImageIO.write(bufferImage, fileExtName, new File(
pathAndName));// 将缓冲图像保存到磁盘
} catch (IOException e1) {
JOptionPane.showMessageDialog(null,"保存失败\n"+e1.getMessage());// 显示提示信息
}
}
});
button_1.setText("保存图片");
panel.add(button_1);

final JButton button_4 = new JButton();
button_4.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_4.setText("退 出");
panel.add(button_4);

}

// 创建面板类
class MixPicturePanel extends JPanel {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;// 获得Graphics2D对象
panelWidth = getWidth();// 获得图像面板的宽度
panelHeight = getHeight();// 获得图像面板的高度
g2.drawImage(img1, 0, 0, panelWidth, panelHeight, this);// 绘制图像
if (mixFlag) {// 标记溶合图片
AlphaComposite alpha = AlphaComposite.SrcOver.derive(0.4f);// 获得表示透明度的AlphaComposite对象
g2.setComposite(alpha);// 指定AlphaComposite对象
}
if (firstOrSecondFlag) {// 标记绘制第二张图片
g2.drawImage(img2, 0, 0, panelWidth, panelHeight, this);// 绘制调整透明度后的图片
}
}
}

实例123 模糊图片并保存
private BufferedImage image;// 声明缓冲图像对象
private BlurPicturePanel blurPicturePanel = null; // 声明图像面板对象
private boolean blurFlag = false;// 模糊标记

public static void main(String args[]) {
SaveBlurPictureFrame frame = new SaveBlurPictureFrame();
frame.setVisible(true);
}

public SaveBlurPictureFrame() {
super();
setTitle("模糊图片并保存"); // 设置窗体标题
setBounds(200, 160, 439, 319); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
blurPicturePanel = new BlurPicturePanel(); // 创建图像面板对象
add(blurPicturePanel); // 在窗体上添加图像面板对象
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
float[] elements = new float[9];// 定义表示像素分量的数组
for (int i = 0; i < 9; i++) {
elements[i] = 0.11f;// 为数组赋值
}
convolve(elements);// 调用方法,实现模糊功能
blurFlag = true;// 模糊图片标记
}
});
button.setText("模糊图片");
panel.add(button);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!blurFlag) {
JOptionPane.showMessageDialog(null, "还没有模糊图片。");// 显示提示信息
return;
}
FileDialog dialog = new FileDialog(SaveBlurPictureFrame.this,
"保存");// 创建对话框
dialog.setMode(FileDialog.SAVE);// 设置对话框为保存对话框
dialog.setVisible(true);// 显示保存对话框
String path = dialog.getDirectory();// 获得文件的保存路径
String fileName = dialog.getFile();// 获得保存的文件名
if (path == null || fileName == null) {
return;
}
String fileExtName = fileName
.substring(fileName.indexOf(".") + 1);// 文件扩展名,不含点
String pathAndName = path + "\\" + fileName;// 文件的完整路径
try {
ImageIO.write(image, fileExtName, new File(pathAndName));// 将缓冲图像保存到磁盘
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "保存失败\n"
+ e1.getMessage());// 显示提示信息
}
}
});
button_2.setText("保存图片");
panel.add(button_2);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
panel.add(button_1);
}

private void convolve(float[] elements) {
Kernel kernel = new Kernel(3, 3, elements);// 创建 Kernel对象
ConvolveOp op = new ConvolveOp(kernel);// 创建ConvolveOp对象
if (image == null) {
return;
}
image = op.filter(image, null); // 过滤缓冲图像对象
repaint();// 调用paint()方法
}

// 创建面板类
class BlurPicturePanel extends JPanel {
public BlurPicturePanel() {
Image img = null;// 声明创建图像对象
try {
img = ImageIO.read(new File("src/img/imag.jpg")); // 创建图像对象
} catch (IOException e) {
e.printStackTrace();
}
image = new BufferedImage(img.getWidth(null), img.getHeight(null),
BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
image.getGraphics().drawImage(img, 0, 0, null);// 在缓冲图像对象上绘制图像
}
public void paint(Graphics g) {
if (image != null) {
g.drawImage(image, 0, 0, null);// 绘制缓冲图像对象
}
}
}

实例124 锐化图片并保存
private BufferedImage image;// 声明缓冲图像对象
private SharpenPicturePanel sharpenPicturePanel = null; // 声明图像面板对象
private boolean sharpenFlag = false;// 锐化标记
public static void main(String args[]) {
SaveSharpenPictureFrame frame = new SaveSharpenPictureFrame();
frame.setVisible(true);
}

public SaveSharpenPictureFrame() {
super();
setTitle("锐化图片并保存"); // 设置窗体标题
setBounds(200, 160, 446, 305); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
sharpenPicturePanel = new SharpenPicturePanel(); // 创建图像面板对象
add(sharpenPicturePanel); // 在窗体上添加图像面板对象
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
float[] elements = {0.0f,-1.0f,0.0f,-1.0f,5.0f,-1.0f,0.0f,-1.0f,0.0f};// 声明表示像素分量的数组
convolve(elements);// 调用方法实现图片锐化功能
sharpenFlag = true;// 锐化图片标记
}
});
button.setText("锐化图片");
panel.add(button);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!sharpenFlag) {
JOptionPane.showMessageDialog(null,"还没有锐化图片。");// 显示提示信息
return;
}
FileDialog dialog = new FileDialog(SaveSharpenPictureFrame.this,"保存");// 创建对话框
dialog.setMode(FileDialog.SAVE);// 设置对话框为保存对话框
dialog.setVisible(true);// 显示保存对话框
String path = dialog.getDirectory();// 获得文件的保存路径
String fileName = dialog.getFile();// 获得保存的文件名
if (path == null || fileName == null){
return;
}
String fileExtName = fileName.substring(fileName.indexOf(".")+1);// 文件扩展名,不含点
String pathAndName = path + "\\" + fileName;// 文件的完整路径
try {
ImageIO.write(image, fileExtName, new File(pathAndName));// 将缓冲图像保存到磁盘
} catch (IOException e1) {
JOptionPane.showMessageDialog(null,"保存失败\n"+e1.getMessage());// 显示提示信息
}
}
});
button_2.setText("保存图片");
panel.add(button_2);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
panel.add(button_1);
}

private void convolve(float[] elements) {
Kernel kernel = new Kernel(3, 3, elements);// 创建 Kernel对象
ConvolveOp op = new ConvolveOp(kernel);// 创建ConvolveOp对象
if (image == null) {
return;
}
image = op.filter(image, null); // 过滤缓冲图像对象
repaint();// 调用paint()方法
}

// 创建面板类
class SharpenPicturePanel extends JPanel {
public SharpenPicturePanel(){
Image img = null;// 声明创建图像对象
try {
img = ImageIO.read(new File("src/img/imag.jpg")); // 创建图像对象
} catch (IOException e) {
e.printStackTrace();
}
image = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
image.getGraphics().drawImage(img, 0, 0, null);// 在缓冲图像对象上绘制图像
}
public void paint(Graphics g) {
if (image != null) {
g.drawImage(image, 0, 0, null);// 绘制缓冲图像对象
}
}
}

实例125 照亮边缘并保存
private BufferedImage image;// 声明缓冲图像对象
private EdgeDetectPicturePanel edgeDetectPicturePanel = null; // 声明图像面板对象
private boolean edgeDetectFlag = false;// 照亮边缘标记
public static void main(String args[]) {
SaveEdgeDetectPictureFrame frame = new SaveEdgeDetectPictureFrame();
frame.setVisible(true);
}

public SaveEdgeDetectPictureFrame() {
super();
setTitle("照亮边缘并保存"); // 设置窗体标题
setBounds(200, 160, 371, 271); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
edgeDetectPicturePanel = new EdgeDetectPicturePanel(); // 创建图像面板对象
this.add(edgeDetectPicturePanel); // 在窗体上添加图像面板对象
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
float[] elements = {0.0f,-1.0f,0.0f,-1.0f,4.0f,-1.0f,0.0f,-1.0f,0.0f};// 声明表示像素分量的数组
convolve(elements);// 调用方法实现图片照亮边缘功能
edgeDetectFlag = true;// 照亮边缘图片标记
}
});
button.setText("照亮边缘");
panel.add(button);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!edgeDetectFlag) {
JOptionPane.showMessageDialog(null,"还没执行照亮边缘操作。");// 显示提示信息
return;
}
FileDialog dialog = new FileDialog(SaveEdgeDetectPictureFrame.this,"保存");// 创建对话框
dialog.setMode(FileDialog.SAVE);// 设置对话框为保存对话框
dialog.setVisible(true);// 显示保存对话框
String path = dialog.getDirectory();// 获得文件的保存路径
String fileName = dialog.getFile();// 获得保存的文件名
if (path == null || fileName == null){
return;
}
String fileExtName = fileName.substring(fileName.indexOf(".")+1);// 文件扩展名,不含点
String pathAndName = path + "\\" + fileName;// 文件的完整路径
try {
ImageIO.write(image, fileExtName, new File(pathAndName));// 将缓冲图像保存到磁盘
} catch (IOException e1) {
JOptionPane.showMessageDialog(null,"保存失败\n"+e1.getMessage());// 显示提示信息
}
}
});
button_2.setText("保存图片");
panel.add(button_2);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
panel.add(button_1);
}

private void convolve(float[] elements) {
Kernel kernel = new Kernel(3, 3, elements); // 创建 Kernel对象
ConvolveOp op = new ConvolveOp(kernel); // 创建ConvolveOp对象
if (image == null) {
return;
}
image = op.filter(image, null); // 过滤缓冲图像对象
repaint(); // 调用paint()方法
}

// 创建面板类
class EdgeDetectPicturePanel extends JPanel {
public EdgeDetectPicturePanel(){
Image img = null;// 声明创建图像对象
try {
img = ImageIO.read(new File("src/img/image.jpg")); // 创建图像对象
} catch (IOException e) {
e.printStackTrace();
}
image = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
image.getGraphics().drawImage(img, 0, 0, null);// 在缓冲图像对象上绘制图像
}
public void paint(Graphics g) {
if (image != null) {
g.drawImage(image, 0, 0, null);// 绘制缓冲图像对象
}
}
}

实例126 反向并保存图片
private BufferedImage image;// 声明缓冲图像对象
private NegativePicturePanel negativePicturePanel = null; // 声明图像面板对象
private boolean negativeFlag = false;// 反向标记
public static void main(String args[]) {
SaveNegativePictureFrame frame = new SaveNegativePictureFrame();
frame.setVisible(true);
}

public SaveNegativePictureFrame() {
super();
setTitle("反向并保存图片"); // 设置窗体标题
setBounds(200, 160, 516, 458); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
negativePicturePanel = new NegativePicturePanel(); // 创建图像面板对象
add(negativePicturePanel); // 在窗体上添加图像面板对象
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
short[] negative = new short[256];// 创建表示颜色反向的分量数组
for (int i = 0; i<256;i++){
negative[i] = (short)(255-i);// 为数组赋值
}
ShortLookupTable table = new ShortLookupTable(0,negative);// 创建查找表对象
LookupOp op = new LookupOp(table,null);// 创建实现从源到目标查找操作的LookupOp对象
image = op.filter(image, null);// 调用LookupOp对象的filter()方法,实现图像反向功能
repaint(); // 调用paint()方法
negativeFlag = !negativeFlag;// 标记是否已反向
if (negativeFlag){
button.setText("还原图片");
}else{
button.setText("反向图片");
}
}
});
button.setText("反向图片");
panel.add(button);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (!negativeFlag) {
JOptionPane.showMessageDialog(null,"还没执行反向操作。");// 显示提示信息
return;
}
FileDialog dialog = new FileDialog(SaveNegativePictureFrame.this,"保存");// 创建对话框
dialog.setMode(FileDialog.SAVE);// 设置对话框为保存对话框
dialog.setVisible(true);// 显示保存对话框
String path = dialog.getDirectory();// 获得文件的保存路径
String fileName = dialog.getFile();// 获得保存的文件名
if (path == null || fileName == null){
return;
}
String fileExtName = fileName.substring(fileName.indexOf(".")+1);// 文件扩展名,不含点
String pathAndName = path + "\\" + fileName;// 文件的完整路径
try {
ImageIO.write(image, fileExtName, new File(pathAndName));// 将缓冲图像保存到磁盘
} catch (IOException e1) {
JOptionPane.showMessageDialog(null,"保存失败\n"+e1.getMessage());// 显示提示信息
}
}
});
button_2.setText("保存图片");
panel.add(button_2);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
panel.add(button_1);
}

// 创建面板类
class NegativePicturePanel extends JPanel {
public NegativePicturePanel(){
Image img = null;// 声明创建图像对象
try {
img = ImageIO.read(new File("src/img/imag.jpg")); // 创建图像对象
} catch (IOException e) {
e.printStackTrace();
}
image = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
image.getGraphics().drawImage(img, 0, 0, null);// 在缓冲图像对象上绘制图像
}
public void paint(Graphics g) {
if (image != null) {
g.drawImage(image, 0, 0, null);// 绘制缓冲图像对象
}
}
}

实例127 填充纹理并保存为图片
private TextureFillPanel textureFillPanel = null; // 声明面板对象
private int newW, newH;// 用于存储图片缩放后的宽度和高度

public static void main(String args[]) {
SaveTextureFillFrame frame = new SaveTextureFillFrame();
frame.setVisible(true);
}

public SaveTextureFillFrame() {
super();
setTitle("填充纹理并保存为图片"); // 设置窗体标题
textureFillPanel = new TextureFillPanel(); // 创建图像面板对象
setBounds(200, 160, 346, 285); // 设置窗体大小和位置
add(textureFillPanel); // 在窗体上添加图像面板对象
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
FileDialog dialog = new FileDialog(SaveTextureFillFrame.this,
"保存");// 创建对话框
dialog.setMode(FileDialog.SAVE);// 设置对话框为保存对话框
dialog.setVisible(true);// 显示保存对话框
String path = dialog.getDirectory();// 获得文件的保存路径
String fileName = dialog.getFile();// 获得保存的文件名
if (path == null || fileName == null) {
JOptionPane.showMessageDialog(null, "请指定文件的保存路径和文件名。");// 显示提示信息
return;
}
String fileExtName = fileName
.substring(fileName.indexOf(".") + 1);// 文件扩展名,不含点
String pathAndName = path + "\\" + fileName;// 文件的完整路径
BufferedImage image = new BufferedImage(200, 200,
BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
Graphics2D g2 = image.createGraphics();// 获得缓冲图像对象的绘图上下文对象
g2.setColor(Color.BLUE);// 设置颜色
g2.fillRect(0, 0, 90, 90);// 绘制填充矩形
g2.setColor(Color.RED);// 设置颜色
g2.fillOval(95, 0, 90, 90);// 绘制带填充色的圆形
g2.setColor(Color.GREEN);// 设置颜色
g2.fillRect(95, 95, 90, 90);// 绘制填充矩形
g2.setColor(Color.ORANGE);// 设置颜色
g2.fillOval(0, 95, 90, 90);// 绘制带填充色的圆形
Rectangle2D rect = new Rectangle2D.Float(10, 10, 20, 20);// 创建Rectangle2D对象
TexturePaint textPaint = new TexturePaint(image, rect);// 创建纹理填充对象
BufferedImage bufferImage = new BufferedImage(newW, newH,
BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
Graphics g = bufferImage.getGraphics();// 获得缓冲图像的绘图上下文对象
Graphics2D graphics2 = (Graphics2D) g;// 转换绘图上下文对象为Graphics2D类型
graphics2.setPaint(textPaint);// 为绘图上下文对象指定纹理填充对象
Rectangle2D.Float ellipse2 = new Rectangle2D.Float(0, 0, newW,
newH);// 创建矩形对象
graphics2.fill(ellipse2);// 绘制填充纹理的矩形
try {
ImageIO.write(bufferImage, fileExtName, new File(
pathAndName));// 将缓冲图像保存到磁盘
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "保存失败\n"
+ e1.getMessage());// 显示提示信息
}
}
});
button.setText("保存为图片");
panel.add(button);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setText("退 出");
panel.add(button_1);
}

// 创建面板类
class TextureFillPanel extends JPanel {
public void paint(Graphics g) {
BufferedImage image = new BufferedImage(200, 200,
BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象
Graphics2D g2 = image.createGraphics();// 获得缓冲图像对象的绘图上下文对象
g2.setColor(Color.BLUE);// 设置颜色
g2.fillRect(0, 0, 90, 90);// 绘制填充矩形
g2.setColor(Color.RED);// 设置颜色
g2.fillOval(95, 0, 90, 90);// 绘制带填充色的圆形
g2.setColor(Color.GREEN);// 设置颜色
g2.fillRect(95, 95, 90, 90);// 绘制填充矩形
g2.setColor(Color.ORANGE);// 设置颜色
g2.fillOval(0, 95, 90, 90);// 绘制带填充色的圆形
Rectangle2D rect = new Rectangle2D.Float(10, 10, 20, 20);// 创建Rectangle2D对象
TexturePaint textPaint = new TexturePaint(image, rect);// 创建纹理填充对象
Graphics2D graphics2 = (Graphics2D) g;// 转换paint()方法的绘图上下文对象
graphics2.setPaint(textPaint);// 为绘图上下文对象设置纹理填充对象
newW = getWidth();
newH = getHeight();
Rectangle2D.Float ellipse2 = new Rectangle2D.Float(0, 0, newW, newH);// 创建矩形对象
graphics2.fill(ellipse2);// 绘制填充纹理的矩形
}
}

6.2 图片在数据库中的存取
实例128 图片存储到Access数据库中
DAO.java
private static DAO dao = new DAO(); // 声明DAO类的静态实例
/**
* 构造方法,加载数据库驱动
*/
public DAO() {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "数据库驱动加载失败。\n"
+ e.getMessage());
}
}

/**
* 获得数据库连接的方法
*
* @return Connection
*/
public static Connection getConn() {
try {
Connection conn = null; // 定义数据库连接
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=database/db_picture.mdb"; // 数据库db_picture.mdb的URL
String username = ""; // 数据库的用户名
String password = ""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
return conn; // 返回连接
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"数据库连接失败。\n" + e.getMessage());
return null;
}
}

SavePictureToAccessFrame.java
private static final long serialVersionUID = 8339759858493972497L;
private JTextField tf_name;
private String picturePath = null;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SavePictureToAccessFrame frame = new SavePictureToAccessFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public SavePictureToAccessFrame() {
super();
setTitle("图片存储到Access数据库中");
setBounds(100, 100, 369, 248);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);

final JLabel label = new JLabel();
label.setFont(new Font("黑体", Font.BOLD, 22));
label.setBounds(26, 12, 302, 41);
label.setText("将图片存储到Access数据库中");
panel.add(label);

final JLabel label_1 = new JLabel();
label_1.setText("姓 名:");
label_1.setBounds(26, 59, 66, 18);
panel.add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("图 片:");
label_2.setBounds(26, 130, 66, 18);
panel.add(label_2);

tf_name = new JTextField();
tf_name.setBounds(83, 57, 245, 22);
panel.add(tf_name);

final JLabel lb_picture = new JLabel();
lb_picture.setOpaque(true);
lb_picture.setBackground(Color.PINK);
lb_picture.setBounds(83, 83, 139, 117);
panel.add(lb_picture);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(); // 创建文件对话框
// 创建文件过滤
FileFilter filter = new FileNameExtensionFilter(
"图像文件(*.gif;*.jpg;*.jpeg;*.png)", "gif", "jpg", "jpeg",
"png");
fileChooser.setFileFilter(filter); // 为文件对话框设置文件过滤器
int returnValue = fileChooser.showOpenDialog(null);// 打开文件选择对话框
if (returnValue == JFileChooser.APPROVE_OPTION) { // 判断是否选择了文件
File file = fileChooser.getSelectedFile(); // 获得文件对象
if (file.length() / 1024.0 > 50.0) {
JOptionPane.showMessageDialog(null, "请选择小于等于50KB的图片文件。");
return;
}
picturePath = file.getAbsolutePath();
Icon icon = new ImageIcon(picturePath);
Dimension size = lb_picture.getSize();
lb_picture.setIcon(icon);
lb_picture.setSize(size);
}
}
});
button_2.setText("选择图片");
button_2.setBounds(231, 85, 97, 28);
panel.add(button_2);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
String name = tf_name.getText().trim();
if (picturePath == null || picturePath.equals("")) {
JOptionPane.showMessageDialog(null, "请选择图片文件。");
return;
}
File file = new File(picturePath);
try {
FileInputStream in = new FileInputStream(file);
Connection conn = DAO.getConn();
String sql = "insert into tb_picture (name,picture) values(?,?)";
PreparedStatement ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setString(1, name); // 为第1个参数赋值
ps.setBinaryStream(2, in, (int) file.length());// 为第2个参数赋值
int flag = ps.executeUpdate(); // 执行SQL语句,获得更新记录数
if (flag > 0) {
JOptionPane.showMessageDialog(null, "保存成功!");
} else {
JOptionPane.showMessageDialog(null, "保存失败!");
}
ps.close();// 关闭PreparedStatement对象
conn.close(); // 关闭连接
if (in != null) {
in.close();// 关闭IO流
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e2) {
e2.printStackTrace();
} catch (IOException e3) {
e3.printStackTrace();
}
}
});
button.setBounds(231, 125, 97, 28);
panel.add(button);
button.setText("保 存");

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setBounds(231, 167, 97, 28);
panel.add(button_1);
button_1.setText("退 出");
//
}

实例129 图片存储到MySQL数据库中
SavePictureToMySQLFrame.java
private static final long serialVersionUID = 8339759858493972497L;
private JTextField tf_name;
private String picturePath = null;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SavePictureToMySQLFrame frame = new SavePictureToMySQLFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public SavePictureToMySQLFrame() {
super();
setTitle("图片存储到MySQL数据库中");
setBounds(100, 100, 369, 248);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);

final JLabel label = new JLabel();
label.setFont(new Font("黑体", Font.BOLD, 22));
label.setBounds(26, 12, 302, 41);
label.setText("将图片存储到MySQL数据库中");
panel.add(label);

final JLabel label_1 = new JLabel();
label_1.setText("姓 名:");
label_1.setBounds(26, 59, 66, 18);
panel.add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("图 片:");
label_2.setBounds(26, 130, 66, 18);
panel.add(label_2);

tf_name = new JTextField();
tf_name.setBounds(83, 57, 245, 22);
panel.add(tf_name);

final JLabel lb_picture = new JLabel();
lb_picture.setOpaque(true);
lb_picture.setBackground(Color.PINK);
lb_picture.setBounds(83, 83, 139, 117);
panel.add(lb_picture);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(); // 创建文件对话框
// 创建文件过滤
FileFilter filter = new FileNameExtensionFilter(
"图像文件(*.gif;*.jpg;*.jpeg;*.png)", "gif", "jpg", "jpeg",
"png");
fileChooser.setFileFilter(filter); // 为文件对话框设置文件过滤器
int returnValue = fileChooser.showOpenDialog(null);// 打开文件选择对话框
if (returnValue == JFileChooser.APPROVE_OPTION) { // 判断是否选择了文件
File file = fileChooser.getSelectedFile(); // 获得文件对象
if (file.length() / 1024.0 > 50.0) {
JOptionPane
.showMessageDialog(null, "请选择小于等于50KB的图片文件。");
return;
}
picturePath = file.getAbsolutePath();
Icon icon = new ImageIcon(picturePath);
Dimension size = lb_picture.getSize();
lb_picture.setIcon(icon);
lb_picture.setSize(size);
}
}
});
button_2.setText("选择图片");
button_2.setBounds(231, 85, 97, 28);
panel.add(button_2);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
String name = tf_name.getText().trim();
if (picturePath == null || picturePath.equals("")) {
JOptionPane.showMessageDialog(null, "请选择图片文件。");
return;
}
File file = new File(picturePath);
try {
FileInputStream in = new FileInputStream(file);
Connection conn = DAO.getConn();
String sql = "insert into tb_picture (name,picture) values(?,?)";
PreparedStatement ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setString(1, name); // 为第1个参数赋值
ps.setBinaryStream(2, in, (int) file.length());// 为第2个参数赋值
int flag = ps.executeUpdate(); // 执行SQL语句,获得更新记录数
if (flag > 0) {
JOptionPane.showMessageDialog(null, "保存成功!");
} else {
JOptionPane.showMessageDialog(null, "保存失败!");
}
ps.close();// 关闭PreparedStatement对象
conn.close(); // 关闭连接
if (in != null) {
in.close();// 关闭IO流
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e2) {
e2.printStackTrace();
} catch (IOException e3) {
e3.printStackTrace();
}
}
});
button.setBounds(231, 125, 97, 28);
panel.add(button);
button.setText("保 存");

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setBounds(231, 167, 97, 28);
panel.add(button_1);
button_1.setText("退 出");
}

DAO.java
private static DAO dao = new DAO(); // 声明DAO类的静态实例

/**
* 构造方法,加载数据库驱动
*/
public DAO() {
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null,
"数据库驱动加载失败,请将MySQL驱动配置到构建路径中。\n" + e.getMessage());
}
}

/**
* 获得数据库连接的方法
*
* @return Connection
*/
public static Connection getConn() {
try {
Connection conn = null; // 定义数据库连接
String url = "jdbc:mysql://localhost:3306/db_database?useUnicode=true&characterEncoding=utf-8"; // 数据库db_database的URL
String username = "root"; // 数据库的用户名
String password = "111"; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
return conn; // 返回连接
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "数据库连接失败。" + e.getMessage());
return null;
}
}

实例130 图片存储到SQLServer数据库中
DAO.java
private static DAO dao = new DAO(); // 声明DAO类的静态实例

/**
* 构造方法,加载数据库驱动
*/
public DAO() {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "数据库驱动加载失败,请将JTDS驱动配置到构建路径中。\n"
+ e.getMessage());
}
}

/**
* 获得数据库连接的方法
*
* @return Connection
*/
public static Connection getConn() {
try {
Connection conn = null; // 定义数据库连接
String url = "jdbc:jtds:sqlserver://localhost:1433/db_database"; // 数据库db_database的URL
String username = "sa"; // 数据库的用户名
String password = ""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
return conn; // 返回连接
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"数据库连接失败。\n请检查是否安装了SP4补丁,\n以及数据库用户名和密码是否正确。"
+ e.getMessage());
return null;
}
}

SavePictureToSQLServerFrame.java
private static final long serialVersionUID = 8339759858493972497L;
private JTextField tf_name;
private String picturePath = null;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SavePictureToSQLServerFrame frame = new SavePictureToSQLServerFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public SavePictureToSQLServerFrame() {
super();
setTitle("图片存储到SQLServer数据库中");
setBounds(100, 100, 369, 248);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);

final JLabel label = new JLabel();
label.setFont(new Font("黑体", Font.BOLD, 18));
label.setBounds(26, 12, 302, 41);
label.setText("将图片存储到SQLServer数据库中");
panel.add(label);

final JLabel label_1 = new JLabel();
label_1.setText("姓 名:");
label_1.setBounds(26, 59, 66, 18);
panel.add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("图 片:");
label_2.setBounds(26, 130, 66, 18);
panel.add(label_2);

tf_name = new JTextField();
tf_name.setBounds(83, 57, 245, 22);
panel.add(tf_name);

final JLabel lb_picture = new JLabel();
lb_picture.setOpaque(true);
lb_picture.setBackground(Color.PINK);
lb_picture.setBounds(83, 83, 139, 117);
panel.add(lb_picture);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(); // 创建文件对话框
// 创建文件过滤
FileFilter filter = new FileNameExtensionFilter(
"图像文件(*.gif;*.jpg;*.jpeg;*.png)", "gif", "jpg", "jpeg",
"png");
fileChooser.setFileFilter(filter); // 为文件对话框设置文件过滤器
int returnValue = fileChooser.showOpenDialog(null);// 打开文件选择对话框
if (returnValue == JFileChooser.APPROVE_OPTION) { // 判断是否选择了文件
File file = fileChooser.getSelectedFile(); // 获得文件对象
if (file.length() / 1024.0 > 50.0) {
JOptionPane
.showMessageDialog(null, "请选择小于等于50KB的图片文件。");
return;
}
picturePath = file.getAbsolutePath();
Icon icon = new ImageIcon(picturePath);
Dimension size = lb_picture.getSize();
lb_picture.setIcon(icon);
lb_picture.setSize(size);
}
}
});
button_2.setText("选择图片");
button_2.setBounds(231, 85, 97, 28);
panel.add(button_2);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
String name = tf_name.getText().trim();
if (picturePath == null || picturePath.equals("")) {
JOptionPane.showMessageDialog(null, "请选择图片文件。");
return;
}
File file = new File(picturePath);
try {
FileInputStream in = new FileInputStream(file);
Connection conn = DAO.getConn();
String sql = "insert into tb_picture (name,picture) values(?,?)";
PreparedStatement ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setString(1, name); // 为第1个参数赋值
ps.setBinaryStream(2, in, (int) file.length());// 为第2个参数赋值
int flag = ps.executeUpdate(); // 执行SQL语句,获得更新记录数
if (flag > 0) {
JOptionPane.showMessageDialog(null, "保存成功!");
} else {
JOptionPane.showMessageDialog(null, "保存失败!");
}
ps.close();// 关闭PreparedStatement对象
conn.close(); // 关闭连接
if (in != null) {
in.close();// 关闭IO流
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e2) {
e2.printStackTrace();
} catch (IOException e3) {
e3.printStackTrace();
}
}
});
button.setBounds(231, 125, 97, 28);
panel.add(button);
button.setText("保 存");

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setBounds(231, 167, 97, 28);
panel.add(button_1);
button_1.setText("退 出");
}

实例131 读取Access数据库中存储的图片
DAO.java
private static DAO dao = new DAO(); // 声明DAO类的静态实例
/**
* 构造方法,加载数据库驱动
*/
public DAO() {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "数据库驱动加载失败。\n"
+ e.getMessage());
}
}

/**
* 获得数据库连接的方法
*
* @return Connection
*/
public static Connection getConn() {
try {
Connection conn = null; // 定义数据库连接
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=database/db_picture.mdb"; // 数据库db_picture.mdb的URL
String username = ""; // 数据库的用户名
String password = ""; // 数据库密码
conn = DriverManager.getConnection(url, username, password); // 建立连接
return conn; // 返回连接
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"数据库连接失败。\n" + e.getMessage());
return null;
}
}

ReadPictureFromAccessFrame.java
private static final long serialVersionUID = 8339759858493972497L;
private JTextField tf_id;
private JTextField tf_name;
private JLabel lb_picture = null;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ReadPictureFromAccessFrame frame = new ReadPictureFromAccessFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public ReadPictureFromAccessFrame() {
super();
setTitle("读取Access数据库中存储的图片");
setBounds(100, 100, 369, 271);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);

final JLabel label_1 = new JLabel();
label_1.setText("编 号:");
label_1.setBounds(26, 26, 66, 18);
panel.add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("照 片:");
label_2.setBounds(26, 130, 66, 18);
panel.add(label_2);

tf_id = new JTextField();
tf_id.setText("1");
tf_id.setBounds(83, 24, 122, 22);
panel.add(tf_id);

lb_picture = new JLabel();
lb_picture.setOpaque(true);
lb_picture.setBackground(Color.PINK);
lb_picture.setBounds(83, 83, 245, 140);
panel.add(lb_picture);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
int id = Integer.parseInt(tf_id.getText().trim());
Connection conn = DAO.getConn();
String sql = "select name,picture from tb_picture where id = ?";
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setInt(1, id); // 为参数赋值
rs = ps.executeQuery();// 执行SQL语句
if (rs.next()) {
String name = rs.getString(1);// 获得姓名
tf_name.setText(name);// 在文本框中显示姓名
byte[] bt = rs.getBytes(2);// 获得表中照片的字节数组
Icon icon = new ImageIcon(bt);// 创建图标对象
Dimension size = lb_picture.getSize();// 获得显示图标的标签大小
lb_picture.setIcon(icon);// 为标签指定图标
lb_picture.setSize(size);// 设置标签的大小
}
rs.close();
ps.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
button.setBounds(211, 21, 117, 28);
panel.add(button);
button.setText("按编号查询");

final JLabel label = new JLabel();
label.setText("姓 名:");
label.setBounds(26, 59, 66, 18);
panel.add(label);

tf_name = new JTextField();
tf_name.setBounds(83, 55, 245, 22);
panel.add(tf_name);
}

实例132 读取MySQL数据库中存储的图片
private static final long serialVersionUID = 8339759858493972497L;
private JTextField tf_id;
private JTextField tf_name;
private JLabel lb_picture = null;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ReadPictureFromMySQLFrame frame = new ReadPictureFromMySQLFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public ReadPictureFromMySQLFrame() {
super();
setTitle("读取MySQL数据库中存储的图片");
setBounds(100, 100, 369, 271);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);

final JLabel label_1 = new JLabel();
label_1.setText("编 号:");
label_1.setBounds(26, 26, 66, 18);
panel.add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("照 片:");
label_2.setBounds(26, 130, 66, 18);
panel.add(label_2);

tf_id = new JTextField();
tf_id.setText("1");
tf_id.setBounds(83, 24, 122, 22);
panel.add(tf_id);

lb_picture = new JLabel();
lb_picture.setOpaque(true);
lb_picture.setBackground(Color.PINK);
lb_picture.setBounds(83, 83, 245, 140);
panel.add(lb_picture);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
int id = Integer.parseInt(tf_id.getText().trim());
Connection conn = DAO.getConn();
String sql = "select name,picture from tb_picture where id = ?";
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setInt(1, id); // 为参数赋值
rs = ps.executeQuery();// 执行SQL语句
if (rs.next()) {
String name = rs.getString(1);// 获得姓名
tf_name.setText(name);// 在文本框中显示姓名
Blob img = (Blob) rs.getBlob(2);// 获得图片的Blob对象
Icon icon = new ImageIcon(img.getBytes(1, (int) img
.length()));// 创建图标对象
Dimension size = lb_picture.getSize();// 获得显示图标的标签大小
lb_picture.setIcon(icon);// 为标签指定图标
lb_picture.setSize(size);// 设置标签的大小
}
rs.close();
ps.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
button.setBounds(211, 21, 117, 28);
panel.add(button);
button.setText("按编号查询");

final JLabel label = new JLabel();
label.setText("姓 名:");
label.setBounds(26, 59, 66, 18);
panel.add(label);

tf_name = new JTextField();
tf_name.setBounds(83, 55, 245, 22);
panel.add(tf_name);
}

实例133 读取SQLServer数据库中存储的图片
private static final long serialVersionUID = 8339759858493972497L;
private JTextField tf_id;
private JTextField tf_name;
private JLabel lb_picture = null;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ReadPictureFromSQLServerFrame frame = new ReadPictureFromSQLServerFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public ReadPictureFromSQLServerFrame() {
super();
setTitle("读取SQLServer数据库中存储的图片");
setBounds(100, 100, 369, 271);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);

final JLabel label_1 = new JLabel();
label_1.setText("编 号:");
label_1.setBounds(26, 26, 66, 18);
panel.add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("照 片:");
label_2.setBounds(26, 130, 66, 18);
panel.add(label_2);

tf_id = new JTextField();
tf_id.setText("1");
tf_id.setBounds(83, 24, 122, 22);
panel.add(tf_id);

lb_picture = new JLabel();
lb_picture.setOpaque(true);
lb_picture.setBackground(Color.PINK);
lb_picture.setBounds(83, 83, 245, 140);
panel.add(lb_picture);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
int id = Integer.parseInt(tf_id.getText().trim());
Connection conn = DAO.getConn();
String sql = "select name,picture from tb_picture where id = ?";
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setInt(1, id); // 为参数赋值
rs = ps.executeQuery();
if (rs.next()) {
String name = rs.getString(1);// 获得姓名
tf_name.setText(name);// 在文本框中显示姓名
Blob img = (Blob) rs.getBlob(2);// 获得图片的Blob对象
Icon icon = new ImageIcon(img.getBytes(1, (int) img
.length()));// 创建图标对象
Dimension size = lb_picture.getSize();// 获得显示图标的标签大小
lb_picture.setIcon(icon);// 为标签指定图标
lb_picture.setSize(size);// 设置标签的大小
}
rs.close();
ps.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
button.setBounds(211, 21, 117, 28);
panel.add(button);
button.setText("按编号查询");

final JLabel label = new JLabel();
label.setText("姓 名:");
label.setBounds(26, 59, 66, 18);
panel.add(label);

tf_name = new JTextField();
tf_name.setBounds(83, 55, 245, 22);
panel.add(tf_name);
}

实例134 修改Access数据库中存储的图片
private JTextField tf_id;
private static final long serialVersionUID = 8339759858493972497L;
private JTextField tf_name;
private String picturePath = null;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UpdateAccessPictureFrame frame = new UpdateAccessPictureFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public UpdateAccessPictureFrame() {
super();
setTitle("修改Access数据库中存储的图片");
setBounds(100, 100, 369, 232);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);

final JLabel label_1 = new JLabel();
label_1.setText("姓 名:");
label_1.setBounds(26, 43, 66, 18);
panel.add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("图 片:");
label_2.setBounds(26, 114, 66, 18);
panel.add(label_2);

tf_name = new JTextField();
tf_name.setBounds(83, 41, 245, 22);
panel.add(tf_name);

final JLabel lb_picture = new JLabel();
lb_picture.setOpaque(true);
lb_picture.setBackground(Color.PINK);
lb_picture.setBounds(83, 67, 139, 117);
panel.add(lb_picture);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(); // 创建文件对话框
// 创建文件过滤
FileFilter filter = new FileNameExtensionFilter(
"图像文件(*.gif;*.jpg;*.jpeg;*.png)", "gif", "jpg", "jpeg",
"png");
fileChooser.setFileFilter(filter); // 为文件对话框设置文件过滤器
int returnValue = fileChooser.showOpenDialog(null);// 打开文件选择对话框
if (returnValue == JFileChooser.APPROVE_OPTION) { // 判断是否选择了文件
File file = fileChooser.getSelectedFile(); // 获得文件对象
if (file.length() / 1024.0 > 50.0) {
JOptionPane.showMessageDialog(null, "请选择小于等于50KB的图片文件。");
return;
}
picturePath = file.getAbsolutePath();
Icon icon = new ImageIcon(picturePath);
Dimension size = lb_picture.getSize();
lb_picture.setIcon(icon);
lb_picture.setSize(size);
}
}
});
button_2.setText("选择图片");
button_2.setBounds(231, 69, 97, 28);
panel.add(button_2);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
String name = tf_name.getText().trim();
if (picturePath == null || picturePath.equals("")) {
JOptionPane.showMessageDialog(null, "请选择图片文件。");
return;
}
File file = new File(picturePath);
try {
FileInputStream in = new FileInputStream(file);// 创建图片的输入流对象
Connection conn = DAO.getConn();// 获得数据库连接对象
String sql = "update tb_picture set name = ?,picture = ? where id = ?";// 定义修改数据记录的SQL语句
PreparedStatement ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setString(1, name); // 为第1个参数赋值
ps.setBinaryStream(2, in, (int) file.length());// 为第2个参数赋值
ps.setInt(3, Integer.parseInt(tf_id.getText()));// 为第3个参数赋值
int flag = ps.executeUpdate(); // 执行SQL语句,获得更新记录数
if (flag > 0) {
JOptionPane.showMessageDialog(null, "修改成功!");
} else {
JOptionPane.showMessageDialog(null, "修改失败!");
}
ps.close();// 关闭PreparedStatement对象
conn.close(); // 关闭连接
if (in != null) {
in.close();// 关闭IO流
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e2) {
e2.printStackTrace();
} catch (IOException e3) {
e3.printStackTrace();
}
}
});
button.setBounds(231, 109, 97, 28);
panel.add(button);
button.setText("修 改");

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setBounds(231, 151, 97, 28);
panel.add(button_1);
button_1.setText("退 出");

tf_id = new JTextField();
tf_id.setText("1");
tf_id.setBounds(83, 10, 122, 22);
panel.add(tf_id);

final JButton button_3 = new JButton();
button_3.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
int id = Integer.parseInt(tf_id.getText().trim());
Connection conn = DAO.getConn();
String sql = "select name,picture from tb_picture where id = ?";
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setInt(1, id); // 为参数赋值
rs = ps.executeQuery();
if (rs.next()) {
String name = rs.getString(1);
tf_name.setText(name);
byte[] bt = rs.getBytes(2);
Icon icon = new ImageIcon(bt);
Dimension size = lb_picture.getSize();
lb_picture.setIcon(icon);
lb_picture.setSize(size);
}
rs.close();
ps.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
button_3.setText("按编号查询");
button_3.setBounds(211, 7, 117, 28);
panel.add(button_3);

final JLabel label = new JLabel();
label.setText("编 号:");
label.setBounds(26, 12, 66, 18);
panel.add(label);
//
}

实例135 修改MySQL数据库中存储的图片
private JTextField tf_id;
private static final long serialVersionUID = 8339759858493972497L;
private JTextField tf_name;
private String picturePath = null;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UpdateMySQLPictureFrame frame = new UpdateMySQLPictureFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public UpdateMySQLPictureFrame() {
super();
setTitle("修改MySQL数据库中存储的图片");
setBounds(100, 100, 369, 248);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);

final JLabel label_1 = new JLabel();
label_1.setText("姓 名:");
label_1.setBounds(26, 46, 66, 18);
panel.add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("图 片:");
label_2.setBounds(26, 117, 66, 18);
panel.add(label_2);

tf_name = new JTextField();
tf_name.setBounds(83, 44, 245, 22);
panel.add(tf_name);

final JLabel lb_picture = new JLabel();
lb_picture.setOpaque(true);
lb_picture.setBackground(Color.PINK);
lb_picture.setBounds(83, 70, 139, 117);
panel.add(lb_picture);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(); // 创建文件对话框
// 创建文件过滤
FileFilter filter = new FileNameExtensionFilter(
"图像文件(*.gif;*.jpg;*.jpeg;*.png)", "gif", "jpg", "jpeg",
"png");
fileChooser.setFileFilter(filter); // 为文件对话框设置文件过滤器
int returnValue = fileChooser.showOpenDialog(null);// 打开文件选择对话框
if (returnValue == JFileChooser.APPROVE_OPTION) { // 判断是否选择了文件
File file = fileChooser.getSelectedFile(); // 获得文件对象
if (file.length() / 1024.0 > 50.0) {
JOptionPane
.showMessageDialog(null, "请选择小于等于50KB的图片文件。");
return;
}
picturePath = file.getAbsolutePath();
Icon icon = new ImageIcon(picturePath);
Dimension size = lb_picture.getSize();
lb_picture.setIcon(icon);
lb_picture.setSize(size);
}
}
});
button_2.setText("选择照片");
button_2.setBounds(231, 72, 97, 28);
panel.add(button_2);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
String name = tf_name.getText().trim();
if (picturePath == null || picturePath.equals("")) {
JOptionPane.showMessageDialog(null, "请选择图片文件。");
return;
}
File file = new File(picturePath);
try {
FileInputStream in = new FileInputStream(file);// 创建图片的输入流对象
Connection conn = DAO.getConn();// 获得数据库连接对象
String sql = "update tb_picture set name = ?,picture = ? where id = ?";// 定义修改数据记录的SQL语句
PreparedStatement ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setString(1, name); // 为第1个参数赋值
ps.setBinaryStream(2, in, (int) file.length());// 为第2个参数赋值
ps.setInt(3, Integer.parseInt(tf_id.getText()));// 为第3个参数赋值
int flag = ps.executeUpdate(); // 执行SQL语句,获得更新记录数
if (flag > 0) {
JOptionPane.showMessageDialog(null, "修改成功!");
} else {
JOptionPane.showMessageDialog(null, "修改失败!");
}
ps.close();// 关闭PreparedStatement对象
conn.close(); // 关闭连接
if (in != null) {
in.close();// 关闭IO流
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e2) {
e2.printStackTrace();
} catch (IOException e3) {
e3.printStackTrace();
}
}
});
button.setBounds(231, 112, 97, 28);
panel.add(button);
button.setText("修 改");

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setBounds(231, 154, 97, 28);
panel.add(button_1);
button_1.setText("退 出");

tf_id = new JTextField();
tf_id.setText("1");
tf_id.setBounds(83, 10, 122, 22);
panel.add(tf_id);

final JButton button_3 = new JButton();
button_3.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
int id = Integer.parseInt(tf_id.getText().trim());
Connection conn = DAO.getConn();
String sql = "select name,picture from tb_picture where id = ?";
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setInt(1, id); // 为参数赋值
rs = ps.executeQuery();
if (rs.next()) {
String name = rs.getString(1);
tf_name.setText(name);
Blob img = (Blob) rs.getBlob(2);
Icon icon = new ImageIcon(img.getBytes(1, (int) img
.length()));
Dimension size = lb_picture.getSize();
lb_picture.setIcon(icon);
lb_picture.setSize(size);
}
rs.close();
ps.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
button_3.setText("按编号查询");
button_3.setBounds(211, 7, 117, 28);
panel.add(button_3);

final JLabel label = new JLabel();
label.setText("编 号:");
label.setBounds(26, 12, 66, 18);
panel.add(label);
}

实例136 修改SQLServer数据库中存储的图片
private JTextField tf_id;
private static final long serialVersionUID = 8339759858493972497L;
private JTextField tf_name;
private String picturePath = null;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UpdateSQLServerPictureFrame frame = new UpdateSQLServerPictureFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public UpdateSQLServerPictureFrame() {
super();
setTitle("修改SQLServer数据库中存储的图片");
setBounds(100, 100, 369, 233);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);

final JLabel label_1 = new JLabel();
label_1.setText("姓 名:");
label_1.setBounds(26, 44, 66, 18);
panel.add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("图 片:");
label_2.setBounds(26, 115, 66, 18);
panel.add(label_2);

tf_name = new JTextField();
tf_name.setBounds(83, 42, 245, 22);
panel.add(tf_name);

final JLabel lb_picture = new JLabel();
lb_picture.setOpaque(true);
lb_picture.setBackground(Color.PINK);
lb_picture.setBounds(83, 68, 139, 117);
panel.add(lb_picture);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(); // 创建文件对话框
// 创建文件过滤
FileFilter filter = new FileNameExtensionFilter(
"图像文件(*.gif;*.jpg;*.jpeg;*.png)", "gif", "jpg", "jpeg",
"png");
fileChooser.setFileFilter(filter); // 为文件对话框设置文件过滤器
int returnValue = fileChooser.showOpenDialog(null);// 打开文件选择对话框
if (returnValue == JFileChooser.APPROVE_OPTION) { // 判断是否选择了文件
File file = fileChooser.getSelectedFile(); // 获得文件对象
if (file.length() / 1024.0 > 50.0) {
JOptionPane
.showMessageDialog(null, "请选择小于等于50KB的图片文件。");
return;
}
picturePath = file.getAbsolutePath();
Icon icon = new ImageIcon(picturePath);
Dimension size = lb_picture.getSize();
lb_picture.setIcon(icon);
lb_picture.setSize(size);
}
}
});
button_2.setText("选择图片");
button_2.setBounds(231, 70, 97, 28);
panel.add(button_2);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
String name = tf_name.getText().trim();
if (picturePath == null || picturePath.equals("")) {
JOptionPane.showMessageDialog(null, "请选择图片文件。");
return;
}
File file = new File(picturePath);
try {
FileInputStream in = new FileInputStream(file);// 创建图片的输入流对象
Connection conn = DAO.getConn();// 获得数据库连接对象
String sql = "update tb_picture set name = ?,picture = ? where id = ?";// 定义修改数据记录的SQL语句
PreparedStatement ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setString(1, name); // 为第1个参数赋值
ps.setBinaryStream(2, in, (int) file.length());// 为第2个参数赋值
ps.setInt(3, Integer.parseInt(tf_id.getText()));// 为第3个参数赋值
int flag = ps.executeUpdate(); // 执行SQL语句,获得更新记录数
if (flag > 0) {
JOptionPane.showMessageDialog(null, "修改成功!");
} else {
JOptionPane.showMessageDialog(null, "修改失败!");
}
ps.close();// 关闭PreparedStatement对象
conn.close(); // 关闭连接
if (in != null) {
in.close();// 关闭IO流
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e2) {
e2.printStackTrace();
} catch (IOException e3) {
e3.printStackTrace();
}
}
});
button.setBounds(231, 110, 97, 28);
panel.add(button);
button.setText("修 改");

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
button_1.setBounds(231, 152, 97, 28);
panel.add(button_1);
button_1.setText("退 出");

tf_id = new JTextField();
tf_id.setText("1");
tf_id.setBounds(83, 10, 122, 22);
panel.add(tf_id);

final JButton button_3 = new JButton();
button_3.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
int id = Integer.parseInt(tf_id.getText().trim());
Connection conn = DAO.getConn();
String sql = "select name,picture from tb_picture where id = ?";
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);// 创建PreparedStatement对象,并传递SQL语句
ps.setInt(1, id); // 为参数赋值
rs = ps.executeQuery();
if (rs.next()) {
String name = rs.getString(1);
tf_name.setText(name);
Blob img = (Blob) rs.getBlob(2);
Icon icon = new ImageIcon(img.getBytes(1, (int) img
.length()));
Dimension size = lb_picture.getSize();
lb_picture.setIcon(icon);
lb_picture.setSize(size);
}
rs.close();
ps.close();
conn.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
button_3.setText("按编号查询");
button_3.setBounds(211, 7, 117, 28);
panel.add(button_3);

final JLabel label = new JLabel();
label.setText("编 号:");
label.setBounds(26, 12, 66, 18);
panel.add(label);
}

6.3 其他应用
实例137 获取鼠标指针在任意位置的颜色值
private JTextField tf_blue;
private JTextField tf_green;
private JTextField tf_red;
private JTextField tf_y;
private JTextField tf_x;
private static final long serialVersionUID = -486745172657329259L;

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GainAnyPointColorFrame frame = new GainAnyPointColorFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public GainAnyPointColorFrame() {
super();
GainColor gc = new GainColor();// 创建GainColor对象
Thread thread = new Thread(gc);// 创建线程对象
thread.start();// 启动线程对象
getContentPane().setLayout(null);
setTitle("获取鼠标在任意位置的颜色值");
setBounds(100, 100, 300, 207);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JLabel label = new JLabel();
label.setText("鼠标所在点的X坐标:");
label.setBounds(26, 21, 126, 25);
getContentPane().add(label);

final JLabel label_1 = new JLabel();
label_1.setText("鼠标所在点的Y坐标:");
label_1.setBounds(26, 45, 126, 25);
getContentPane().add(label_1);

tf_x = new JTextField();
tf_x.setBounds(155, 22, 103, 22);
getContentPane().add(tf_x);

tf_y = new JTextField();
tf_y.setBounds(155, 46, 103, 22);
getContentPane().add(tf_y);

final JLabel label_2 = new JLabel();
label_2.setText("颜色的Red值:");
label_2.setBounds(26, 79, 97, 18);
getContentPane().add(label_2);

final JLabel label_3 = new JLabel();
label_3.setText("颜色的Green值:");
label_3.setBounds(26, 103, 111, 18);
getContentPane().add(label_3);

final JLabel label_4 = new JLabel();
label_4.setText("颜色的Blue值:");
label_4.setBounds(26, 127, 109, 18);
getContentPane().add(label_4);

tf_red = new JTextField();
tf_red.setBounds(155, 77, 103, 22);
getContentPane().add(tf_red);

tf_green = new JTextField();
tf_green.setBounds(155, 101, 103, 22);
getContentPane().add(tf_green);

tf_blue = new JTextField();
tf_blue.setBounds(155, 125, 103, 22);
getContentPane().add(tf_blue);

}

class GainColor implements Runnable {
@Override
public void run() {
while (true) {
PointerInfo mi = MouseInfo.getPointerInfo();// 鼠标指针当前位置的PointerInfo对象
Point p = mi.getLocation();// 获得屏幕上表示指针坐标的Point对象
int x = p.x;// 获得X坐标
int y = p.y;// 获得Y坐标
try {
Robot robot = new Robot();// 创建Robot对象
Color color = robot.getPixelColor(x, y);// 获得屏幕指定位置的颜色对象
int r = color.getRed();// 获得颜色的R值
int g = color.getGreen();// 获得颜色的G值
int b = color.getBlue();// 获得颜色的B值
tf_x.setText(String.valueOf(x));// 显示X坐标值
tf_y.setText(String.valueOf(y));// 显示Y坐标值
tf_red.setText(String.valueOf(r));// 显示颜色的R值
tf_green.setText(String.valueOf(g));// 显示颜色的G值
tf_blue.setText(String.valueOf(b));// 显示颜色的B值
Thread.sleep(10);// 线程休眠10毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
}

}

实例138 图片浏览器
private JTextField tf_path;
private BufferedImage img=null;
private File imgFile = null;
private DrawImagePanel imgPanel = null;
private String filePath = null;
private String currentFileName = null;
private int currentFileIndex = 0;
private List<String> fileNameList = new ArrayList<String>();
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
BrowerPictureFrame frame = new BrowerPictureFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public BrowerPictureFrame() {
super();
setTitle("图片浏览器");
setBounds(100, 100, 457, 328);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
imgPanel = new DrawImagePanel();
final JPanel panel = new JPanel();
getContentPane().add(imgPanel, BorderLayout.CENTER);
final FlowLayout flowLayout = new FlowLayout();
flowLayout.setAlignment(FlowLayout.LEFT);
panel.setLayout(flowLayout);
getContentPane().add(panel, BorderLayout.NORTH);

final JLabel label = new JLabel();
label.setText("选择文件:");
panel.add(label);

tf_path = new JTextField();
tf_path.setPreferredSize(new Dimension(280,25));
panel.add(tf_path);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/BMP)", "JPG", "JPEG", "GIF", "BMP");// 创建过滤器
fileChooser.setFileFilter(filter);// 设置过滤器
int flag = fileChooser.showOpenDialog(null);// 显示打开对话框
if (flag == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中图片的File对象
}
if (imgFile != null) {
try {
img = ImageIO.read(imgFile);// 构造BufferedImage对象
filePath = imgFile.getParent();// 获得文件的路径
tf_path.setText(filePath);// 在文本框中显示路径
currentFileName = imgFile.getName();// 获得选择的文件名,赋值给存储当前文件的变量
final String extName = currentFileName.substring(currentFileName.lastIndexOf("."));// 获得文件的扩展名
File pathFile = new File(filePath);// 创建路径的File对象
String[] fileNames = pathFile.list(new FilenameFilter(){// 获得满足过滤条件的文件名数组
@Override
public boolean accept(File dir, String name) {
return name.endsWith(extName);// 返回满足扩展名的文件名
}
});
for (int i=0;i<fileNames.length;i++){// 遍历数组中的文件名
if (fileNames[i].equals(currentFileName)){// 判断是否为当前文件
currentFileIndex = i;// 记忆当前文件的索引值
}
fileNameList.add(fileNames[i]);// 将文件添加到集合列表中
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
imgPanel.repaint();// 调用paint()方法
}
});
button.setText("选 择");
panel.add(button);

final JPanel panel_1 = new JPanel();
getContentPane().add(panel_1, BorderLayout.SOUTH);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
currentFileIndex = 0;// 第一张图片的索引
imgFile = new File(filePath+"/"+fileNameList.get(currentFileIndex).toString());// 创建当前索引值对应图片的File对象
try {
img = ImageIO.read(imgFile);// 创建当前图片的图像对象
imgPanel.repaint();// 调用paint()方法
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
button_1.setText("第一张");
panel_1.add(button_1);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
currentFileIndex--;// 调整当前图片的索引值
if (currentFileIndex < 0) {
currentFileIndex = fileNameList.size() - 1;// 当前图片索引为最后一张图片的索引
}
imgFile = new File(filePath+"/"+fileNameList.get(currentFileIndex).toString());// 创建当前索引值对应图片的File对象
try {
img = ImageIO.read(imgFile);// 创建当前图片的图像对象
imgPanel.repaint();// 调用paint()方法,显示图片
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
button_2.setText("上一张");
panel_1.add(button_2);

final JButton button_3 = new JButton();
button_3.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
currentFileIndex++;// 调整当前图片的索引值
if (currentFileIndex > fileNameList.size() - 1) {
currentFileIndex = 0;// 当前图片索引为第一张图片的索引
}
imgFile = new File(filePath+"/"+fileNameList.get(currentFileIndex).toString());// 创建当前索引值对应图片的File对象
try {
img = ImageIO.read(imgFile);// 创建当前图片的图像对象
imgPanel.repaint();// 调用paint()方法
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
button_3.setText("下一张");
panel_1.add(button_3);

final JButton button_4 = new JButton();
button_4.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
currentFileIndex = fileNameList.size() - 1;// 最后一张图片的索引
imgFile = new File(filePath+"/"+fileNameList.get(currentFileIndex).toString());// 创建当前索引值对应图片的File对象
try {
img = ImageIO.read(imgFile);// 创建当前图片的图像对象
imgPanel.repaint();// 调用paint()方法
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
button_4.setText("最后一张");
panel_1.add(button_4);
}
// 创建面板类
class DrawImagePanel extends JPanel {
public void paint(Graphics g) {
if (img == null){
return;
}
int imgW = img.getWidth(this);
int imgH = img.getHeight(this);
int panelW = getWidth();
int panelH = getHeight();
g.clearRect(0, 0, panelW, panelH);
g.drawImage(img, 0, 0,imgW,imgH,this); // 绘制指定的图片
}
}

实例139 转换图片格式
private JComboBox comboBox;
private JTextField tf_pathAndFileName;
private File imgFile = null;
private BufferedImage buffImage;
private DrawImagePanel imagePanel = null;
private String path = null;
private String fileName = null;
private String pathAndFileName = null;
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ConversionPictureFormatFrame frame = new ConversionPictureFormatFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame
*/
public ConversionPictureFormatFrame() {
super();
setTitle("转换图片格式");
setBounds(100, 100, 432, 315);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.NORTH);

imagePanel = new DrawImagePanel();
getContentPane().add(imagePanel, BorderLayout.CENTER);

final JLabel label = new JLabel();
label.setText("请选择原图片:");
panel.add(label);

tf_pathAndFileName = new JTextField();
tf_pathAndFileName.setPreferredSize(new Dimension(200,25));
panel.add(tf_pathAndFileName);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
FileFilter filter = new FileNameExtensionFilter(
"图像文件(JPG/GIF/png/bmp)", "JPG", "JPEG", "GIF", "png", "bmp");// 创建过滤器
fileChooser.setFileFilter(filter);// 设置过滤器
int i = fileChooser.showOpenDialog(null);// 显示打开对话框
if (i == JFileChooser.APPROVE_OPTION) {
imgFile = fileChooser.getSelectedFile(); // 获取选中图片的File对象
}
if (imgFile != null) {
try {
buffImage = ImageIO.read(imgFile);// 构造BufferedImage对象
path = imgFile.getParent();
fileName = imgFile.getName();
pathAndFileName = path + "\\" + fileName;
tf_pathAndFileName.setText(pathAndFileName);
} catch (IOException ex) {
ex.printStackTrace();
}
}
imagePanel.repaint();// 调用paint()方法
}
});
button.setText("选择图片");
panel.add(button);

final JPanel panel_1 = new JPanel();
getContentPane().add(panel_1, BorderLayout.SOUTH);

final JLabel label_1 = new JLabel();
label_1.setText("请选择转换后的图片格式:");
panel_1.add(label_1);

comboBox = new JComboBox();
comboBox.setPreferredSize(new Dimension(130,25));
comboBox.setModel(new DefaultComboBoxModel(new String[] {"jpg", "gif", "png", "bmp"}));
panel_1.add(comboBox);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
try {
String extName = (String)comboBox.getSelectedItem();// 新格式的扩展名,不含点
String pathAndName = pathAndFileName.substring(0, pathAndFileName.lastIndexOf(".") + 1)+extName;// 转换后的图片完整路径和文件名
File file = new File(pathAndName);// 创建转换后图片的File对象
ImageIO.write(buffImage, extName, file);// 将缓冲图像保存到磁盘
File oldFile = new File(pathAndFileName);// 原图片的File对象
oldFile.delete();// 删除原图片文件
JOptionPane.showMessageDialog(null, "文件格式更改成功!");// 显示提示信息
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "保存失败\n" + e1.getMessage());// 显示提示信息
}
}
});
button_1.setText("保 存");
panel_1.add(button_1);

}
// 创建面板类
class DrawImagePanel extends JPanel {
public void paint(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
g.drawImage(buffImage, 0, 0, this); // 绘制指定的图片
}
}

实例140 绘制石英钟
ClockFrame.java
private float opqua = 0.7f;
private ClockPanel clockPanel;
private Point fp; // 拖曳窗体之前的鼠标位置

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ClockFrame frame = new ClockFrame();// 创建窗体对象
frame.setVisible(true);// 显示窗体
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* 布局窗体的构造方法
*/
public ClockFrame() {
super();
setUndecorated(true);// 取消窗体修饰
setAlwaysOnTop(true);// 窗体置顶
setTitle("明日科技石英钟");// 设置窗体标题
getContentPane().setLayout(new BorderLayout());
setBounds(100, 30, 217, 257);
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
clockPanel = new ClockPanel();// 创建时钟面板
getContentPane().add(clockPanel);
// 为时钟面板添加鼠标按键事件监听器
clockPanel.addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent e) {
fp = e.getPoint();
if (e.getButton()==MouseEvent.BUTTON3){
System.exit(0);// 右键退出
}
}
});
// 在时钟面板的鼠标拖曳事件中移动窗体
clockPanel.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent e) {
JDialog frame = (JDialog) getRootPane().getParent();
Point point = e.getLocationOnScreen();
frame.setLocation(point.x - fp.x, point.y - fp.y);
}
});
pack();

addKeyListener(new KeyAdapter() {// 为窗体添加键盘事件监听器
public void keyPressed(final KeyEvent e) {
int code = e.getKeyCode();
switch (code) {// 判断按键编码
case KeyEvent.VK_ADD:// +符号按键会降低透明图
opqua += 0.05;
opqua = opqua > 0.95f ? 1f : opqua;
break;
case KeyEvent.VK_SUBTRACT:// -符号按键会提升透明度
opqua -= 0.05;
opqua = opqua < 0.1f ? 0.1f : opqua;
break;
}
// 如果按Ctrl+Shift+X組合鍵,将退出程序
if (code == KeyEvent.VK_X
&& e.getModifiersEx() == (KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK))
System.exit(0);
AWTUtilities.setWindowOpacity(ClockFrame.this, opqua);// 更新窗体透明度
}
});

AWTUtilities.setWindowOpacity(this, opqua);
Dimension screenSize = getToolkit().getScreenSize();
double width = screenSize.getWidth();
int x = (int) (width - getWidth() - 30);
setLocation(x, 30);

new Thread() {// 创建线程对象,更新时钟面板界面
@Override
public void run() {
try {
while (true) {
sleep(1000);// 休眠1秒
clockPanel.repaint();// 重新绘制时钟面板界面
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}

ClockPanel.java
private static final BasicStroke HOURS_POINT_WIDTH = new BasicStroke(4);
private static final BasicStroke MINUETES_POINT_WIDTH = new BasicStroke(3);
private static final BasicStroke SEC_POINT_WIDTH = new BasicStroke(2);
ImageIcon background;// 背景图片对象
private int centerX;// 中心坐标
private int centerY;// 中心坐标
private final static int secLen = 60; // 指针长度
private final static int minuesLen = 55; // 指针长度
private final static int hoursLen = 36; // 指针长度

/**
* 构造方法
*/
public ClockPanel() {
setToolTipText("小键盘+、-调整透明度,Crtl+Shift+X退出");// 提示信息
setOpaque(false);

background = new ImageIcon(getClass().getResource("clock.jpg"));// 加载图片
int iconWidth = background.getIconWidth();// 获取图片大小
centerX = iconWidth / 2;// 获取图片中间坐标
int iconHeight = background.getIconHeight();
centerY = iconHeight / 2;// 获取图片中间坐标
setPreferredSize(new Dimension(iconWidth, iconHeight));
}

@Override
public void paint(Graphics g) {// 重写父类方法
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(background.getImage(), 0, 0, this);// 绘制背景图片
Calendar calendar = Calendar.getInstance();// 获取日历对象
int millisecond = calendar.get(MILLISECOND);// 获取毫秒值
int sec = calendar.get(SECOND);// 获取秒值
int minutes = calendar.get(MINUTE);// 获取分值
int hours = calendar.get(HOUR);// 获取时值
String dateStr = calendar.get(YEAR) + "年" + (calendar.get(MONTH) + 1)
+ "月" + calendar.get(DAY_OF_MONTH) + "日";// 当前日期字符串
int weekDay = calendar.get(DAY_OF_WEEK) - 1;// 当前星期值
String weekStr = "";
if (weekDay == 0) {
weekStr = "星期日";
} else {
weekStr = "星期" + weekDay;
}

{// 绘制日期与星期
g2.setColor(Color.BLACK);// 设置背景色
g2.setFont(new Font("楷体", Font.BOLD, 12));// 设置字体
// 获取字体渲染上下文
FontRenderContext fontRenderContext = g2.getFontRenderContext();
// 计算日期字符串的边界大小
Rectangle2D dateStrBounds = getFont().getStringBounds(dateStr,
fontRenderContext);
// 在时钟下半部绘制日期
g2.drawString(dateStr,
(int) (centerX - dateStrBounds.getWidth() / 2),
centerY + 20);
// 改变字体大小
g2.setFont(new Font("楷体", Font.BOLD, 14));
// 计算星期字符串边界大小
Rectangle2D weekStrBounds = getFont().getStringBounds(weekStr,
fontRenderContext);
// 绘制星期字符串
g2.drawString(weekStr,
(int) (centerX - weekStrBounds.getWidth() / 2),
centerY + 35);
}
double secAngle = (60 - sec) * 6 - (millisecond / 150); // 秒针角度
int minutesAngle = (60 - minutes) * 6;// 分针角度
int hoursAngle = (12 - hours) * 360 / 12 - (minutes / 2);// 时针角度
// 计算秒针、分针、时针指向的坐标
int secX = (int) (secLen * Math.sin(Math.toRadians(secAngle)));// 秒针指向点的X坐标
int secY = (int) (secLen * Math.cos(Math.toRadians(secAngle))); // 秒针指向点的Y坐标
int minutesX = (int) (minuesLen * Math
.sin(Math.toRadians(minutesAngle))); // 分针指向点的X坐标
int minutesY = (int) (minuesLen * Math
.cos(Math.toRadians(minutesAngle))); // 分针指向点的Y坐标
int hoursX = (int) (hoursLen * Math.sin(Math.toRadians(hoursAngle))); // 时针指向点的X坐标
int hoursY = (int) (hoursLen * Math.cos(Math.toRadians(hoursAngle))); // 时针指向点的Y坐标
// 分别绘制时针、分针、秒针
g2.setStroke(HOURS_POINT_WIDTH);// 设置时针的宽度
g2.setColor(Color.BLACK);// 设置时针的颜色
g2.drawLine(centerX, centerY, centerX - hoursX, centerY - hoursY);// 绘制时针
g2.setStroke(MINUETES_POINT_WIDTH);// 设置分针的宽度
if (minutesAngle != hoursAngle) // 分针、时针重叠变色
g2.setColor(new Color(0x2F2F2F));// 设置未重叠时的颜色
else {
g2.setColor(Color.GREEN);// 设置重叠时的颜色
}
g2.drawLine(centerX, centerY, centerX - minutesX, centerY - minutesY);// 绘制分针
g2.setStroke(SEC_POINT_WIDTH);// 设置秒针的宽度
if (secAngle != hoursAngle && secAngle != minutesAngle)// 分针、时针、秒针重叠变色
g2.setColor(Color.ORANGE);// 设置未重叠时的颜色
else {
g2.setColor(Color.GREEN);// 设置重叠时的颜色
}
// 绘制3个指针的中心圆和秒针
g2.fillOval(centerX - 5, centerY - 5, 10, 10);// 绘制中心圆
g2.drawLine(centerX, centerY, centerX - secX, centerY - secY);// 绘制秒针
g2.drawLine(centerX + 1, centerY + 1, centerX - secX + 1, centerY
- secY + 1);// 绘制秒针
}

实例141 画图程序
DrawPictureFrame.java
BufferedImage image = new BufferedImage(570, 390,
BufferedImage.TYPE_INT_BGR);
Graphics gs = image.getGraphics(); // 获得图像的绘图上下文对象
Graphics2D g = (Graphics2D) gs; // 将绘图上下文对象转换为Graphics2D类型
DrawPictureCanvas canvas = new DrawPictureCanvas(); // 创建画布对象
Color foreColor = Color.BLACK; // 定义前景色
Color backgroundColor = Color.WHITE; // 定义背景色
boolean rubber = false; // 橡皮标识变量
int x = -1; // 上一次鼠标绘制点的横坐标
int y = -1; // 上一次鼠标绘制点的纵坐标
private JMenuItem newItemMenuItem_6 = null;

public DrawPictureFrame() {
super();
setResizable(false);
setTitle("画图程序");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setBounds(100, 80, 574, 397);
g.setColor(backgroundColor); // 用背景色设置绘图上下文对象的颜色
g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布
g.setColor(foreColor); // 用前景色设置绘图上下文对象的颜色
canvas.setImage(image); // 设置画布的图像
getContentPane().add(canvas); // 将画布添加到窗体容器默认布局的中部位置
canvas.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent e) {
if (rubber) { // 橡皮标识为true,表示使用橡皮
if (x > 0 && y > 0) {
g.setColor(backgroundColor); // 用背景色设置绘图上下文对象的颜色
g.fillRect(x, y, 10, 10); // 擦除鼠标经过位置的图像
}
x = e.getX(); // 获得鼠标在画布上的横坐标
y = e.getY(); // 获得鼠标在画布上的纵坐标
} else { // 橡皮标识为false,表示画图
if (x > 0 && y > 0) {
// 在鼠标经过处画直线
g.drawLine(x, y, e.getX(), e.getY());
}
x = e.getX(); // 上一次鼠标绘制点的横坐标
y = e.getY(); // 上一次鼠标绘制点的纵坐标
}
canvas.repaint(); // 更新画布
}

public void mouseMoved(final MouseEvent arg0) {
if (rubber) {
// 设置鼠标指针的形状
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
} else {
// 设置鼠标指针的形状
setCursor(Cursor
.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
}
});
canvas.addMouseListener(new MouseAdapter() {
public void mouseReleased(final MouseEvent arg0) {
x = -1; // 上一次鼠标绘制点的横坐标
y = -1; // 上一次鼠标绘制点的纵坐标
}
});
final JToolBar toolBar = new JToolBar();
toolBar.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(final MouseEvent arg0) {
// 设置鼠标指针的形状
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
});
getContentPane().add(toolBar, BorderLayout.NORTH);
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 声明画笔的属性,粗细为1像素
BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER);
g.setStroke(bs); // 设置绘图上下文对象的画笔
}
});
button.setText(" 细 线 ");
toolBar.add(button);
final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 声明画笔的属性,粗细为2像素
BasicStroke bs = new BasicStroke(2, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER);
g.setStroke(bs); // 设置绘图上下文对象的画笔
}
});
button_1.setText(" 粗 线 ");
toolBar.add(button_1);

final JButton button_2 = new JButton();
button_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 声明画笔的属性,粗细为4像素
BasicStroke bs = new BasicStroke(4, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER);
g.setStroke(bs); // 设置绘图上下文对象的画笔
}
});
button_2.setText(" 较 粗 ");
toolBar.add(button_2);
final JButton button_3 = new JButton();
button_3.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 打开选择颜色对话框
Color bgColor = JColorChooser.showDialog(null, "选择颜色对话框",
Color.CYAN);
if (bgColor != null) {
backgroundColor = bgColor;
}
g.setColor(backgroundColor); // 设置绘图上下文对象的背景色
g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布
g.setColor(foreColor); // 设置绘图上下文对象的前景色
canvas.repaint(); // 更新画布
}
});
button_3.setText("背景颜色");
toolBar.add(button_3);
final JButton button_4 = new JButton();
button_4.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
// 打开选择颜色对话框
Color fColor = JColorChooser.showDialog(null, "选择颜色对话框",
Color.CYAN);
if (fColor != null) {
foreColor = fColor;
}
g.setColor(foreColor); // 设置绘图上下文对象的前景色
}
});
button_4.setText("前景颜色");
toolBar.add(button_4);
final JButton button_5 = new JButton();
button_5.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
g.setColor(backgroundColor); // 设置绘图上下文对象的背景色
g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布
g.setColor(foreColor); // 设置绘图上下文对象的前景色
canvas.repaint(); // 更新画布
}
});
button_5.setText(" 清 除 ");
toolBar.add(button_5);

final JButton button_6 = new JButton();
button_6.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
if (button_6.getText().equals(" 橡 皮 ")) { // 单击工具栏上的橡皮按钮,使用橡皮
rubber = true; // 设置橡皮标识为true
newItemMenuItem_6.setText("画 图"); // 改变菜单上显示的文本为画图
button_6.setText(" 画 图 "); // 改变按钮上显示的文本为画图
} else { // 单击工具栏上的画图按钮,使用画笔
rubber = false; // 设置橡皮标识为false
newItemMenuItem_6.setText("橡 皮"); // 改变菜单上显示的文本为橡皮
button_6.setText(" 橡 皮 "); // 改变按钮上显示的文本为橡皮
g.setColor(foreColor); // 设置绘图上下文对象的前景色
}
}
});
button_6.setText(" 橡 皮 ");
toolBar.add(button_6);

final JButton button_7 = new JButton();
button_7.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
System.exit(0); // 退出应用程序
}
});
button_7.setText(" 退 出 ");
toolBar.add(button_7);

final JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);

final JMenu menu = new JMenu();
menu.setText("线 型");
menuBar.add(menu);

final JMenuItem newItemMenuItem = new JMenuItem();
newItemMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 声明画笔的属性,粗细为1像素
BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER);
g.setStroke(bs); // 设置绘图上下文对象的画笔
}
});
newItemMenuItem.setText("细 线");
menu.add(newItemMenuItem);

final JMenuItem newItemMenuItem_1 = new JMenuItem();
newItemMenuItem_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 声明画笔的属性,粗细为2像素
BasicStroke bs = new BasicStroke(2, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER);
g.setStroke(bs); // 设置绘图上下文对象的画笔
}
});
newItemMenuItem_1.setText("粗 线");
menu.add(newItemMenuItem_1);

final JMenuItem newItemMenuItem_2 = new JMenuItem();
newItemMenuItem_2.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 声明画笔的属性,粗细为4像素
BasicStroke bs = new BasicStroke(4, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER);
g.setStroke(bs); // 设置绘图上下文对象的画笔
}
});
newItemMenuItem_2.setText("较 粗");
menu.add(newItemMenuItem_2);

final JMenu menu_1 = new JMenu();
menu_1.setText("颜 色");
menuBar.add(menu_1);

final JMenuItem newItemMenuItem_3 = new JMenuItem();
newItemMenuItem_3.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打开选择颜色对话框
Color fColor = JColorChooser.showDialog(null, "选择颜色对话框",
Color.CYAN);
if (fColor != null) {
foreColor = fColor;
}
g.setColor(foreColor); // 设置绘图上下文对象的前景色
}
});
newItemMenuItem_3.setText("前景颜色");
menu_1.add(newItemMenuItem_3);

final JMenuItem newItemMenuItem_4 = new JMenuItem();
newItemMenuItem_4.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// 打开选择颜色对话框
Color bgColor = JColorChooser.showDialog(null, "选择颜色对话框",
Color.CYAN);
if (bgColor != null) {
backgroundColor = bgColor;
}
g.setColor(backgroundColor); // 设置绘图上下文对象的背景色
g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布
g.setColor(foreColor); // 设置绘图上下文对象的前景色
canvas.repaint(); // 更新画布
}
});
newItemMenuItem_4.setText("背景颜色");
menu_1.add(newItemMenuItem_4);

final JMenu menu_2 = new JMenu();
menu_2.setText("编 辑");
menuBar.add(menu_2);

final JMenuItem newItemMenuItem_5 = new JMenuItem();
newItemMenuItem_5.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
g.setColor(backgroundColor); // 设置绘图上下文对象的背景色
g.fillRect(0, 0, 570, 390); // 用背景色填充整个画布
g.setColor(foreColor); // 设置绘图上下文对象的前景色
canvas.repaint(); // 更新画布
}
});
newItemMenuItem_5.setText("清 除");
menu_2.add(newItemMenuItem_5);

newItemMenuItem_6 = new JMenuItem();
newItemMenuItem_6.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (newItemMenuItem_6.getText().equals("橡 皮")) { // 单击橡皮菜单,使用橡皮
rubber = true; // 设置橡皮标识为true
newItemMenuItem_6.setText("画 图"); // 改变菜单上显示的文本为画图
button_6.setText(" 画 图 "); // 改变按钮上显示的文本为画图
} else { // 单击工具栏上的画图按钮,使用画笔
rubber = false; // 设置橡皮标识为false
newItemMenuItem_6.setText("橡 皮"); // 改变菜单上显示的文本为橡皮
button_6.setText(" 橡 皮 "); // 改变按钮上显示的文本为橡皮
g.setColor(foreColor); // 设置绘图上下文对象的前景色
}
}
});
newItemMenuItem_6.setText("橡 皮");
menu_2.add(newItemMenuItem_6);

final JMenu menu_3 = new JMenu();
menu_3.setText("系统");
menuBar.add(menu_3);

final JMenuItem newItemMenuItem_8 = new JMenuItem();
newItemMenuItem_8.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
newItemMenuItem_8.setText("退 出");
menu_3.add(newItemMenuItem_8);
}

public static void main(String[] args) {
DrawPictureFrame frame = new DrawPictureFrame();
frame.setVisible(true);
}

DrawPictureCanvas.java
private Image image = null; // 定义Image对象的引用
public DrawPictureCanvas() {
super();
}
public void setImage(Image image) {
this.image = image; // 为成员变量赋值
}
/*
* 重写paint()方法,在画布上绘制图像
*/
public void paint(Graphics g) {
g.drawImage(image, 0, 0, null); // 在画布上绘制图像
}
/*
* 重写update()方法,这样可以解决屏幕闪耀的问题
*/
public void update(Graphics g) {
paint(g); // 调用paint方法
}

实例142 屏幕抓图程序
private PartZoomInPanel partZoomInPanel = null;// 声明图像面板对象
private int pressPanelX = 0, pressPanelY = 0;// 鼠标按下点的X、Y坐标
private int pressX = 0, pressY = 0;// 鼠标按下点在屏幕上的X、Y坐标
private int releaseX = 0, releaseY = 0;// 鼠标释放点在屏幕上的X、Y坐标
private Robot robot = null;// 声明Robot对象
private BufferedImage buffImage = null;// 声明缓冲图像对象
private boolean flag = false;// 声明标记变量,为true时显示选择区域的矩形,否则不显示
private Rectangle rect = null;

public static void main(String args[]) {
CaptureScreenImageFrame frame;
try {
frame = new CaptureScreenImageFrame("屏幕抓图程序");
frame.setVisible(true);
} catch (AWTException e) {
e.printStackTrace();
}
}

public CaptureScreenImageFrame(String title) throws AWTException {
super(title);
setAlwaysOnTop(true);
partZoomInPanel = new PartZoomInPanel(); // 创建图像面板对象
Toolkit toolkit = getToolkit();
Dimension dim = toolkit.getScreenSize();
setBounds(0, 0, dim.width, dim.height - 30); // 设置窗体大小和位置
setUndecorated(true);// 取消窗体修饰
AWTUtilities.setWindowOpacity(this, 0.01f);// 设置窗体透明
getContentPane().add(partZoomInPanel, BorderLayout.CENTER);
robot = new Robot();// 创建Robot对象
rect = new Rectangle(0, 0, dim.width, dim.height);// 创建Rectangle对象
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
partZoomInPanel.addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent e) { // 鼠标键按下事件
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
partZoomInPanel.repaint();
AWTUtilities.setWindowOpacity(CaptureScreenImageFrame.this, 1f);// 设置窗体为不透明
pressPanelX = e.getX(); // 获得鼠标按下点的X坐标
pressPanelY = e.getY();// 获得鼠标按下点的Y坐标
pressX = e.getXOnScreen() + 1;// 鼠标按下点在屏幕上的X坐标加1,即去除选择线
pressY = e.getYOnScreen() + 1;// 鼠标按下点在屏幕上的Y坐标加1,即去除选择线
flag = true;// 为标记变量赋值为true
}

public void mouseReleased(final MouseEvent e) { // 鼠标键释放事件
releaseX = e.getXOnScreen() - 1;// 鼠标释放点在屏幕上的X坐标减1,即去除选择线
releaseY = e.getYOnScreen() - 1;// 鼠标释放点在屏幕上的Y坐标减1,即去除选择线
try {
if (releaseX - pressX > 0 && releaseY - pressY > 0) {
Rectangle rect = new Rectangle(pressX, pressY, releaseX
- pressX, releaseY - pressY);// 创建Rectangle对象
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
FileOutputStream out = new FileOutputStream("c:/zzkkee.jpg");// 保存位置的输出流对象
ImageIO.write(buffImage, "jpg", out);// 写入磁盘
out.flush();
out.close();
}
} catch (FileNotFoundException e2) {
e2.printStackTrace();
} catch (IOException e3) {
e3.printStackTrace();
}
flag = false; // 为标记变量赋值为false
if (e.getButton() == MouseEvent.BUTTON1) {// 单击鼠标右键
CaptureScreenImageFrame.this.dispose();
CaptureScreenImageFrame frame;
try {
frame = new CaptureScreenImageFrame("屏幕抓图程序");
AWTUtilities.setWindowOpacity(frame, 0.01f);
frame.setVisible(true);
} catch (AWTException e1) {
e1.printStackTrace();
}
}
}

public void mouseClicked(final MouseEvent e) { // 鼠标键单击事件
if (e.getButton() == MouseEvent.BUTTON3) {// 单击鼠标右键
System.exit(0);// 退出系统
}
}
});
partZoomInPanel.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent e) {// 鼠标拖动事件
if (flag) {
releaseX = e.getXOnScreen();// 获得鼠标释放点在屏幕上的X坐标
releaseY = e.getYOnScreen();// 获得鼠标释放点在屏幕上的Y坐标
partZoomInPanel.repaint();// 调用PartZoomInPanel面板的paint()方法
}
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
}

class PartZoomInPanel extends JPanel {// 创建绘制原图像的面板类
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(buffImage, 0, 0, PartZoomInPanel.this);
g2.setColor(Color.BLACK);
if (flag) {
float[] arr = { 5.0f }; // 创建虚线模式的数组
BasicStroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_BEVEL, 1.0f, arr, 0); // 创建宽度是1的平头虚线笔画对象
g2.setStroke(stroke);// 设置笔画对象
g2.drawRect(pressPanelX, pressPanelY, releaseX - pressX,
releaseY - pressY);// 绘制矩形选区
}
}
}

实例143 屏幕放大镜
private PartZoomInPanel partZoomInPanel = null; // 声明图像面板对象
private int pressPanelX = 0, pressPanelY = 0;// 鼠标按下点的X、Y坐标
private int pressX = 0, pressY = 0;// 鼠标按下点在屏幕上的X、Y坐标
private int releaseX = 0, releaseY = 0;// 鼠标释放点在屏幕上的X、Y坐标
private Robot robot = null; // 声明Robot对象
private BufferedImage buffImage = null; // 声明缓冲图像对象
private BufferedImage zoomBuffImage = null; // 声明缓冲图像对象
private boolean flag = false; // 声明标记变量,为true时显示选择区域的矩形,否则不显示
private boolean mouseFlag = false;// 进行放大图像的标记变量,为true时进行放大,否则不放大
private Rectangle rect = null;
private Dimension dim = null;

public static void main(String args[]) {
ScreenZoomInFrame frame;
try {
frame = new ScreenZoomInFrame("屏幕放大镜");
frame.setVisible(true);
} catch (AWTException e) {
e.printStackTrace();
}

}

public ScreenZoomInFrame(String title) throws AWTException {
super(title);
getContentPane().addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
if (e.getButton()==MouseEvent.BUTTON3) {
System.exit(0);// 单击鼠标右键退出
}
}
});
setAlwaysOnTop(true);
partZoomInPanel = new PartZoomInPanel(); // 创建图像面板对象
Toolkit toolkit = getToolkit();
dim = toolkit.getScreenSize();
setBounds(0, 0, dim.width, dim.height - 30); // 设置窗体大小和位置
setUndecorated(true);
getContentPane().add(partZoomInPanel, BorderLayout.CENTER);
AWTUtilities.setWindowOpacity(this, 0.01f);
robot = new Robot();// 创建Robot对象
rect = new Rectangle(0, 0, dim.width, dim.height);// 创建Rectangle对象
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
addWindowFocusListener(new WindowFocusListener() {
public void windowGainedFocus(final WindowEvent e) {
}

public void windowLostFocus(final WindowEvent e) {
flag = false;// 为标记变量赋值为true
mouseFlag = false;// 将标记设置为false
AWTUtilities.setWindowOpacity(ScreenZoomInFrame.this, 0.01f);
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
partZoomInPanel.repaint();
AWTUtilities.setWindowOpacity(ScreenZoomInFrame.this, 1f);
robot.mouseMove(200, 730);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
}
});
//
partZoomInPanel.addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent e) { // 鼠标键按下事件
AWTUtilities.setWindowOpacity(ScreenZoomInFrame.this, 0.01f);
buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
partZoomInPanel.repaint();
AWTUtilities.setWindowOpacity(ScreenZoomInFrame.this, 1f);
pressPanelX = e.getX(); // 获得鼠标按下点的X坐标
pressPanelY = e.getY();// 获得鼠标按下点的Y坐标
pressX = e.getXOnScreen() + 1;// 鼠标按下点在屏幕上的X坐标加1,即去除选择线
pressY = e.getYOnScreen() + 1;// 鼠标按下点在屏幕上的Y坐标加1,即去除选择线
flag = true;// 为标记变量赋值为true
mouseFlag = false;// 将标记设置为false
}

public void mouseReleased(final MouseEvent e) { // 鼠标键释放事件
releaseX = e.getXOnScreen() - 1;// 鼠标释放点在屏幕上的X坐标减1,即去除选择线
releaseY = e.getYOnScreen() - 1;// 鼠标释放点在屏幕上的Y坐标减1,即去除选择线
if (releaseX - pressX > 0 && releaseY - pressY > 0) {
Rectangle rect = new Rectangle(pressX, pressY, releaseX
- pressX, releaseY - pressY);// 创建Rectangle对象
zoomBuffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象
}
flag = false;// 为标记变量赋值为false
mouseFlag = true;// 标记为true,进行放大
partZoomInPanel.repaint();// 调用paint()方法,实现放大
}

public void mouseClicked(final MouseEvent e) { // 鼠标键单击事件
if (e.getButton() == MouseEvent.BUTTON3) {// 单击鼠标右键
System.exit(0);// 退出系统
}
mouseFlag = false;// 将标记设置为false,不放大图像
partZoomInPanel.repaint();// 调用PartZoomInPanel面板的paint()方法
}
});
partZoomInPanel.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent e) {// 鼠标拖动事件
if (flag) {
releaseX = e.getXOnScreen();// 获得鼠标释放点在屏幕上的X坐标
releaseY = e.getYOnScreen();// 获得鼠标释放点在屏幕上的Y坐标
partZoomInPanel.repaint();// 调用PartZoomInPanel面板的paint()方法
}
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
}

class PartZoomInPanel extends JPanel {// 创建面板类
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(buffImage, 0, 0, this);// 绘制图像
g2.setColor(Color.BLACK);
if (flag) {
float[] arr = { 5.0f }; // 创建虚线模式的数组
BasicStroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_BEVEL, 1.0f, arr, 0); // 创建宽度是1的平头虚线笔画对象
g2.setStroke(stroke);// 设置笔画对象
g2.drawRect(pressPanelX, pressPanelY, releaseX - pressX,
releaseY - pressY);// 绘制矩形选区
}

if (mouseFlag) {// 条件为真
int zoomX = pressPanelX - (releaseX - pressX) / 4;// 放大内容绘制点的x坐标
int zoomY = pressPanelY - (releaseY - pressY) / 4;// 放大内容绘制点的y坐标
if (zoomX <= 0) {
zoomX = 0;// 坐标值小于等于0,让坐标值为0
}
if (zoomY <= 0) {
zoomY = 0;// 坐标值小于等于0,让坐标值为0
}
g2.drawImage(zoomBuffImage, zoomX, zoomY,
(int) ((releaseX - pressX) * 1.5f),
(int) ((releaseY - pressY) * 1.5f), this);// 绘制放大后的内容
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java