利用java的反射机制得到界面类的所有可以增加的事件列表
来源:互联网 发布:哪个电子狗软件比较准 编辑:程序博客网 时间:2024/04/29 15:36
在我们编写JAVA代码的过程中,需要给事件源增加监听事件,可是我们往往记不住这个事件源有那些可以使用的事件,所以我参考《JAVA编程思想》,按照书上的说明,写了如下的代码,主要是能够得到事件源可以使用的事件的列表。
程序运行的界面如下:
这个程序还是有点不完善,输入的类名必须区分大小写 ,另外程序是以javaapplet运行的。
主要的代码如下:
package niutool;
import niutool.Console;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
import java.util.regex.*;
public class ShowAddListeners extends JApplet {
private JTextField name = new JTextField(25);
private JTextArea results = new JTextArea(40, 65);
private static Pattern addListener =
Pattern.compile("(add/w+?Listener/(.*?/))");
private static Pattern qualifier =
Pattern.compile("/w+/.");
class NameL implements ActionListener {
public void actionPerformed(ActionEvent e) {
String nm = name.getText().trim();
if(nm.length() == 0) {
results.setText("没有匹配");
return;
}
Class klass;
try {
klass = Class.forName("javax.swing." + nm);
} catch(ClassNotFoundException ex) {
results.setText("没有匹配");
return;
}
Method[] methods = klass.getMethods();
results.setText("");
for(int i = 0; i < methods.length; i++) {
Matcher matcher =
addListener.matcher(methods[i].toString());
if(matcher.find())
results.append(qualifier.matcher(
matcher.group(1)).replaceAll("") + " ");
}
}
}
public void init() {
NameL nameListener = new NameL();
name.addActionListener(nameListener);
JPanel top = new JPanel();
top.add(new JLabel("Swing 类名 (press ENTER):"));
top.add(name);
Container cp = getContentPane();
cp.add(BorderLayout.NORTH, top);
cp.add(new JScrollPane(results));
// Initial data and test:
name.setText("JTextArea");
nameListener.actionPerformed(
new ActionEvent("", 0 ,""));
}
public static void main(String[] args) {
Console.run(new ShowAddListeners(), 500,400);
}
} ///:~
import niutool.Console;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
import java.util.regex.*;
public class ShowAddListeners extends JApplet {
private JTextField name = new JTextField(25);
private JTextArea results = new JTextArea(40, 65);
private static Pattern addListener =
Pattern.compile("(add/w+?Listener/(.*?/))");
private static Pattern qualifier =
Pattern.compile("/w+/.");
class NameL implements ActionListener {
public void actionPerformed(ActionEvent e) {
String nm = name.getText().trim();
if(nm.length() == 0) {
results.setText("没有匹配");
return;
}
Class klass;
try {
klass = Class.forName("javax.swing." + nm);
} catch(ClassNotFoundException ex) {
results.setText("没有匹配");
return;
}
Method[] methods = klass.getMethods();
results.setText("");
for(int i = 0; i < methods.length; i++) {
Matcher matcher =
addListener.matcher(methods[i].toString());
if(matcher.find())
results.append(qualifier.matcher(
matcher.group(1)).replaceAll("") + " ");
}
}
}
public void init() {
NameL nameListener = new NameL();
name.addActionListener(nameListener);
JPanel top = new JPanel();
top.add(new JLabel("Swing 类名 (press ENTER):"));
top.add(name);
Container cp = getContentPane();
cp.add(BorderLayout.NORTH, top);
cp.add(new JScrollPane(results));
// Initial data and test:
name.setText("JTextArea");
nameListener.actionPerformed(
new ActionEvent("", 0 ,""));
}
public static void main(String[] args) {
Console.run(new ShowAddListeners(), 500,400);
}
} ///:~
里面import niutool.Console,引入了一个Console的工具,源代码如下:
package niutool;
import javax.swing.*;
import java.awt.event.*;
public class Console {
// Create a title string from the class name:
public static String title(Object o) {
String t = o.getClass().toString();
// Remove the word "class":
if(t.indexOf("class") != -1)
t = t.substring(6);
return t;
}
public static void
run(JFrame frame, int width, int height) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width, height);
frame.setVisible(true);
}
public static void
run(JApplet applet, int width, int height) {
JFrame frame = new JFrame(title(applet));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
public static void
run(JPanel panel, int width, int height) {
JFrame frame = new JFrame(title(panel));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.setSize(width, height);
frame.setVisible(true);
}
} ///:~
import javax.swing.*;
import java.awt.event.*;
public class Console {
// Create a title string from the class name:
public static String title(Object o) {
String t = o.getClass().toString();
// Remove the word "class":
if(t.indexOf("class") != -1)
t = t.substring(6);
return t;
}
public static void
run(JFrame frame, int width, int height) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width, height);
frame.setVisible(true);
}
public static void
run(JApplet applet, int width, int height) {
JFrame frame = new JFrame(title(applet));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
public static void
run(JPanel panel, int width, int height) {
JFrame frame = new JFrame(title(panel));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.setSize(width, height);
frame.setVisible(true);
}
} ///:~
- 利用java的反射机制得到界面类的所有可以增加的事件列表
- java中利用反射机制得到一个类的所有构造方法,成员方法机器参数的列表
- Java反射机制(得到类的所有方法)
- 利用java的反射机制得到类的信息
- Java反射机制(得到所有的构造方法)
- 利用c#的反射机制得到类的信息
- java反射机制可以得到类的属性和方法以及类的构造器
- Java反射代码--02.得到某类的所有字段
- Java反射代码--03.得到某类的所有方法
- JAVA利用反射得到类的属性名称
- 使用Java反射机制得到类的结构信息
- 得到某个类的静态属性 java反射机制
- java 通过反射机制得到类的属性和方法
- 利用java反射机制,通过图片的id得到图片的名字
- 利用反射机制,通过资源名字得到资源的ID
- 利用JAVA反射技术查找一个类的所有属性
- 利用JAVA反射技术查找一个类的所有属性
- 利用JAVA反射技术查找一个类的所有属性
- .net中树的封装的类
- 新帖纪念
- 事务的一些总结
- 人生中的8个经典问题,挺有意思
- java学习网站
- 利用java的反射机制得到界面类的所有可以增加的事件列表
- 软件设计过程中的数据库设计的技巧
- 程序设计的基本要素
- 字符集问题的初步探讨(二)
- Legendre矩简介
- 手工打造微型Win32可执行文件
- 你的人脉关系中 绝对不可缺少的十种人
- 采用eprint处理web打印之优势
- SELECT 的使用详解