使用反射技术查询Swing任意组件支持的所有事件监听器

今天一时兴起在看《Java编程思想》 时,发现了一个好玩的东西。

针对书上的例子,对代码做了优化。

功能说明:

通过输入一个组件的名称,使用反射技术查询该组件支持的所有事件监听器方法。

效果如下
在这里插入图片描述

代码如下所示:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Method;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author qing-feng.zhao
 */
public class ShowAddListeners extends JFrame {
    /**
     * JTextField 输入框
     */
    private JTextField jTextField=new JTextField(25);
    /**
     * JTextArea 输出结果
     */
    private JTextArea results=new JTextArea(40,65);
    /**
     * 正则表达式查找符合*Listener的方法
     */
    private static final Pattern LISTENER_PATTERN=Pattern.compile("(add\\w+?Listener\\(.*?\\))");
    /**
     * 正则表达式匹配结果
     */
    private static final Pattern QUALIFIER=Pattern.compile("\\w+\\.");

    public static void main(String[] args) {
        new ShowAddListeners();
    }

    public ShowAddListeners(){
        //创建事件监听
        NameListener nameListener=new NameListener();
        //输入框添加监听事件
        jTextField.addActionListener(nameListener);
        //设置回车监听
        nameListener.actionPerformed(new ActionEvent("",0,""));

        //创建一个局部容器 用来存放输入框控件
        JPanel jPanel=new JPanel();
        //添加一个Label 控件
        jPanel.add(new JLabel("Swing class name (press Enter)"));
        //设置输入框 输入提示
        jTextField.setToolTipText("JTextArea");
        //添加一个输入框
        jPanel.add(jTextField);

        //添加一个容器控件
        super.add(BorderLayout.NORTH,jPanel);

        //添加一个滚动组件
        super.add(new JScrollPane(results));

        //设置标题
        super.setTitle("查询Swing组件支持的所有事件监听器");
        //设置窗体尺寸
        super.setSize(500,400);
        //告诉JFrame 当用户执行关闭操作时 退出程序
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //显示可见
        super.setVisible(true);
    }

    /**
     * 单击事件
     */
    class NameListener implements ActionListener{
        /**
         * 当按钮被按下时候出发该方法
         * @param e
         */
        @Override
        public void actionPerformed(ActionEvent e) {
            //获取输入框的内容
            String typeMessageData=jTextField.getText().trim();
            //检查输入的内容是否为空
            if(typeMessageData.length()==0){
                results.setText("NO match");
                return ;
            }
            //通过反射获取方法
            Class<?> kind = null;
            try {
                kind=Class.forName("javax.swing."+typeMessageData);
            } catch (ClassNotFoundException ex) {
                results.setText("NO match");
            }
            Method[] methods= new Method[0];
            try {
                methods = kind.getMethods();
            } catch (SecurityException ex) {
                results.setText("NO match");
            }
            results.setText("");
            for (Method method:methods
                 ) {
                Matcher matcher=LISTENER_PATTERN.matcher(method.toGenericString());
                if(matcher.find()){
                    results.append(QUALIFIER.matcher(matcher.group(1)).replaceAll(" ")+"\n");
                }
            }
        }
    }
}
发布了194 篇原创文章 · 获赞 262 · 访问量 48万+

猜你喜欢

转载自blog.csdn.net/hadues/article/details/104507145