刚接触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; } }