Swing——动作(Action)
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41258997
Action接口扩展于ActionListener接口。
public Object getValue(String key);
public void putValue(String key, Object value);
public void setEnabled(boolean b);
public boolean isEnabled();
public void addPropertyChangeListener(PropertyChangeListener listener);
public void removePropertyChangeListener(PropertyChangeListener listener);
实现Action接口的所有类必须实现上面的7个方法,AbstractAction类实现了该接口除了actionPerformed方法之外的所有方法。
可以直接扩展AbstractAction类,并在扩展中实现actionPerformed方法
Action redAction = new ColorAction1("red",new ImageIcon("red.gif"),Color.red);
将这个动作与一个按钮关联起来
JButton redButton = new JButton(redAction);
想要将动作添加到击键中,以便用户通过敲击键盘命令来执行这项动作
首先,需要生成KeyStroke类对象,该对象封装了对键的说明,调用其静态方法: KeyStroke ctrlBKey = KeyStroke.getKeyStroke("ctrl B");
可以使用getInputMap方法从组件中得到输入映射:InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);//当这个组件拥有键盘焦点时
InputMap不能直接将KeyStroke对象映射到Action对象,而是先映射到任意对象上,然后由ActionMap类实现将对象映射到动作上的第二个映射
这样可实现来自不同输入映射的击键共享一个动作
每个组件都可以有三个输入映射和一个动作映射,将键与动作关联起来:
imap.put(KeyStroke.getKeyStroke("ctrl Y"),"panel.yellow");
ActionMap amap = panel.getActionMap();
amap.put("panel.yellow",yellowAction);
使用字符串none表示空动作,可以轻松地取消一个键动作
imap.put(KeyStroke.getKeyStroke("ctrl C"),"none");
用同一个动作响应按钮、菜单项或击键的方式:
(1)实现一个扩展于AbstractAction类的类,多个相关的动作可以使用同一个类。
(2)构造一个动作类对象。
(3)使用动作对象创建按钮或菜单项。构造器将从动作对象中读取标签文本和图标。
(4)为通过击键触发动作,首先,定位顶层窗口组件;然后,得到顶层组件的WHEN_ANCESTOR_OF_FOCUS_COMPONENT输入映射。为需要的击键创建一个
KeyStrike对象。创建一个描述动作字符串这样的动作键对象,将动作键添加到输入映射中;最后,得到顶层组件的动作映射,将动作键添加到映射中。
Action动作和击键操作的实例如下:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class TestAction {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ActionFrame frame = new ActionFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class ActionFrame extends JFrame {
private JPanel buttonPanel;
public ActionFrame() {
setTitle("test");
setSize(200, 200);
buttonPanel = new JPanel();
Action yellowAction = new ColorAction("yellow", new ImageIcon("yellow.gif"),
Color.YELLOW);
Action blueAction = new ColorAction("blue", new ImageIcon("blue.gif"),
Color.BLUE);
Action redAction = new ColorAction("red", new ImageIcon("red.gif"),
Color.RED);
buttonPanel.add(new JButton(yellowAction));
buttonPanel.add(new JButton(blueAction));
buttonPanel.add(new JButton(redAction));
InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_FOCUSED);// 当这个组件拥有键盘焦点时
imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
imap.put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");
imap.put(KeyStroke.getKeyStroke("ctrl R"), "panel.red");
ActionMap amap = buttonPanel.getActionMap();
amap.put("panel.yellow", yellowAction);
amap.put("panel.blue", blueAction);
amap.put("panel.red", redAction);
}
}
class ColorAction extends AbstractAction {
private JPanel buttonPanel;
public ColorAction(String name, Icon icon, Color c) {
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue("color", c);
putValue(Action.SHORT_DESCRIPTION,
"set panel color to" + name.toLowerCase());
}
@Override
public void actionPerformed(ActionEvent e) {
Color c = (Color) getValue("color");
buttonPanel.setBackground(c);
}
}
Swing——动作(Action)的更多相关文章
- Java基础之处理事件——使用动作Action(Sketcher 6 using Action objects)
控制台程序. 动作Action是任何实现了javax.swing.Action接口的类的对象.这个接口声明了操作Action对象的方法,例如,存储与动作相关的属性.启用和禁用动作.Action接口扩展 ...
- Learning Cocos2d-x for WP8(8)——动作Action
原文:Learning Cocos2d-x for WP8(8)--动作Action 游戏很大程度上是由动作画面支撑起来的. 动作分为两大类:瞬间动作和延时动作. 瞬间动作基本等同于设置节点的属性,延 ...
- 08 Zabbix4.0系统配置事件通知 - 动作Action
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 08 Zabbix4.0系统配置事件通知 - 动作Action 请点击查看Zabbix3.0.8版 ...
- 动作Action
/** * DelayTime延迟 * @param d Duration 延迟时间 */ auto delayTime = DelayTime::create(); sprite->runAc ...
- 创建一个动作-Action类:
让我们创建一个Java文件HelloWorldAction.java的Java资源> SRC下一个的包名com.yiibai.struts2与下面的内容. package com.yiibai. ...
- libgdx学习记录6——动作Action
libgdx中的Action类能够有效的帮助我们实现位移.旋转.缩放.淡入淡出等效果,对游戏的设计很有用. Action是一个抽象类,本身不可以实例化.一般使用的它的继承类,常用的有 MoveToAc ...
- Asp.Net MVC学习总结(二)——控制器与动作(Controller And Action)
一.理解控制器 1.1.什么是控制器 控制器是包含必要的处理请求的.NET类,控制器的角色封装了应用程序逻辑,控制器主要是负责处理请求,实行对模型的操作,选择视图呈现给用户. 简单理解:实现了ICon ...
- Struts2 In Action笔记_页面到动作的数据流入和流出
因为回答百度知道的一个问题,仔细查看了<Struts2 In Action>,深入细致的看了 “数据转移OGNL 和 构建视图-标签”,很多东西才恍然大悟. 一直觉得国外写的书很浮,不具有 ...
- 实验十四 第九组 张燕~杨蓉庆~杨玲 Swing图形界面组件
实验十四 Swing图形界面组件 8-11-29 理论知识 Swing和MVC设计模式 (1)设计模式(Design pattern)是设计者一种流行的 思考设计问题的方法,是一套被反复使用,多数人 ...
随机推荐
- ACM Tempter of the Bone
小狗在古老的迷宫(maze)中发现了一个骨头,这使它非常着迷.然而,当他把它捡起来的时候,迷宫开始摇晃,狗狗可以感觉到地面下沉(sinking).他意识到这块骨头是一个陷阱(trap),他拼命地想摆脱 ...
- CentOS7: How to resolve curl#56 - "Recv failure: Connection reset by peer"
Issue: When you execute Yum installation or update, you may encounter following error: Loaded plugin ...
- android 获取栈顶activty的方法总结(兼容API 5.0)
声明:本文为Dujinyang CSDN原创投稿文章,未经许可,禁止任何形式的转载. 最近5.0\6.0\7.0 安卓系统都陆续上岗了,兼容性和代码更新是个很头疼的问题,这次我们来说下TASK的基础和 ...
- Linux 性能监测:CPU
CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷贝以后给一个中 ...
- Visual studio debug—Process with an Id of 5616 is not running的解决方法
今天调试的时候,碰到下面的问题 打开项目的csproj文件,拉到最下方找我我图中红框中的部分,删除它即可.
- Python 函数参数传递机制.
learning python,5e中讲到.Python的函数参数传递机制是对象引用. Arguments are passed by assignment (object reference). I ...
- Leetcode解题-链表(2.2.0)基础类
1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø 规定好每个子Solution都要实现纯虚函数test做测试: Ø 提供了List ...
- 小小聊天室 Python实现
相对于Java方式的聊天室,Python同样可以做得到.而且可以做的更加的优雅.想必少了那么多的各种流的Python Socket,你一定会喜欢的. 至于知识点相关的内容,这里就不多说了. UDP方式 ...
- android listview 使用
今天在做项目的时候用了自定义listview以及自定义的item.adapter.现在把其中需要注意的地方记录下来: 1.item内如果有button等控件时,在监听listview的onitemcl ...
- Java学习之继承中的执行顺序详解
代码块(理解) (1)用{}括起来的代码. (2)分类: A:局部代码块 用于限定变量的生命周期,及早释放,提高内存利用率. B:构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前 ...