`
kylixs
  • 浏览: 66009 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Swing Application Framework 学习笔记:@Action绑定的函数调用及参数

阅读更多

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){......}

2
0
分享到:
评论

相关推荐

    Better Swing Application Framework-开源

    这是Swing应用程序框架(JSR 296)的分支。 BSAF项目的官方主页位于http://kenai.com/projects/bsaf-所有源代码存储库,讨论列表,论坛和资源都在Kenai托管。

    Java swing 知识总结学习笔记

    ### Java Swing 知识总结学习笔记 #### 一、Swing 概述 Swing 是一个用于构建桌面应用程序的 Java 图形用户界面 (GUI) 工具包,它基于 Java Abstract Window Toolkit (AWT) 构建而成。Swing 提供了更丰富的组件集...

    JIDE Desktop Application Framework(桌面应用框架) 开发员技术手册

    ### JIDE Desktop Application Framework(桌面应用框架) 开发员技术手册关键知识点解析 #### JIDE Desktop Application Framework 简介 - **背景**: 随着应用程序规模的扩大,Swing 开发面临诸多挑战,例如缺乏一致...

    Java Swing组件:Jlist学习笔记

    ### Java Swing 组件:JList 学习笔记 #### JList 概述 JList 是 Java Swing 中的一个重要组件,用于展示列表项。它能够帮助开发者实现数据的动态展示、编辑以及选择等功能,广泛应用于各种桌面应用软件界面设计中...

    函数调用参数传递类型(java)的用法介绍..ppt

    本文档主要介绍 Java 中函数调用参数传递类型的用法,通过对 Applet 概述、Applet 应用程序接口、绘图、Swing 基础、Swing 的特点和概念、Swing 组件、其它 Swing 特性等方面的讲解,展示了 Java 语言程序设计的主要...

    Swing学习系列 -- Swing读书笔记目录

    这篇Swing读书笔记目录旨在帮助开发者更好地理解和掌握Swing的相关知识,通过阅读和学习,可以提升在Java GUI编程上的技能。 首先,Swing是Java Foundation Classes (JFC)的一部分,它是Sun Microsystems为Java平台...

    java学习笔记之一Swing

    ### Java Swing 学习笔记详解 #### 一、引言 在Java图形用户界面(GUI)编程领域,Swing 是一个强大的工具包,用于构建功能丰富且美观的应用程序界面。与早期的 AWT(Abstract Window Toolkit)相比,Swing 提供了...

    java Swing 中调用摄像头拍照源码(有说明)

    在Java中,调用摄像头并非Swing库的直接功能,而是通过Java Media Framework (JMF) 或者更现代的Java Media API如JavaFX来实现的。JMF是一个用于处理媒体内容(包括音频、视频)的平台,它可以捕捉、播放、处理和...

    java swing 调用本地摄像头

    在Java Swing中,我们可以通过Java Media Framework (JMF) 或者更现代的JavaFX来实现调用本地摄像头的功能。下面将详细介绍如何在Java Swing应用中实现这一功能。 首先,让我们了解Java Media Framework (JMF)。JMF...

    JComboBox动态绑定数据库

    `JComboBox`是Swing中的一个组合框控件,可以通过构造函数创建,添加元素,设置默认选中项等。例如: ```java JComboBox&lt;String&gt; comboBox = new JComboBox(new String[]{"选项1", "选项2", "选项3"}); ``` 接下来...

    swing-framework.jar

    用于java swing编程的jar包。图形界面编程使用,缺此jar包的可以下载。

    java图形编程:Action接口(Swing新增功能)专题借鉴.pdf

    Java 图形编程:Action 接口(Swing 新增功能)专题借鉴 Action 接口是 Java 中的 Swing 库中的一个重要组件,该接口继承自 ActionListener 接口,提供了统一的方式来处理按钮、菜单项和工具条上的按钮的事件。下面...

    Swing读书笔记

    ### Swing读书笔记:深入理解Swing的包与版面结构 #### Swing的常用包解析 Swing作为Java中用于创建图形用户界面(GUI)的主要库,提供了丰富的组件和功能,其核心包及其作用如下: 1. **`javax.swing`**: - 这是...

    SWING大刀系列源码

    主题:Swing是一把刀 http://www.iteye.com/topic/702804 主题:Swing第二刀:枝间新绿一重重 http://www.iteye.com/topic/707540 主题:Swing第二小刀刀:星星之火可以燎原 http://www.iteye.com/topic/707514 ...

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

    java swing opencv调用摄像头实现拍照及本地保存支持上传FTP路径配置

    在本文中,我们将深入探讨如何使用Java Swing和OpenCV库来调用摄像头,实现拍照功能,并将拍摄的照片本地保存以及支持上传至FTP服务器。通过理解并应用这些知识点,你可以创建一个用户友好的桌面应用程序,方便地...

    JAVA学习笔记swing JFrame窗口学习.rar_it_java swing_jframe_jframe mwc

    在Java编程语言中,Swing库是...在学习过程中,参考“JAVA学习笔记swing JFrame窗口学习.txt”文档将有助于深入理解这一主题。同时,“www.pudn.com.txt”可能提供了更多相关的学习资源和示例代码,可供进一步研究。

    NetBeans IDE 6.0 用户界面设计

    Beans Binding 和 Swing Application Framework 在基于最新的 JCP 规范 Beans Binding(JSR 295)和 Swing Application Framework(JSR 296)构建应用程序方面,NetBeans 6.0 为桌面开发人员提供了一些方便的特性;...

    JDK 6 java 学习笔记的代码

    3. **可变参数(Varargs)**:JDK 6引入了可变参数,允许函数接受不定数量的同一类型的参数。例如,`public void printNumbers(int... numbers) {...}` 这样的函数可以接受零个、一个或多个整数。 4. **泛型的改进*...

Global site tag (gtag.js) - Google Analytics