《Java数字图像处理:编程技巧与应用实践》——第3章 基本Swing UI组件与图像显示 3.1 JPanel组件与BufferedImage对象的显示

简介:

本节书摘来自华章计算机《Java数字图像处理:编程技巧与应用实践》一书中的第3章,第3.1节,作者 贾志刚,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

第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;
    }

}
相关文章
|
5天前
|
存储 缓存 监控
Java面试题:在Java中,对象何时可以被垃圾回收?编程中,如何更好地做好垃圾回收处理?
Java面试题:在Java中,对象何时可以被垃圾回收?编程中,如何更好地做好垃圾回收处理?
16 0
|
3天前
|
监控 算法 Java
深入探索Java虚拟机:性能监控与调优实践
在面对日益复杂的企业级应用时,Java虚拟机(JVM)的性能监控和调优显得尤为重要。本文将深入探讨JVM的内部机制,分析常见的性能瓶颈,并提供一系列针对性的调优策略。通过实际案例分析,我们将展示如何运用现代工具对JVM进行监控、诊断及优化,以提升Java应用的性能和稳定性。
|
7天前
|
Java
Java中的并发编程:理论与实践
在软件开发中,特别是Java应用程序开发中,如何处理并发性是一个至关重要的问题。本文探讨了Java中并发编程的基础理论、常见问题以及实际应用中的最佳实践,帮助开发人员更好地理解和应对多线程环境下的挑战。 【7月更文挑战第8天】
16 7
|
6天前
|
Oracle Java 关系型数据库
Java中的编码规范与代码审查实践
Java中的编码规范与代码审查实践
|
6天前
|
Java 数据挖掘 Linux
Java中的跨平台桌面应用开发实践
Java中的跨平台桌面应用开发实践
|
6天前
|
存储 算法 Java
Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得
Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得
6 0
Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得
|
7天前
|
监控 安全 Java
Java中的AOP编程实践与应用场景
Java中的AOP编程实践与应用场景
|
10天前
|
Java jenkins 持续交付
Java中的版本控制与持续集成实践
Java中的版本控制与持续集成实践
|
3天前
|
算法 Java 开发者
Java中的多线程编程技巧与实践
在现代软件开发中,多线程编程成为提升应用程序性能和响应能力的关键技术之一。本文将深入探讨Java语言中多线程编程的基础概念、常见问题及其解决方案,帮助开发者更好地理解和应用多线程技术。 【7月更文挑战第12天】
6 0
|
5天前
|
存储 缓存 算法
Java面试题:给出代码优化的常见策略,如减少对象创建、使用缓存等。
Java面试题:给出代码优化的常见策略,如减少对象创建、使用缓存等。
6 0