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中,即组件跟踪多个事件。

时间: 2024-12-24 09:09:01

java界面编程(4) ------ Swing事件模型的相关文章

java界面编程(1) ------ Swing基础

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 最近想学下java的界面编程,在此记录下.    大多数的Swing应用都被构建在基础的JFrame内部,JFrame在你作用的任何操作系统中都可以创建视窗应用. 看如下一个最简单的JFrame例子: JFrame frame = new JFrame("Hello Swing"); frame.setDefaultCloseOperation(JFrame.EXIT

java界面编程(5) ------ 按钮和按钮组

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 了解了布局管理器和Swing事件模型,那么剩下的就是Swing 的各个组件了,下面就开始逐个学习Swing的各个组件的用法及功能,本节先来看最常用的按钮和按钮组. 1. 按钮 Swing提供了许多类型的按钮,有普通的按钮,复选框,单选等按钮,甚至菜单项,所有的这些按钮都是从AbstractButton继承而来.如下图的继承关系: 可以看出,JButton,JMenuItem,J

Java界面编程-建立一个可以画出图形的简单框架

引子:总共使用3个.java文件,建立一个简单界面编程的框架. 第1个文件:NotHelloWorldComponent.java //NotHelloWorldComponent.java 1 import java.awt.*; 2 import java.awt.geom.*; 3 import javax.swing.*; 4 5 public class NotHelloWorldComponent extends JComponent { 6 public static final

java 界面编程

转载之u010345869的博客,这里学习下 /* * java复选框和单选按钮 */ import javax.swing.*; import java.awt.*; public class Test0 extends JFrame{ JList jlist; //列表框 JComboBox jcb; //下拉框 JPanel jp1, jp2; //面板 JLabel jlb1, jlb2; JScrollPane jsp; //滚动控件 //构造函数 public Test0(){ jp

java 界面编程(上)

一.AWT介绍 1)AWT(Abstract windows toolkit) 包括了很多类和接口,用于java Application的GUI(Graphics User Interface图形界面编程) 2)GUI的各种元素(窗口,按钮,文本框)等都由java类来实现 3)使用AWT所涉及的类一般在java.awt包及其子包中. 4)Container和Component是AWT中的两个核心类. 所有的可以显示出来的图形元素都被称为Componnet,Component代表了所有的可见的图形

java 界面编程中 JButton问题

在图形化界面编程中,按钮JButton使用时需要布置按钮的位置,更改按钮大小. 1)按钮初始化 JButton button = new JButton() /*在new JButton()括号中可以添加按钮显示的字符等 JButton button = new JButton("JButtonExample") 但是不能初始化按钮的大小和位置*/ 2)JButton按钮的在面板中位置的确定 对JButton大小的设置     ——因为JButton是属于小器件类型的,所以一般的set

轻松学习JavaScript二十七:DOM编程学习之事件模型

在介绍事件模型之前,我们先来看什么是事件和什么是event对象. 一事件介绍 JavaScript事件是由訪问Web页面的用户引起的一系列操作,使我们有能力创建动态页面.事件是能够被 JavaScript侦測到的行为. 网页中的每一个元素都能够产生某些能够触发JavaScript函数的事件.例如说.我们能够在用 户点击某button时产生一个onclick事件来触发某个函数.事件在HTML页面中定义:事件通常与函数配合使用,当事件 发生时函数才会运行:事件一般用于浏览器和用户操作进行交互. 我们

Swing:关于Java界面编程的第一课,如何正确的处理界面中的线程

转载:http://blog.csdn.net/sunyiz/article/details/8004573 关于 Java 的 GUI ,关于 Swing,其实有一件事情是非常重要的 那就是线程! 如何正确的使用 GUI 线程, 什么样的代码应该在 GUI 线程上执行? 什么样的代码应该用其他线程执行? 其实这些都很重要, 但是,很多关于 Java 的教材都没有强调过这些,甚至有的书完全就忽略了这一点 所以,我在这里要给所以开始接触 Swing 的人,讲述一个重要概念: Swing 中的线程

java界面编程(3) ------ 控制布局

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在java 中,组件放置在窗体上的方式可能与其他的GUI系统都不相同.首先,它完全基于代码,没有用来控制组件布置的"资源".第二,组件旋转在窗体上的方式不是通过绝对坐标控制,而是由"布局管理器"根据组件加入的顺序决定位置.使用不同的布局管理器,组件的大小,形状和位置将大不相同,此外,布局管理器还可以适应applet或应用程序窗口的大小,所以如果窗口