java swing监听_Java Swing使用注解绑定事件监听

本文介绍了如何在Java Swing中使用注解来绑定事件监听。首先定义了一个名为`OpActionListener`的注解,接着创建了`ActionListenerAttach`类来处理注解并绑定事件。通过反射机制,动态地为组件添加ActionListener,并展示了在`LoginFrame`类中如何使用注解实现点击事件的响应,展示了一个简单的登录界面示例。
摘要由CSDN通过智能技术生成

首先创建一个注解,目前只实现了一个点击事件,其他的原理相同

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface OpActionListener

{

String value();

}

然后创建一个ActionListenerAttach 来绑定事件

package com.demo.inject;

import com.demo.annotation.OpActionListener;

import java.awt.event.ActionListener;

import java.lang.reflect.*;

/**

* User: jay.zhoujingjie

* Date: 14-2-17

* Time: 下午5:18

*/

public class ActionListenerAttach

{

private Object obj;

public ActionListenerAttach(Object obj){

this.obj =obj;

for(Method method: obj.getClass().getDeclaredMethods()){

OpActionListener ann = method.getAnnotation(OpActionListener.class);

if(ann != null){

String value = ann.value();

try

{

Field field = obj.getClass().getDeclaredField(value);

if(!field.isAccessible()){

field.setAccessible(true);

addListener(field.get(obj),method);

}

} catch (Exception e)

{

e.printStackTrace();

}

}

}

}

public void addListener(final Object source,final Method m) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException

{

Object listener = Proxy.newProxyInstance(obj.getClass().getClassLoader(),new Class[]{ActionListener.class},new InvocationHandler() {

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable

{

if(m.getParameterTypes().length == 0){

return m.invoke(obj);

}

return m.invoke(obj,args);

}

});

source.getClass().getMethod("addActionListener",ActionListener.class).invoke(source, listener);

}

}

最后看实现,绑定的方法名称不重要,可以带参数,可以不带参数

public class LoginFrame extends ParentFrame

{

private JTextFieldtfName;

private JPasswordFieldpfPass;

private JButton btnLogin;

public LoginFrame()

{

initUI();

new ActionListenerAttach(this);

}

private void initUI()

{

Container container = this.getContentPane();

this.setLayout(new GridBagLayout());

container.add(new JLabel("用户名:"), gbc(0, 0, 1, 1));

container.add(tfName = new JTextField(10), gbc(1, 0, 3, 1));

container.add(new JLabel("密 码:"), gbc(0, 1, 1, 1));

container.add(pfPass = new JPasswordField(10), gbc(1, 1, 3, 1));

container.add(btnLogin = new JButton("登陆"), gbc(1, 2, 2, 1));

this.setSize(200, 150);

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

setVisible(true);

}

@OpActionListener("btnLogin")

public void click(){

JOptionPane.showMessageDialog(null, tfName.getText() + "\n" + String.valueOf(pfPass.getPassword()));

}

@OpActionListener("btnLogin")

public void click(ActionEvent event){

JOptionPane.showMessageDialog(null, tfName.getText() + "\n" + String.valueOf(pfPass.getPassword()));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值