本文共 2859 字,大约阅读时间需要 9 分钟。
本节书摘来自华章计算机《Java数字图像处理:编程技巧与应用实践》一书中的第3章,第3.1节,作者 贾志刚,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
上一章介绍了BufferedImageOp的一些重要知识,实现了几个常见的图像特效,本章介绍如何通过Swing UI组件显示与刷新图像。首先会介绍JAVA Swing的顶层组件JFrame,然后介绍Swing中最重要和使用频率最高的组件JPanel,教会读者重写JComponent中的paintComponent()方法来实现图像的显示,最后会介绍Swing组件JButton捕获与监听用户行为时最重要的ActionListener接口的使用,以及在Swing事件派遣线程中刷新显示等的技巧,希望可指导读者在后续的图像处理实践中,通过Swing UI来实现自己的UI测试类。
本书不是一本专门介绍Java Swing编程的图书,因此要求读者对Java Swing常见组件有基本认识,对Swing事件监听与处理有基本的知识。本章最主要的目的是实现一个Java Swing UI,即一个测试框架,来测试第4章到第13章中所有继承自AbstractBufferedImageOp抽象类的源代码,帮助读者更好地理解所学到的关于图像处理的知识与内容。
刚接触Swing编程的读者可能对JPanel的了解并不多,常常不清楚如何在JPanel中显示图像,而网上的很多教程又是通过JLabel来作为BufferedImage实例显示组件的,这其实不是一种很好的方法,不值得推荐。在JPanel中显示BufferedImage对象实例时,值得推荐的做法应该是通过重载paintComponent()方法来实现图像的显示与及时刷新。这种方法的大致实现可以分为以下几步。
1)重载JPanel中的 paintComponent()方法。
2)获取Graphics2D图形引擎绘制对象,使用drawImage方法绘制图像,代码如下:
protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.clearRect(0, 0, this.getWidth(), this.getHeight()); if(sourceImage != null) { g2d.drawImage(sourceImage, 0, 0, sourceImage.getWidth(), sourceImage.getHeight(), null); if(destImage != null) { g2d.drawImage(destImage, sourceImage.getWidth() + 10 , 0, destImage.getWidth(), destImage.getHeight(), null); } }}
3)使用repaint()方法及时绘制更新。
以上简单的三步即可实现BufferedImage对象实例在JPanel的现实与刷新。
根据上述方法实现了一个完整的可以显示与刷新BufferedImage对象实例的ImagePanel类,代码如下:package com.book.chapter.three;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import javax.swing.JPanel;public class ImagePanel extends JPanel { private static final long serialVersionUID = 1L; private BufferedImage sourceImage; private BufferedImage destImage; public ImagePanel() { // do nothing } @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.clearRect(0, 0, this.getWidth(), this.getHeight()); if(sourceImage != null) { g2d.drawImage(sourceImage, 0, 0, sourceImage.getWidth(), sourceImage.getHeight(), null); if(destImage != null) { g2d.drawImage(destImage, sourceImage.getWidth() + 10 , 0, destImage.getWidth(), destImage.getHeight(), null); } } } public BufferedImage getSourceImage() { return sourceImage; } public void setSourceImage(BufferedImage sourceImage) { this.sourceImage = sourceImage; } public BufferedImage getDestImage() { return destImage; } public void setDestImage(BufferedImage destImage) { this.destImage = destImage; }}
转载地址:http://rqhbo.baihongyu.com/