jdesktop的Application Framework -- Java 桌面应用程序的一个框架
使用@Action绑定事件到某个函数时,可以设置若干参数,函数被框架执行的时候将填充这些参数。下面是从源码中拷来的:
1、Action的入口函数:
如果不是代理的action就执行noProxyActionPerformed(actionEvent);
public void actionPerformed(ActionEvent actionEvent) {
javax.swing.Action proxy = getProxy();
if (proxy != null) {
actionEvent.setSource(getProxySource());
proxy.actionPerformed(actionEvent);
}
else if (actionMethod != null) {
noProxyActionPerformed(actionEvent);
}
}
2、执行事件绑定的函数:
private void noProxyActionPerformed(ActionEvent actionEvent) {
Object taskObject = null;
/* Create the arguments array for actionMethod by
* calling getActionArgument() for each parameter.
*/
Annotation[][] allPAnnotations = actionMethod.getParameterAnnotations();
Class<?>[] pTypes = actionMethod.getParameterTypes();
Object[] arguments = new Object[pTypes.length];
for(int i = 0; i < pTypes.length; i++) {
String pKey = null;
for(Annotation pAnnotation : allPAnnotations[i]) {
if (pAnnotation instanceof Action.Parameter) {
pKey = ((Action.Parameter)pAnnotation).value();
break;
}
}
arguments[i] = getActionArgument(pTypes[i], pKey, actionEvent);
}
/* Call target.actionMethod(arguments). If the return value
* is a Task, then execute it.
*/
try {
Object target = appAM.getActionsObject();
taskObject = actionMethod.invoke(target, arguments);
}
catch (Exception e) {
actionFailed(actionEvent, e);
}
if (taskObject instanceof Task) {
Task task = (Task)taskObject;
if (task.getInputBlocker() == null) {
task.setInputBlocker(createInputBlocker(task, actionEvent));
}
ApplicationContext ctx = appAM.getContext();
ctx.getTaskService().execute(task);
}
}
3、获取调用参数的方法:
Object org.jdesktop.application.ApplicationAction.getActionArgument(Class pType, String pKey, ActionEvent actionEvent)
Provides parameter values to @Action methods. By default, parameter values are selected based exclusively on their type:
Parameter TypeParameter Value
ActionEvent |
actionEvent |
javax.swing.Action |
this ApplicationAction object |
ActionMap |
the ActionMap that contains this Action |
ResourceMap |
the ResourceMap of the the ActionMap that contains this Action |
ApplicationContext |
the value of ApplicationContext.getInstance() |
ApplicationAction subclasses may also select values based on the value of the Action.Parameter annotation, which is passed along as the pKey argument to this method:
@Action public void doAction(@Action.Parameter("myKey") String myParameter) {
// The value of myParameter is computed by:
// getActionArgument(String.class, "myKey", actionEvent)
}
If pType and pKey aren't recognized, this method calls actionFailed
with an IllegalArgumentException.
Parameters: pType parameter type pKey the value of the @Action.Parameter annotation actionEvent the ActionEvent that trigged this Action
protected Object getActionArgument(Class pType, String pKey, ActionEvent actionEvent) {
Object argument = null;
if (pType == ActionEvent.class) {
argument = actionEvent;
}
else if (pType == javax.swing.Action.class) {
argument = this;
}
else if (pType == ActionMap.class) {
argument = appAM;
}
else if (pType == ResourceMap.class) {
argument = resourceMap;
}
else if (pType == ApplicationContext.class) {
argument = appAM.getContext();
}
else if (pType == Application.class) {
argument = appAM.getContext().getApplication();
}
else {
Exception e = new IllegalArgumentException("unrecognized @Action method parameter");
actionFailed(actionEvent, e);
}
return argument;
}
代码示例:
1.没有参数
@Action
public void search() {
// your code...
}
2. 带ActionEvent参数,获得参数的能力等同写在ActionListener里面了
@Action
public void search(ActionEvent e) {
// your code...
}
3.带ResourceMap,这个比较实用,可以直接取到这个类的资源映射表
@Action
public void search(ResourceMap resourceMap, ActionEvent e) {
// your code...
}
补充一下,一个Application可以有多个Resource文件。如果存在一个和类同名的properties文件,则这个被认为是此类的资源文件,否则使用这个Application的资源文件。这种组织方式比较好,可以将资源分散到调用类的资源文件里定义,方便维护,结构清晰。
4.其它参数类似,只要类型匹配就行,顺序没关系!!
ApplicationAction类还不支持@Action.Parameter,程序中没处理,但这个可以很方便扩展。
总结:
使用@Action绑定事件到某个函数,这不但可以获取原来所需的参数,而且还可以方便的获得Application的相关参数,也支持扩展。
极力推荐使用这种方式编写Swing的事件处理,再也不用写n个Action了,或是那些看到麻木的new ActionListener(ActionEvent e){......}
分享到:
相关推荐
这是Swing应用程序框架(JSR 296)的分支。 BSAF项目的官方主页位于http://kenai.com/projects/bsaf-所有源代码存储库,讨论列表,论坛和资源都在Kenai托管。
### Java Swing 知识总结学习笔记 #### 一、Swing 概述 Swing 是一个用于构建桌面应用程序的 Java 图形用户界面 (GUI) 工具包,它基于 Java Abstract Window Toolkit (AWT) 构建而成。Swing 提供了更丰富的组件集...
### JIDE Desktop Application Framework(桌面应用框架) 开发员技术手册关键知识点解析 #### JIDE Desktop Application Framework 简介 - **背景**: 随着应用程序规模的扩大,Swing 开发面临诸多挑战,例如缺乏一致...
### Java Swing 组件:JList 学习笔记 #### JList 概述 JList 是 Java Swing 中的一个重要组件,用于展示列表项。它能够帮助开发者实现数据的动态展示、编辑以及选择等功能,广泛应用于各种桌面应用软件界面设计中...
本文档主要介绍 Java 中函数调用参数传递类型的用法,通过对 Applet 概述、Applet 应用程序接口、绘图、Swing 基础、Swing 的特点和概念、Swing 组件、其它 Swing 特性等方面的讲解,展示了 Java 语言程序设计的主要...
这篇Swing读书笔记目录旨在帮助开发者更好地理解和掌握Swing的相关知识,通过阅读和学习,可以提升在Java GUI编程上的技能。 首先,Swing是Java Foundation Classes (JFC)的一部分,它是Sun Microsystems为Java平台...
### Java Swing 学习笔记详解 #### 一、引言 在Java图形用户界面(GUI)编程领域,Swing 是一个强大的工具包,用于构建功能丰富且美观的应用程序界面。与早期的 AWT(Abstract Window Toolkit)相比,Swing 提供了...
在Java中,调用摄像头并非Swing库的直接功能,而是通过Java Media Framework (JMF) 或者更现代的Java Media API如JavaFX来实现的。JMF是一个用于处理媒体内容(包括音频、视频)的平台,它可以捕捉、播放、处理和...
在Java Swing中,我们可以通过Java Media Framework (JMF) 或者更现代的JavaFX来实现调用本地摄像头的功能。下面将详细介绍如何在Java Swing应用中实现这一功能。 首先,让我们了解Java Media Framework (JMF)。JMF...
`JComboBox`是Swing中的一个组合框控件,可以通过构造函数创建,添加元素,设置默认选中项等。例如: ```java JComboBox<String> comboBox = new JComboBox(new String[]{"选项1", "选项2", "选项3"}); ``` 接下来...
用于java swing编程的jar包。图形界面编程使用,缺此jar包的可以下载。
Java 图形编程:Action 接口(Swing 新增功能)专题借鉴 Action 接口是 Java 中的 Swing 库中的一个重要组件,该接口继承自 ActionListener 接口,提供了统一的方式来处理按钮、菜单项和工具条上的按钮的事件。下面...
### Swing读书笔记:深入理解Swing的包与版面结构 #### Swing的常用包解析 Swing作为Java中用于创建图形用户界面(GUI)的主要库,提供了丰富的组件和功能,其核心包及其作用如下: 1. **`javax.swing`**: - 这是...
主题:Swing是一把刀 http://www.iteye.com/topic/702804 主题:Swing第二刀:枝间新绿一重重 http://www.iteye.com/topic/707540 主题:Swing第二小刀刀:星星之火可以燎原 http://www.iteye.com/topic/707514 ...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。
在本文中,我们将深入探讨如何使用Java Swing和OpenCV库来调用摄像头,实现拍照功能,并将拍摄的照片本地保存以及支持上传至FTP服务器。通过理解并应用这些知识点,你可以创建一个用户友好的桌面应用程序,方便地...
在Java编程语言中,Swing库是...在学习过程中,参考“JAVA学习笔记swing JFrame窗口学习.txt”文档将有助于深入理解这一主题。同时,“www.pudn.com.txt”可能提供了更多相关的学习资源和示例代码,可供进一步研究。
Beans Binding 和 Swing Application Framework 在基于最新的 JCP 规范 Beans Binding(JSR 295)和 Swing Application Framework(JSR 296)构建应用程序方面,NetBeans 6.0 为桌面开发人员提供了一些方便的特性;...
3. **可变参数(Varargs)**:JDK 6引入了可变参数,允许函数接受不定数量的同一类型的参数。例如,`public void printNumbers(int... numbers) {...}` 这样的函数可以接受零个、一个或多个整数。 4. **泛型的改进*...