ImageIO的应用 (AWT和Swing初接触)

ImageIO的应用

一、关于IO流

在讲imageio之前,我们先来复习一下IO流的使用。

这里我建立一个Java类,用来实现读取文档中的内容,并且能够识别换行,话不多说,上代码:

package com.Evan.demo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class ShowFile {
    // 创建方法transReadByBuf()从文件读出内容;
    public void transReadByBuf(File file) {
        FileInputStream fis;
        InputStreamReader isr;
        BufferedReader br;
        String n;
        try {
            fis = new FileInputStream(file);
            isr = new InputStreamReader(fis);
            br = new BufferedReader(isr);

​            while ((n = br.readLine()) != null) {
​    // 从字符输入流中读取文本时可以使用readLine()方法,从而对换行符进行识别,一行一行地读取文本;
​                System.*out*.println(n);
​            }
​            fis.close();
​            isr.close();
​            br.close();
​        } catch (FileNotFoundException e) {
​            e.printStackTrace();
​        } catch (IOException e) {
​            e.printStackTrace();
​        }
​    }

​    //  在测试方法中调用transReadByBuf()方法。
​    public static void main(String[] args) {
​        File file = new File("a.txt");
​        if (!file.exists()) {
​            try {
​                file.createNewFile();
​            } catch (IOException e) {
​                e.printStackTrace();
​            }
​        }
​        ShowFile showFile = new ShowFile();
​        showFile.transReadByBuf(file);
​    }
}

代码是不是简洁易懂?有手就行。

注意一下,这里的文档需要建立在F:\Java_Prj\Java_Project包下

这里贴张图,展示一下文档内容

然后控制台输出为下图:

是不是so easy ,以上内容完全是学校老师教的内容,然后下面就是本文的主要内容啦(敲黑板.jpg)!

二、ImageIO读取图片

1.使用AWT绘制窗口

当界面很复杂,代码很多时,我们就建立了一个init()方法用于组装界面,然后在main方法中调用init()方法,代码如下:

package com.Evan.demo;

import java.awt.*;

public class AWT_init {
    Frame frame = new Frame("init方法");
    public void init(){

    }

    public static void main(String[] args) {
        new AWT_init().init();
    }
}

当然啦,上面的代码只是一个小框架,没有实现效果啦;

然后我们用AWT代码来写一个简单的窗口,代码如下:

package com.Evan.demo;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Awt_demo {
    private Frame frame = new Frame();
    
    public void init() throws Exception{

        frame.setBounds(200,200,740,508);

        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            //重写方法实现关闭窗口效果
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
}

    public static void main(String[] args) throws Exception {
        new Awt_demo().init();
    }
}

实现的效果如下:

一个小窗口就完成啦!

2.使用imageio读取图片

接下来我们就来写一个关于AWT的代码,用来读取本地图片

package com.Evan.demo;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Awt_demo {
    private Frame frame = new Frame("图片查看器");

    BufferedImage image;

    private class MyCanvas extends Canvas {
        @Override
        public void paint(Graphics g) {
            g.drawImage(image, 0, 0, null);
        }
    }

    MyCanvas drawArea = new MyCanvas();

    public void init() throws Exception {
        //组装视图

        try {
            File file = new File("C:\\Users\\Evan\\Desktop\\Evan.jpg");
            image = ImageIO.*read*(file);
            drawArea.repaint();

        } catch (IOException e) {
            System.*out*.println(e.getMessage());
        }

        frame.add(drawArea);
        frame.setBounds(200, 200, 740, 508);

        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.*exit*(0);
            }
        });
    }

    public static void main(String[] args) throws Exception {
        new Awt_demo().init();
    }
}

代码实现效果如下:

这里没有完全展示出图片,不过不要紧,我们可以修改代码

frame.setBounds(200, 200, 740, 508);

数值分别表示(x,y,width,height)

3.使用Swing绘制窗口

package com.Evan.demo;

import java.awt.Graphics;
import java.awt.Image;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ImageDemo extends JFrame {

​    private Image image;

​    public ImageDemo() {
​        setTitle("图片展示");
​        setBounds(200, 200, 740, 708);
​        setDefaultCloseOperation(WindowConstants.*EXIT_ON_CLOSE*);
​        setVisible(true);
​    }

​    public void loadImage(String path) {
​        try {
​            image = ImageIO.*read*(new File(path));
​        } catch (IOException e) {
​            System.*out*.println(e.getMessage());
​        }
​    }

​    @Override
​    public void paint(Graphics g) {
​        if (image != null) {
​            g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
​        }
​    }

​    public static void main(String[] args) {
​        ImageDemo id = new ImageDemo();
​        id.loadImage("C:\\Users\\Evan\\Desktop\\Evan.jpg");
​        id.repaint();
​    }
}

