Java Swing使用注解绑定事件监听

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

@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 JTextField		tfName;
	private JPasswordField	pfPass;
	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()));
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值