本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020
在Swing的事件模型中,组件可以发起(触发)一个事件。每种事件的类型由不同的类表示,当事件被触发时,它将被一个或多个“监听器”接收,监听器负责处理事件。所以,事件发生的地方可以与事件处理的地方分离开。既然是以这种方式使用Swing组件,那么就只需要编写组件收到事件时将被调用的代码。所谓事件监听器,就是一个“实现特定类型的监听器接口”类对象。
下面,就以一个查找Swing组件里的addListener的例子来演示Swing事件模型,完整代码如下:
public class ShowAddListeners extends JFrame { private JTextField name = new JTextField(18); private JButton search = new JButton("查询"); private JTextArea results = new JTextArea(30,50); //定义正则表达式匹配addListener private static Pattern addListener = Pattern.compile("(add\\w+?Listener\\(.*?\\))"); private static Pattern qualifier = Pattern.compile("\\w+\\."); public ShowAddListeners(){ setVisible(true); setSize(600, 400); JPanel top = new JPanel(); top.add(new JLabel("Swing Class name(press Enter):")); top.add(name); top.add(search); add(BorderLayout.NORTH,top); add(new JScrollPane(results)); //设置不可编辑 //results.setEditable(false); search.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { // TODO Auto-generated method stub //去掉关键字的前后空格 String nm = name.getText().trim(); //如果去掉关键字后长度为为,则显示没有匹配成功的 if(nm.length() == 0){ results.setText("no match!"); return; } Class<?> kind; try { kind = Class.forName("javax.swing."+nm); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block results.setText("no match!"); return; } Method[] methods = kind.getMethods(); results.setText(""); for(Method m : methods){ Matcher matcher = addListener.matcher(m.toString()); //如果找到了匹配的方法,则输出 if(matcher.find()){ results.append(qualifier.matcher(matcher.group(1)).replaceAll("")+"\n"); } } } }); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new ShowAddListeners(); } }效果:
这里面主要用到了正则表达式用于匹配相应的监听器,这里只是用到了一个监听器接收,上面也提到了,组件也可以绑定多个监听器。
下面就实现JButton的几个重要的事件监听器,分别是FocusListener、KeyListener、MouseListener和MouseMotionListener
,给按钮绑定这些监听器,当对应的事件发生时,触发相应的事件,从而执行对应的操作,完整代码如下:
public class TrackEvent extends JFrame { private HashMap<String,JTextField> map = new HashMap<String,JTextField>(); private String[] event = { "focusGained", "focusLost", "keyPressed", "keyReleased", "keyTyped", "mouseClicked", "mouseEntered", "mouseExited", "mousePressed", "mouseReleased", "mouseDragged", "mouseMoved" }; private MyButton b1 = new MyButton(Color.BLUE,"test1"); private MyButton b2 = new MyButton(Color.RED,"test2"); class MyButton extends JButton{ private void report(String field,String msg){ map.get(field).setText(msg); } private FocusListener fl = new FocusListener() { @Override public void focusLost(FocusEvent e) { // TODO Auto-generated method stub report("focusLost",e.paramString()); } @Override public void focusGained(FocusEvent e) { // TODO Auto-generated method stub report("focusGained",e.paramString()); } }; private KeyListener kl = new KeyListener() { @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub report("keyTyped",e.paramString()); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub report("keyReleased",e.paramString()); } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub report("keyPressed",e.paramString()); } }; private MouseListener ml = new MouseListener() { @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub report("mouseReleased",e.paramString()); } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub report("mousePressed",e.paramString()); } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub report("mouseExited",e.paramString()); } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub report("mouseEntered",e.paramString()); } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub report("mouseClicked",e.paramString()); } }; private MouseMotionListener mml = new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub report("mouseMoved",e.paramString()); } @Override public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub report("mouseDragged",e.paramString()); } }; public MyButton(Color color,String label) { super(label); setBackground(color); addFocusListener(fl); addKeyListener(kl); addMouseListener(ml); addMouseMotionListener(mml); } } public TrackEvent() { // TODO Auto-generated constructor stub setLayout(new GridLayout(event.length + 1,2)); for(String evt : event){ JTextField tf = new JTextField(); tf.setEditable(false); add(new JLabel(evt,JLabel.RIGHT )); add(tf); setSize(700,500); setVisible(true); map.put(evt, tf); } add(b1); add(b2); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // TODO Auto-generated method stub new TrackEvent(); } }); } }执行结果:
这样,鼠标单击按钮,拖动按钮,移动按钮等事件发生时,就会触发相应的监听器,从而将事件的动作以字符串的形式显示在JTextField中,即组件跟踪多个事件。
原文地址:http://blog.csdn.net/jesson20121020/article/details/41123217