这里说一下AWT和Swing的比较啦,chat机器人是这样解释的:

AWT(Abstract Window Toolkit)和 Swing 是 Java 中两种用于 GUI 编程的图形库。它们都可以创建各种 GUI 元素,如窗口、按钮、文本框等,并提供了类似事件处理、布局管理等功能。

下面是 AWT 和 Swing 的比较:

  1. 跨平台性:AWT 的组件依赖于本地系统的 GUI 组件,所以在不同的操作系统上显示效果可能会有所不同;而 Swing 使用自己的组件,可以实现真正的跨平台界面设计。
  2. 外观和风格:AWT 组件使用本地系统的外观和样式,所以在不同的操作系统上可能呈现不同的外观;而 Swing 运行时使用相同的外观和风格,可以使应用程序在所有平台上具有相同的外观和行为。
  3. 性能:AWT 组件是本地组件,直接依赖于本地系统的 GUI 组件,所以运行速度比 Swing 快;而 Swing 组件是纯 Java 组件,运行速度相对较慢。
  4. 功能和灵活性:Swing 提供了更多的组件和功能,同时也提供了更好的灵活性和可扩展性,可以满足更复杂的 GUI 设计需求;而 AWT 功能相对较少,灵活性较差。
  5. 学习曲线:Swing 的学习曲线相对于 AWT 更加陡峭,因为它提供了更多的功能和灵活性;而 AWT 的学习曲线比较平缓。

总之,AWT 和 Swing 都是 Java 中用于 GUI 编程的图形库,它们在跨平台性、外观和风格、性能、功能和灵活性以及学习曲线等方面有所区别,开发者可以根据具体需求进行选择。

就本人来说呢,在实现读取图片上最直观的就是Swing需要继承JFrame这个类,以此实现效果,很实用,推荐!

4.ImageIO读取url和load图片

咳咳回到正题,关于读取图片,ImageIO流可以读取链接形式的图片,也可以读取本地的图片。当然啦,上面两个代码块都是读取本地图片的,以下展示读取链接形式图片的代码:

package com.Evan.demo;

import java.awt.Image;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ReadImage
{
    public static void main( String[] args )
    {
        JFrame jf = new JFrame("图片展示");
        Image image = null;

​        jf.setSize(250, 250);

​        try {
​            URL url = new URL("https://pic.cnblogs.com/avatar/3178304/20230603204309.png");
​            image = ImageIO.*read*(url);
​        } catch (IOException e) {
​            System.*out*.println(e.getMessage());
​        }

​        JLabel label = new JLabel(new ImageIcon(image));
​        jf.add(label);
​        jf.setVisible(true);

​    }
}

效果图如下:

别看这代码少,但是导入的包多啊,可能这就是Swing的魅力吧

而如果要读取本地图片只需将上面的try catch代码改为:

try {
    File file = new File("C:\\Users\\Evan\\Desktop\\Evan.jpg");
    image = ImageIO.*read*(file);
} catch (IOException e) {
    System.*out*.println(e.getMessage());
}

三、关于Swing JLabel类

1.JLabel介绍

JLabel类可以显示文本或图像。通过在显示区域中设置垂直和水平对齐来对齐标签的内容。默认情况下,标签在显示区域中垂直居中,纯文本标签前沿对齐,仅图像标签水平居中。

如上面代码块中,窗口设置了长宽都是600,正好可以展示出图片全貌,但如果窗口过小,窗口中也会展示图片最中间的内容,即默认水平居中。

2.类构造函数

构造函数 描述
JLabel() 创建一个没有图像且标题为空字符串的JLabel实例。
JLabel(Icon image) 使用指定的图像创建JLabel实例。
JLabel(Icon image, int horizontalAlignment) 使用指定的图像和水平对齐创建JLabel实例。
JLabel(String text) 使用指定的文本创建JLabel实例。
JLabel(String text, Icon icon, int horizontalAlignment) 使用指定的文本,图像和水平对齐创建JLabel实例。
JLabel(String text, int horizontalAlignment) 使用指定的文本和水平对齐方式创建JLabel实例。

当然啦,我们使用的是第二个。

好啦,这次的分享就结束啦,继续学习Java web去了。

热门相关:亿万盛宠只为你   夫人你马甲又掉了   无限杀路   法医王妃不好当!   横行霸道