首页 > 代码库 > java界面编程(4) ------ Swing事件模型

java界面编程(4) ------ Swing事件模型

本文是自己学习所做笔记,欢迎转载,但请注明出处: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中,即组件跟踪多个事件。





java界面编程(4) ------ Swing事件模型