《Java数字图像处理:编程技巧与应用实践》——3.5 一个完整的Swing UI Demo

简介:

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

3.5 一个完整的Swing UI Demo

本节将根据前面前四节所讲的Swing UI组件应用知识,实现一个真正的Swing UI演示,以更加贴近实际编程的方式来说明Swing中组件的应用知识。首先来介绍一下要实现的功能:

  • 通过文件对话框选择图像文件,刷新JFrame中的内容面板实现图像显示。
  • 通过单击[处理]按钮实现对图像的必要处理,然后刷新显示图像。

大致的UI组件布局如图3-1所示。

screenshot

其中支持BufferedImage对象显示的自定义JPanel类的实现如下:

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() {

    }

    @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 void process()
    {
        // do nothing
    }

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

}

SwingUI界面实现与JButton按钮监听处理的类的代码如下:

package com.book.chapter.three;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileNameExtensionFilter;

public class MainUI extends JFrame 
        implements ActionListener {

    /**
    * 
    */
    private static final long serialVersionUID = 1L;
    public static final String IMAGE_CMD = "选择图像...";
    public static final String PROCESS_CMD = "处理";

    private JButton imgBtn;
    private JButton processBtn;
    private ImagePanel imagePanel;

    // image
    private BufferedImage srcImage;

    public MainUI()
    {
        setTitle("JFrame UI - 演示");
        imgBtn = new JButton(IMAGE_CMD);
        processBtn = new JButton(PROCESS_CMD);

        // buttons
        JPanel btnPanel = new JPanel();
        btnPanel.setLayout(new
                     FlowLayout(FlowLayout.RIGHT));
        btnPanel.add(imgBtn);
        btnPanel.add(processBtn);

        // filters
        imagePanel = new ImagePanel();
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(imagePanel,
                     BorderLayout.CENTER);
        getContentPane().add(btnPanel, BorderLayout.SOUTH);

        // setup listener
        setupActionListener();

    }

    private void setupActionListener() {
        imgBtn.addActionListener(this);
        processBtn.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if(SwingUtilities.isEventDispatchThread())
        {
            System.out.println("Event Dispath Thread!!");
        }

        if(srcImage == null)
        {
            JOptionPane.showMessageDialog(this, 
                        "请先选择图像源文件");
            try {
                JFileChooser chooser = 
                        new JFileChooser();
                setFileTypeFilter(chooser);
                chooser.showOpenDialog(null);
                File f = chooser.getSelectedFile();
                if(f != null)
                {
                    srcImage = ImageIO.read(f);
                    imagePanel.setSourceImage(
                            srcImage);
                    imagePanel.repaint();
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return;
        }
        if(IMAGE_CMD.equals(e.getActionCommand()))
        {
            try {
                JFileChooser chooser = 
                        new JFileChooser();
                setFileTypeFilter(chooser);
                chooser.showOpenDialog(null);
                File f = chooser.getSelectedFile();
                if(f != null)
                {
                    srcImage = ImageIO.read(f);
                    imagePanel.setSourceImage(
                            srcImage);
                    imagePanel.repaint();
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            imagePanel.repaint();
        }
        else if(PROCESS_CMD.equals(e.getActionCommand()))
        {
            imagePanel.process();
            imagePanel.repaint();
        }
    }

    public void setFileTypeFilter(JFileChooser chooser)
    {
        FileNameExtensionFilter filter = 
            new FileNameExtensionFilter(
                "JPG & PNG Images", "jpg", "png");
            chooser.setFileFilter(filter);
    }

    public void openView()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(800, 600));
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        MainUI ui = new MainUI();
        ui.openView();
    }
}
相关文章
|
10月前
|
存储 IDE Java
漂亮不是梦!Java Swing美化攻略
Java Swing 是一个为 Java 设计的 GUI 工具包,提供文本框、按钮等组件。尽管其外观可定制,通过 Look and Feel(LAF)机制改变应用风格,如 Darcula 和 FlatLaf,但现已淡出主流视野,主要应用于 IDE 领域,如 IntelliJ IDEA 和 Eclipse。相比其他 GUI 框架,Swing 的发展前景有限。
337 1
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
这篇文章介绍了如何使用Ant Design Vue UI框架创建一个简单的后台管理模板,包括创建Vue项目、安装和使用ant-design-vue、以及编写后台管理通用页面的代码和样式。
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
|
安全 Java API
|
算法 Java 开发者
Java中的多线程编程技巧与实践
在现代软件开发中,多线程编程成为提升应用程序性能和响应能力的关键技术之一。本文将深入探讨Java语言中多线程编程的基础概念、常见问题及其解决方案,帮助开发者更好地理解和应用多线程技术。 【7月更文挑战第12天】
71 0
|
前端开发 JavaScript
vue + element-UI 图片压缩canvas【详解】(含完整demo)
vue + element-UI 图片压缩canvas【详解】(含完整demo)
741 1
|
前端开发 Java UED
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
1165 0
|
Java 数据安全/隐私保护
利用Java图形化界面组件Swing写一个简易的登录界面
利用Java图形化界面组件Swing写一个简易的登录界面
230 1
|
存储 设计模式 前端开发
[笔记] 疯狂JAVA讲义(第3版)第12章 Swing编程
[笔记] 疯狂JAVA讲义(第3版)第12章 Swing编程
|
Java API 计算机视觉
Java数字图像处理基础知识 - 必读
写了很多篇关于图像处理的文章,没有一篇介绍Java 2D的图像处理API,文章讨论和提及的 API都是基于JDK6的,首先来看Java中如何组织一个图像对象BufferedImage的,如图: 一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间,类型等 信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首 先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/p newimageformatIO.jar即可。
1079 0
|
16天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案