前面介绍了AWT的几种基础控件,从按钮到文本标签,从输入框到选择框,无一例外都能显示文字,唯独无法显示某张图片文件。本以为AWT会提供专门的控件来显示图片,然而偏偏没有意料之中的图像控件,这可真是弱爆了,居然不能显示姹紫嫣红的图片,让程序员情何以堪呀。不过咱程序员不是吃素的,与其坐等天上掉馅饼,不如自己动手编写符合要求的图像视图。AWT自带的界面控件,大多由Component类派生而来,该类与展示有关的方法主要有下列两个:

getPreferredSize:该方法可返回控件的推荐宽高。

paint:该方法可使用画笔Graphics绘制具体的图案,包括各种形状、文字与图像。

看来若想自定义一个新控件,只需重写getPreferredSize和paint两个方法就好了,原来就这么简单。可是对于新手来说,天晓得要怎样把图片画到界面上,一方面不知道AWT利用哪种工具读写图片,另一方面也不知道怎样用画笔描绘图像。目前为止只知晓图片文件可以用File工具打开,且AWT控件属于Component家族,其余的中间过程完全是一团抓瞎。譬如下面的流程图描述了AWT显示图片文件的步骤。

上图的好几处地方尚不明确,例如:怎样把图片文件读到AWT的缓存当中?AWT的缓存是什么对象类型?怎样把缓存的图像数据描绘到控件上?这些问题若是不弄清楚,前头说的图像视图根本没法做。当然,AWT确实提供了每个环节需要的工具,尽管有些繁琐,但毕竟能用。这些工具的名称及其用法简要说明如下:

1、图像缓存类BufferedImage,它是AWT专用的图像缓存工具,里面保存着临时的图像数据。

2、图像输入输出工具ImageIO,它是AWT读写图片文件的利器,其中read方法可将图片文件读到图像缓存中,而write方法可将图像缓存保存为图片文件。

3、画笔工具Graphics,前述paint方法的输入参数正是Graphics类型,只要调用画笔对象的drawImage方法,即可在控件上绘制图像缓存。

现在有了上面三个工具,把它们替换进先前AWT显示图片的流程图,完善后的流程图就变成了下面这般:

啧啧,显示图片的流程一下子变得清晰了,通过BufferedImage、ImageIO、Graphics三板斧的协助,在控件上显示图片不再是难事了。依据流程图给出的思路,接着便能编写图像视图的自定义代码了,下面是支持显示图片文件的图像视图代码例子:

//定义一个显示图片用的图像视图

