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

2023-06-10 06:26:13 来源:博客园
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 的比较:

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

关键词:

X 广告
公司
X 广告

Copyright   2015-2022 南极快递网版权所有  备案号:粤ICP备2022077823号-13   联系邮箱: 317 493 128@qq.com