import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
@Target (ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)//运行时调用
@interface ActionListenerFor {
Class<? extends ActionListener> listener();
}
public class AnnotationTest {
private JFrame mainWin = new JFrame("使用注释绑定事件监听器");
@ActionListenerFor(listener = OkListener.class)
private JButton ok = new JButton("确定");
@ActionListenerFor(listener = CancelListener.class)
private JButton cancel = new JButton("取消");
public void init(){
//初始化界面的方法
JPanel jp = new JPanel();
jp.add(ok);
jp.add(cancel);
mainWin.add(jp);
ActionListenerInstaller.processAnnotation(this);
mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWin.pack();
mainWin.setVisible(true);
}
public static void main(String[] args){
new AnnotationTest().init();
}
}
class ActionListenerInstaller{
public static void processAnnotation(Object obj){
try{
Class c1 = obj.getClass();
for (Field f:c1.getDeclaredFields()) {
//将制定field设定为可以自由访问
f.setAccessible(true);
//获取指定类型的annotation
ActionListenerFor a = f.getAnnotation(ActionListenerFor.class);
//获取f Field实际对应的对象
Object fObj = f.get(obj);
//如果f是Abstractbutton,则a!=null
if (a != null && fObj != null && fObj instanceof AbstractButton) {
Class< ? extends ActionListener> listenerClazz = a.listener();
//使用反射来创建listener类的对象
ActionListener a1 = listenerClazz.newInstance();
AbstractButton ab = (AbstractButton) fObj;
//为ab添加事件监听器
ab.addActionListener(a1);
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
class OkListener implements ActionListener{
public void actionPerformed(ActionEvent evt){
JOptionPane.showMessageDialog(null, "单击了确认按钮");
}
}
//定义cancel按钮的事件监听器实现类
class CancelListener implements ActionListener{
public void actionPerformed(ActionEvent evt){
JOptionPane.showMessageDialog(null, "单击了取消按钮");
}
}