Java — Action接口的使用
《》我们常常会遇到这样一个问题:很多组件都需要处理相同的事件 ; 比如,通常一个软件在设计时会因用户习惯,
产生不同的操作方式却能达到相同的功能,例如文书编辑器中,copy功能可能在菜单中出现,
也可能在工具栏上出现,甚至在快显菜单(Popup Menu)中出现,虽然出现的方式不一样,
但均能达到copy的功能.若以我们之前的事件处理方法,我们必须为每种出现方式实现copy功能,
造成程序代码重复性太高,不易阅读也不美观。现在我们就有这样一个处理方法——使用Action接口
《》Action从表面的意思上就是“动作、行为” , 也就说一个实现Action接口的对象,本身就是一种业务,就是一种
处理功能,我们可以使用这个业务对象来创建不同的组件(如普通按钮、菜单项、工具栏按钮等),这样的话这些组件
就都有相同的功能了
《》下面就来详细的介绍Action接口的用法
1、Action接口是ActionListener接口的子接口,它除了包含ActionListener接口的actionPerformed()方法之外,
还含有name和icon两个属性,其中name用于指定创建的按钮或者菜单项的文本标签,icon则用于指定按钮的图标或者
菜单项中的图标。也就是说,Action接口将“事件监听”和“可被转换成按钮和菜单项”集于一身,这恰好说明了上面所说的
功能
2、实际上在JButton的构造方法 public JButton(Action action )中、JToolBar的add(Action action) 、以及JMenu的
add(Action action )方法中都可以看出,他们都能够使用Action对象为参数,将Action自动的转化为按钮或者菜单项,你要做的
仅仅是定义一个Action对象,之后仅仅需要调用上面的方法就能够自动的将Action转化成组件了
3、就像上面说的那样,Action本身并不是组件,只有应用JButton的构造方法或者将Action添加到指定的组件容器中(JToolBar或者JMenu)
才能够将值转化成组件
4、总结上面的各项我们可以得出,接收Action的容器(或者JButton)需要完成以下几项工作:
①使用add方法添加Action对象
②根据Action对象中的name和icon属性,自动的创建按钮或者菜单项
③通过Action对象为应用组件注册事件监听器,系统会为该Action所创建的所有的组件注册同一个事件监听器
(事件处理器就是Action对象里的actionPerformed()方法)
④在Action接口中还有一个setEnabled(boolean)方法,这个方法用来指定当前的Action动作是否被激活,
只有一个Action动作被激活后,相应的组件才能够使用③中的监听器来处理业务,这是为什么呢?比如:我们创建了
“复制”“粘贴”两项Action业务的话,那么只有当复制完成后,“粘贴”业务才可以被激活,否则“粘贴”业务默认
应该是不被激活的
《》好了,基本的逻辑搞清楚之后,那么下面就是如何创建一个Action对象了,一般我们并不是直接通过创建一个
实现Action接口的类,之后在通过这个类来创建Action类型的对象,而是创建一个实现AbstractAction抽象类的类;
这个抽象类AbstractAction实现了Action接口,而且这个抽象类,除了actionPerformed()方法之外,
已经将Action中包括setEnabled(boolean)在内的所有方法都实现了,这样一来我们就能够直接使用setEnabled()
等游泳的方法了;好了这样一来AbstractAction抽象类中只有actionPerformed()方法没有实现,这个方法应该在
创建的那个实现了AbstractAction类的类中实现;所以创建一个Action对象的过程如下:
①创建一个类(设为b类),让这个类继承AbstractAction抽象类
②创建b类的构造方法,为AbstractAction中的name和icon属性赋值
(AbstractAction抽象类中有构造方法 public AbstractAction(String name,Icon icon)
)
③在b类中实现actionPerformed()方法,在些业务处理时,要注意是要将某些其他的业务激活或者关闭
《》这样一来一切就都非常的清楚了,具体的实例可以参见《疯狂Java讲义》P454
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架