第3章
基本Swing UI组件与图像显示
上一章介绍了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抽象类的源代码,帮助读者更好地理解所学到的关于图像处理的知识与内容。
3.1 JPanel组件与BufferedImage对象的显示
刚接触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;
}
}