在之前监听器内,我们已经把图片像素处理代码有了一个系统的学习,下面我们再创建两个类,来完整实现图像处理功能。
一:界面类
我们在之前学习的界面类上,新增上画板板块与按钮板块,来使界面布局更加清晰:
画板板块:
ImagePanel imgPnl = new IamgePanel(); imgPnl.setBackground(Color.DARK_GRAY);按钮板块:
JPanel btnJp = new JPanel(); btnJp.setBackground(Color.BLACK); btn.setPreferredSize(new Dimension(0,100));这里有三个尺寸方法:
1.setPreferredSize()首选尺寸
布局管理器优先参考的理想大小,最常用,适配自动布局。(宽度 0 代表不限制宽度,自动拉伸填满窗口底部整行)
2.setMinimumSize()最小尺寸
组件不能比这个更小,窗口缩小时不会低于该宽高。
3.setMaximumSize()最大尺寸
组件不能超过这个大小。
接着,添加按钮组件到按钮板块并绑定监听器:
String[] str ={"原图","灰度化","二值化","马赛克","蓝调","黄昏","反片"}; for (int i =0;i<str.length;i++){ JButton jb = new JButton(str[i]); btnJp.add(jb); jb.addActionListener(imgL); }然后,画板,按钮添加到界面上并可视化:
jf.add(imgPnl,BorderLayout.CENTER); jf.add(btnJp,BorderLayout.SOUTH); jf.setVisible(true);从画板板块获取画笔并传给监听器:
Graphics g = imgPnl.getGraphics(); imgL.g=g;最后写主函数:
public static void main() { ImageUI ui = new ImageUI(); ui.showUI();二:ImagePanel类
因为java内不存在ImagePanel类,但是存在JPanel类,所以我们要继承JPanel类,并重写方法。
我们先来认识一下JPanel类;
简单理解,它就是一块空白、可承载内容的「透明面板 / 画布」
有两大作用:
1.作为布局容器,装按钮、组件(如 btnJp)
2.作为自定义绘图画布(如 ImagePanel)
我们来看具体继承重写操作:
public class ImagePanel extends JPanel { @Override public void paint(Graphics g) { super.paint(g);来认识一下super:
super 属于 Java 50 个保留关键字之一,编译器有特殊识别逻辑,不能用作变量名、类名、方法名。
它专门用来指代当前对象的直接父类,只能在子类中使用。
super.成员 访问父类的属性 / 方法
super.paint(g);super. 调用父类 JPanel 的 paint() 方法;
区分:如果子类和父类有同名方法,不加 super 默认调用自己的,加 super 才会走父类。
这里的super.paint(g)主要执行父类 JPanel 自带的绘制逻辑,不写会出现画面残留、拖影、背景错乱。
父类 JPanel 的 paint 内部做了两件事:
1.清空画布(填充背景色)
用面板自身的背景色把整个绘图区域刷一遍,擦掉上一次绘制的所有内容(旧图片、文字、色块)。
2.绘制组件基础样式
边框、透明属性、基础布局底色等底层渲染。
接着,重写paint方法:
g.fillRect(w/4,h/4,w/2,h/2); g.setFont(new Font("黑体",Font.BOLD,35)); g.setColor(Color.lightGray); g.drawString("图像正在加载中",w/3,h/2);这里宽高没有设具体的值,是一种动态的宽高,拉伸界面时,图形、文字跟着窗口自适应、永远居中,更加美观。
这样加上之前的监听器类,一个完整的图像处理项目就基本完成了。