今天一时兴起在看《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");
}
}
}
}
}