事件处理
事件处理机制
Swing 组件中的事件处理专门用于响应用户的操作,例如,响应用户的单击鼠标,按下键盘等操作。
在Swing事件处理过程中,主要涉及三类对象
1.事件源:事件发生的场所,通常就是产生事件的组件,例如窗口,按钮,菜单等。
2.事件对象:封装了GUI组件上发生的特定事件(通常就是用户的一次操作)
3.监听器:负责监听事件源上发生的事件,并对各种事件做出相应处理的对象
e.g:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui {
public static void main(String[]arge)
{
Gui gui = new Gui();
gui.createGui();
}
private void createGui()
{
//创建并设置JFrame 容器窗口
JFrame f = new JFrame("FlowLayout");
//所有组件左对齐,水平间距为20,垂直间距为30
f.setLayout(new GridLayout(3,3));
f.setSize(500,500);
f.setLocation(600, 300); // 设置窗体在界面出现的位置
JButton but1 = new JButton("1");
but1.addActionListener(new MyListener());
f.add(but1);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class MyListener implements ActionListener{
public void actionPerformed(ActionEvent e)
{
System.out.print("用户点击了按钮");
}
}
}
实现Swing事件处理的主要步骤如下:
- 创建事件源。除了一些常见的按钮,键盘等组件可以作为事件源,包括JFrame窗口在内的顶级容器也可以作为事件源
- 自定义事件监听器。根据要监听的事件源创建指定类型的监听器进行事件处理,该监听器是一个特殊的java类,必须实现相应的接口 如 WindowListener 用于监听窗口事件,ActionListener 用于监听动作事件
- 为事件注册监听器,使用addXxxListener()方法为指定事件源添加特定类型的监听器
Swing 常用事件处理
在Swing 中,提供了丰富的事件,这些事件大致可以分为窗体事件(WindowEvent),鼠标事件(MouseEvent)键盘事件(KeyEvvent),动作事件(ActionEvent)等
1.窗体事件
当对窗体进行操作时,例如窗体的打开,关闭,激活,停用等,这些动作都属于窗体事件,java中提供了一个WindowEvent类用于表示窗体事件。在应用程序中,当对窗体事件进行处理时。首先需要定义一个实现了WindowListener接口的类作为窗体监听器,然后通过addWindowListener()方法将窗体对象与窗体监听器进行绑定
e.g:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui {
public static void main(String[]arge)
{
Gui gui = new Gui();
gui.createGui();
}
private void createGui()
{
//创建并设置JFrame 容器窗口
JFrame f = new JFrame("FlowLayout");
//所有组件左对齐,水平间距为20,垂直间距为30
f.setLayout(new GridLayout(3,3));
f.setSize(500,500);
f.setLocation(600, 300); // 设置窗体在界面出现的位置
f.addWindowListener(new MyWindowListener());
JButton but1 = new JButton("1");
but1.addActionListener(new MyListener());
f.add(but1);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class MyListener implements ActionListener{
public void actionPerformed(ActionEvent e)
{
System.out.print("用户点击了按钮");
}
}
class MyWindowListener implements WindowListener{
public void windowOpened(WindowEvent e)
{
System.out.println("窗体打开");
}
public void windowIconified(WindowEvent e)
{
System.out.println("窗体独立化事件");
}
public void windowDeiconified(WindowEvent e)
{
System.out.println("窗体取消图标事件");
}
public void windowDeactivated(WindowEvent e)
{
System.out.println("窗体停用事件");
}
public void windowClosing(WindowEvent e)
{
System.out.println("窗体正在关闭");
}
public void windowClosed(WindowEvent e)
{
System.out.println("窗体关闭事件");
}
public void windowActivated(WindowEvent e)
{
System.out.println("窗体激活事件");
}
}
}
2.鼠标事件
java中提供了一个MouseEvent类用于表示鼠标事件,几乎所有的组件都可以产生鼠标事件。处理鼠标事件时,首先需要通过实现MouseListener接口定义监听器,也可以通过继承适配器MouseAdapter类来实现,然后调用addMouseListener()方法将监听器绑定到事件源对象。getClickCount()方法可以获得鼠标单击次数
e.g:
package Doit;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui {
public static void main(String[]arge)
{
Gui gui = new Gui();
gui.createGui();
}
private void createGui()
{
//创建并设置JFrame 容器窗口
JFrame f = new JFrame("FlowLayout");
//所有组件左对齐,水平间距为20,垂直间距为30
f.setLayout(new GridLayout(3,3));
f.setSize(500,500);
f.setLocation(600, 300); // 设置窗体在界面出现的位置
f.addWindowListener(new MyWindowListener());
JButton but1 = new JButton("1");
but1.addMouseListener(new MyMouse());
f.add(but1);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class MyListener implements ActionListener{
public void actionPerformed(ActionEvent e)
{
System.out.print("用户点击了按钮");
}
}
class MyWindowListener implements WindowListener{
public void windowOpened(WindowEvent e)
{
System.out.println("窗体打开");
}
public void windowIconified(WindowEvent e)
{
System.out.println("窗体独立化事件");
}
public void windowDeiconified(WindowEvent e)
{
System.out.println("窗体取消图标事件");
}
public void windowDeactivated(WindowEvent e)
{
System.out.println("窗体停用事件");
}
public void windowClosing(WindowEvent e)
{
System.out.println("窗体正在关闭");
}
public void windowClosed(WindowEvent e)
{
System.out.println("窗体关闭事件");
}
public void windowActivated(WindowEvent e)
{
System.out.println("窗体激活事件");
}
}
class MyMouse implements MouseListener
{
public void mouseReleased(MouseEvent e)
{
System.out.println("鼠标放开事件");
}
public void mousePressed(MouseEvent e)
{
System.out.println("鼠标按下事件");
}
public void mouseExited(MouseEvent e)
{
System.out.println("鼠标移出按钮区");
}
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入按钮区");
}
public void mouseClicked(MouseEvent e)
{
if(e.getButton() == MouseEvent.BUTTON1)
{
System.out.println("鼠标左击事件");
}
if(e.getButton() == MouseEvent.BUTTON3)
{
System.out.println("鼠标右击事件");
}
if(e.getButton() == MouseEvent.BUTTON2)
{
System.out.println("鼠标中击事件");
}
}
}
}
3.键盘事件
java中提供了一个KeyEvent类表示键盘事件,处理KeyEvent事件的监听器对象需要实现KeyListener接口或者KeyAdapter类,然后调用addKeyListener()方法将监听器绑定到事件源对象
e.g:
package Doit;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui {
public static void main(String[]arge)
{
Gui gui = new Gui();
gui.createGui();
}
private void createGui()
{
//创建并设置JFrame 容器窗口
JFrame f = new JFrame("FlowLayout");
//所有组件左对齐,水平间距为20,垂直间距为30
f.setLayout(new GridLayout(3,3));
f.setSize(500,500);
f.setLocation(600, 300); // 设置窗体在界面出现的位置
f.addWindowListener(new MyWindowListener());
JButton but1 = new JButton("1");
but1.addMouseListener(new MyMouse());
JTextField tf = new JTextField(30);
tf.addKeyListener(new MyKeyAdapter());
f.add(but1);
f.add(tf);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class MyListener implements ActionListener{
public void actionPerformed(ActionEvent e)
{
System.out.print("用户点击了按钮");
}
}
class MyWindowListener implements WindowListener{
public void windowOpened(WindowEvent e)
{
System.out.println("窗体打开");
}
public void windowIconified(WindowEvent e)
{
System.out.println("窗体独立化事件");
}
public void windowDeiconified(WindowEvent e)
{
System.out.println("窗体取消图标事件");
}
public void windowDeactivated(WindowEvent e)
{
System.out.println("窗体停用事件");
}
public void windowClosing(WindowEvent e)
{
System.out.println("窗体正在关闭");
}
public void windowClosed(WindowEvent e)
{
System.out.println("窗体关闭事件");
}
public void windowActivated(WindowEvent e)
{
System.out.println("窗体激活事件");
}
}
class MyMouse implements MouseListener
{
public void mouseReleased(MouseEvent e)
{
System.out.println("鼠标放开事件");
}
public void mousePressed(MouseEvent e)
{
System.out.println("鼠标按下事件");
}
public void mouseExited(MouseEvent e)
{
System.out.println("鼠标移出按钮区");
}
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入按钮区");
}
public void mouseClicked(MouseEvent e)
{
if(e.getButton() == MouseEvent.BUTTON1)
{
System.out.println("鼠标左击事件");
}
if(e.getButton() == MouseEvent.BUTTON3)
{
System.out.println("鼠标右击事件");
}
if(e.getButton() == MouseEvent.BUTTON2)
{
System.out.println("鼠标中击事件");
}
}
}
class MyKeyAdapter extends KeyAdapter{
public void KeyPressed(KeyEvent e)
{
char keyChar = e.getKeyChar();
int keyCode = e.getKeyCode();
System.out.println("按下键盘的字符内容为"+ keyChar + " ");
System.out.println("按下键盘的字符代码为:" +keyCode);
}
}
}