public class ImageView extends Component {

private static final long serialVersionUID = 1L;

private BufferedImage image; // 声明一个缓存图像

// 设置图片路径

public void setImagePath(String path) {

try {

image = ImageIO.read(new File(path)); // 把指定路径的图片文件读到缓存图像

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void paint(Graphics g) { // 绘制控件的方法

if (image != null) {

if (getWidth() > 0 && getHeight() > 0) { // 有指定宽高

g.drawImage(image, 0, 0, getWidth(), getHeight(), null); // 按指定宽高绘制图像

} else { // 未指定宽高

g.drawImage(image, 0, 0, null); // 按原尺寸绘制图像

}

}

}

@Override

public Dimension getPreferredSize() { // 获取控件的推荐宽高

if (image != null) {

if (getWidth() > 0 && getHeight() > 0) { // 有指定宽高

return new Dimension(getWidth(), getHeight()); // 返回setSize方法指定的宽高

} else { // 未指定宽高

return new Dimension(image.getWidth(), image.getHeight()); // 返回图像的宽高

}

} else {

return new Dimension(0, 0); // 无图像则隐藏控件

}

}

}

然后回到主界面的代码,先创建图像视图的控件对象,再设置该控件的宽高,以及待显示的图片文件路径,最后将图像控件添加到面板上,主要的调用代码如下所示:

Panel panel = new Panel(); // 创建一个面板

ImageView imageView = new ImageView(); // 创建一个自定义的图像视图

imageView.setSize(320, 240); // 设置图像视图的宽高

imageView.setImagePath("E:/apple.png"); // 在图像视图上显示指定路径的图片

panel.add(imageView); // 在面板上添加图像视图

frame.add(panel); // 在窗口上添加面板

运行以上的图像控件代码,弹出的窗口界面如下图所示,可见面板成功展示了指定的图片。

java awt 显示图片_Java开发笔记(一百二十三)AWT图像视图相关推荐

  1. java 对话框 显示图片_Java对话框上显示图片

    手掌心 其实有很多种方法可以解决图片显示大小的问题:使用photoshop修改. 优点是可以节省系统资源, 显示图片的时候,不用做处理,缺点是需要了解ps的基本操作使用JDialog 自定义对话框. ...

  2. Java开发笔记(二十三)数组工具Arrays

    数组作为一种组合形式的数据类型,必然要求提供一些处理数组的简便办法,包括数组比较.数组复制.数组排序等等.为此Java专门设计了Arrays工具,该工具包含了几个常用方法,方便程序员对数组进行加工操作 ...

  3. Android开发笔记(二十三)文件对话框FileDialog

    日期和时间对话框 对话框是人机交互的有力工具,Android自带了几个常用的对话框,包括AlertDialog提示对话框.ProgressDialog进度对话框.DatePickerDialog日期选 ...

  4. java swing 列表框_Java开发笔记(一百三十一)Swing的列表框

    前面介绍了选择框的用法,当时为了方便用户勾勾点点,无论是复选框还是单选按钮,统统把所有选项都摆在界面上.倘若只有两三个选项还好办,要是选项数量变多比如超过五个,这么多的选择框一齐在界面罗列,不光程序员 ...

  5. java jframe显示图片_java怎么在JFrame中显示动态图片

    java怎么在JFrame中显示动态图片 (2012-09-16 23:39:54) 标签: 杂谈 import java.awt.Graphics; import javax.swing.Image ...

  6. java icon显示图片_java显示ico格式图片

    展开全部 不知道你是不是要这种效果 代码如下: //要求:在JFrame里面显示一个ico格式的图片,放在JPanel,JLable,或32313133353236313431303231363533 ...

  7. java frame 显示图片_java 图像显示

    简介 java 核心编程 code /* * @Author: your name * @Date: 2020-10-28 22:38:26 * @LastEditTime: 2020-10-28 2 ...

  8. java frame 显示图片_java怎么在JFrame中显示动态图片?

    展开全部 试了一下,从网上找了个GIF 可以用啊 --------------------------------------------------------------------------- ...

  9. java不显示图片_Java图片显示不出来,怎么解决

    展开全部 有两个问题:图片路径没有写对,图片在 src 下,图片路径应是 src/海洋.png,正e68a84e8a2ad62616964757a686964616f31333365656632确的写 ...

最新文章

  1. EAST 自然场景文本检测
  2. 每天一道LeetCode-----最长无重复子串
  3. 理解MYSQL MVCC 实现机制
  4. MYSQL中最基础的的聚合函数(avg求平均值及count求和)
  5. UNIX网络编程笔记(6):I/O复用之select函数
  6. 语义分割中的类别不平衡的权重计算
  7. ApacheCN NodeJS 译文集 20211204 更新
  8. NodeJS无所不能:细数10个令人惊讶的NodeJS开源项目
  9. resnet 25 训练人脸识别
  10. mysql8.0.12怎么配置_MySQL8.0.12安装及配置
  11. 测试专员如何编写优秀的测试代码·单元测试篇
  12. 邮件服务器的功能以及相关工作原理
  13. java jbutton icon 边框_Swing开发JButton图标效果篇
  14. 织梦模板(dedecms) 文章页调用 浏览次数(阅读量,访问量)
  15. mysql 1698 错误
  16. 用python预测你的小孩的身高_孩子身高预测
  17. 【干货】提取图片元数据之exiftool
  18. 商业智能如何助推电商
  19. Linux 锁机制(3)之自旋锁
  20. IE文档模式的切换,Quirks模式

热门文章

  1. SQL中的DECIMAL()函数
  2. 拉伯证券|机构看好中国经济 人民币资产吸引力持续增强
  3. pli测试50题题库_马士基笔试题目
  4. 【魔兽争霸3地图编辑】vJass 教程
  5. 权限维持之:SID History 域控权限维持
  6. 方正证券手机网上开户流程
  7. MySQL版 emp 数据库
  8. 解决WIn7无线网图标显示不正确的问题
  9. 今天的日子只属于你!
  10. win10(专业版): L2TP连接尝试失败,因为安全层再初始化与远程计算机的协商时遇到一个处理错误。