Java(10)事件处理

Java(10)事件处理

一.驱动模型

1.1.4个

1.事件源

能接受外部事件的源体,有JButton

2.事件对象

产生了什么样的信息,有ActionEvent

import java.awt.event;
import javax.swing.event;

3.事件监听器

方法

4.事件源注册

事件源与事件绑定

1.2.常用的事件

事件类名称 说明
ActionEvent 按下按钮,文本框回车键,下拉列表
ItemEvent JCheckBox,JComboBox
ChangeEvent 可以设数值的拖拽上,Jslider(滑块),JProgressBar(进度条)
WindowEvent 窗口的操作
MouseEvent 鼠标操作
FocusEvent 组件获得与失去焦点
KeyEvent 键盘操作

1.3.常见的动作与监听器

动作 事件类(对象) 监听口接口类型
单击Button,文本框按下回车键,双击列表框 ActionEvent ActionListener
窗口激活,关闭,失效,恢复,最小化 WindowEvent WindowListener
在组件上点击鼠标 MouseEvent MouseListener
鼠标移动 MouseEvent MouseMotionListener
键盘操作 KetEvent KeyListener

1.4.事件处理方法

1.实现事件监听接口

(1)创建事件源

JButton clearButton  = new JButton();

(2)注册事件源到监听器(绑定)

addXXXListtener
clearButton.addActionListtener(this);

(3)实现监听器接口的接收事件

public void actionPerformed(ActionEvent e){
    
    
	
}

使用ActionEvent类的

  1. getSource()返回事件发生的对象
  2. getActionCommand()返回按钮名

(4)每个事件的处理方法

private void clearText(){
    
    
	
}

2.使用事件监听器适配器类

3.使用匿名内部类

二.按钮

2.1.界面要求

2.2.代码分析

class LoginGUI extends JFrame implements ActionListener{
    
    
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	//定义组件
    JLabel jlabel1,jlabel2;
    //用户名
    JTextField usernameText;
    //密码
    JPasswordField passwordText;
    //按钮
    JButton loginButton,cancelButton;

    JPanel jpanel1,jpanel2,jpanel3;
    public LoginGUI(){
    
    
        //创建组件
    	jpanel1 = new JPanel();
    	jpanel2 = new JPanel();
    	jpanel3 = new JPanel();
    	jlabel1 = new JLabel("用户名");
    	jlabel2 = new JLabel("密  码");
    	
    	//控制宽度,美观
    	usernameText = new JTextField(10);
    	passwordText = new JPasswordField(10);

    	loginButton = new JButton("登录");
    	cancelButton = new JButton("取消");

    	//设置字体
    	//字号是18
    	Font font = new Font("楷体",Font.BOLD,18);
    	jlabel1.setFont(font);
    	jlabel2.setFont(font);
//    	usernameText.setFont(font);
//    	passwordText.setFont(font);
    	loginButton.setFont(font);
    	cancelButton.setFont(font);
    	
    	//设置前景色
    	Color color = new Color(0,0,255);
    	jlabel1.setForeground(color);
    	jlabel2.setForeground(color);
//    	usernameText.setForeground(color);
//    	passwordText.setForeground(color);
    	loginButton.setForeground(color);
    	cancelButton.setForeground(color);
    	
    	
    	
    
        //设置布局
        this.setLayout(new GridLayout(3,1,5,5));
        jpanel1.add(jlabel1);
        jpanel1.add(usernameText);

        jpanel2.add(jlabel2);
        jpanel2.add(passwordText);

        jpanel3.add(loginButton);
        jpanel3.add(cancelButton);

        this.add(jpanel1);
        this.add(jpanel2);
        this.add(jpanel3);
        
        
        //设置监听(绑定)
        loginButton.addActionListener(this);
        cancelButton.addActionListener(this);
        
        
        
        //设置图标
        //默认的路径在src前面!
        ImageIcon icon = new ImageIcon("./src/test08_Login/qq.png");
        this.setIconImage(icon.getImage());
        

        //设置窗口
        this.setTitle("用户登录");
        //窗口大小
        this.setSize(300,180);

        //设置窗体关闭时候,保证JVM要退出就是控制台
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //获取你的屏幕的宽和高
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        //然后设置你编写的窗口的初始位置,也就是在中间,
        this.setLocation(width / 2 - 200, height / 2 - 150);

        //显示
        this.setVisible(true);
    }
    //实现抽象方法
    //单击时候就调用这个
	@Override
	public void actionPerformed(ActionEvent e) {
    
    
		//检查啥按钮被按下
		if(e.getSource() == loginButton) {
    
    
			if(checkPassword() == true) {
    
    
				//显示弹出窗体
				JOptionPane.showMessageDialog(null, 
						"成功登录!\n用户名和密码正确","提示",1);
				
			}
			else {
    
    
				JOptionPane.showMessageDialog(null, 
						"用户名和密码错误","提示",2);
			}
		}
		else {
    
    
			if(e.getActionCommand() == "取消") {
    
    
				clearText();
			}
		}
		
	}
	public boolean checkPassword() {
    
    
		String userName = "dxxy";
		String password = "admin";
		//trim()去掉前后多余的空格
		String inputUserName = usernameText.getText().trim();
		//String inputPassword = passwordText.getText().trim();
		//密码框是错误的
		//先转化再去空格!
		String inputPassword = String.valueOf(passwordText.getPassword()).trim();
		if(userName.equals(inputUserName) && 
				password.equals(inputPassword)) {
    
    
			return true;
		}
		else {
    
    
			return false;
		}
		
	}
	//取消时候清空文本框
	public void clearText() {
    
    
		usernameText.setText("");
		passwordText.setText("");
	}
	
}

三.鼠标

3.1.MouseListener接口

1.常见鼠标事件

(1)鼠标按下

mousePressed(MouseEvent e)

(2)鼠标释放

mouseReleased(MouseEvent e)

(3)鼠标进入容器

mouseEntered(MouseEvent e)

(4)鼠标离开

mouseExited(MouseEvent e)

(5)鼠标单击

mouseClicked(MouseEvent e)

2.常见方法

(1)获取鼠标位置

getX()
getY()

(2)获取左边左键或右键

getModifiers()

(3)获取鼠标单击的次数

getClickCount()

3.监听器方法

(1)获得监听器

addMouseListener()

(2)移除监听器

removeMouseListener()

3.2.MouseMotionListener接口

1.鼠标事件

(1)鼠标拖动

mouseDragged()

(2)鼠标移动

mouseMoved()

2.监听器方法

addMouseMotionListener()

3.3.绘制图形

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;

public class DragDrawFrameDemo {
    
    

	public static void main(String[] args) {
    
    
		DragDrawFrame dragDrawFrame = new DragDrawFrame();

	}

}

class DragDrawFrame extends JFrame
	implements MouseListener,MouseMotionListener{
    
    

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	JPanel panel;
	int x1,x2,y1,y2;
	
	public DragDrawFrame() {
    
    
		panel = new JPanel();
		this.add(panel);
		
		//设置监听
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
		
		
		//设置窗口
        this.setTitle("徒手绘图");
        //窗口大小
        this.setSize(300,200);

        //设置窗体关闭时候,保证JVM要退出就是控制台
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //获取你的屏幕的宽和高
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        //然后设置你编写的窗口的初始位置,也就是在中间,
        this.setLocation(width / 2 - 200, height / 2 - 150);

        //显示
        this.setVisible(true);
	}
	
	
	
	//鼠标拖动
	public void mouseDragged(MouseEvent e) {
    
    
		//呈现二维形状,文本,图像的基础类,验证码生成等
		
		Graphics2D graphics2d = (Graphics2D)getGraphics();
		x2 = e.getX();
		y2 = e.getY();
		//绘图
		graphics2d.draw(new Line2D.Double(x1,y1,x2,y2));
		//设置下次的坐标
		x1 = x2;
		y1 = y2;
		//释放系统资源
		graphics2d.dispose();
		
	}

	//鼠标移动
	public void mouseMoved(MouseEvent e) {
    
    
		
	}

	
	@Override
	public void mouseClicked(MouseEvent e) {
    
    
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
    
    
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
    
    
		// TODO Auto-generated method stub
		
	}

	//鼠标按下
	@Override
	public void mousePressed(MouseEvent e) {
    
    
		//获取第一个点的坐标
		x1 = e.getX();
		y1 = e.getY();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
    
    
		// TODO Auto-generated method stub
		
	}
	
}

四.键盘

4.1.常见方法

1.按下

keyPressed(KeyEvent e)

2.释放

ketReleased(KeyEvent e)

3.敲完

keyTyped(KeyEvent e)

4.2.监听器

addKeyListener()

4.3.常见方法

1.获取键盘输入的整形数据

getKeyCode()

2.获取键盘输入的字符

getKeyChar()

4.4.按下释放

1.效果

2.代码分析

import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;


public class KeyDemo {
    
    

	public static void main(String[] args) {
    
    
		KeyGUI keyGUI = new KeyGUI();

	}

}

class KeyGUI extends JFrame implements KeyListener{
    
    
	JPanel panel;
	JLabel label;
	public KeyGUI(){
    
    
		label = new JLabel();
		this.add(label);
		
		//设置标签为居中
		label.setHorizontalAlignment(SwingConstants.CENTER);
		//设置字体
		label.setFont(new Font("Serif",Font.ITALIC,25));
		//设置前景色
		label.setForeground(Color.RED);
		
		//添加绑定
		this.addKeyListener(this);
		
		//设置窗口
        this.setTitle("按键");
        //窗口大小
        this.setSize(300,200);

        //设置窗体关闭时候,保证JVM要退出就是控制台
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //获取你的屏幕的宽和高
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        //然后设置你编写的窗口的初始位置,也就是在中间,
        this.setLocation(width / 2 - 200, height / 2 - 150);

        //显示
        this.setVisible(true);
	}
	//按下
	public void keyPressed(KeyEvent e) {
    
    
		label.setText("键盘字符为" + e.getKeyChar() + "\nkey down");
	}
	//释放
	public void keyReleased(KeyEvent e) {
    
    
		label.setText("键盘字符为" + e.getKeyChar() + "\nkey up");
	}
	public void keyTyped(KeyEvent e) {
    
    

	}
	
}

五.其他两种方法

5.1.监听器适配器类

1.要求

2.分析

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class MouseAdapterDemo {
    
    

	public static void main(String[] args) {
    
    
		MouseAdapterGUI mouseAdapterGUI = new MouseAdapterGUI();
	}

}

class MouseAdapterGUI extends MouseAdapter {
    
    
	JFrame jFrame;
	public  MouseAdapterGUI() {
    
    
		jFrame = new JFrame();
		
		
		//设置窗口
		jFrame.setTitle("单击");
        //窗口大小
		jFrame.setSize(300,200);

        //设置窗体关闭时候,保证JVM要退出就是控制台
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //获取你的屏幕的宽和高
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        //然后设置你编写的窗口的初始位置,也就是在中间,
        jFrame.setLocation(width / 2 - 200, height / 2 - 150);

        //添加绑定
      	jFrame.addMouseListener(this);
        //显示
        jFrame.setVisible(true);
	}
	public void mouseClicked(MouseEvent e) {
    
    
		jFrame.setTitle("点击坐标为"+e.getX() +","+ e.getY());
	}
}

5.2.匿名内部类

class MouseAdapterGUI2 extends JFrame {
    
    
	JFrame jFrame;
	public  MouseAdapterGUI2() {
    
    
		jFrame = new JFrame();
		
		//添加绑定
      	jFrame.addMouseListener(new MouseAdapter() {
    
    
      		public void mouseClicked(MouseEvent e) {
    
    
      			jFrame.setTitle("点击坐标为" + e.getX()+","+e.getY());
      		}
      		
      	});
      	
        //窗口大小
		jFrame.setSize(300,200);

        //设置窗体关闭时候,保证JVM要退出就是控制台
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //获取你的屏幕的宽和高
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        //然后设置你编写的窗口的初始位置,也就是在中间,
        jFrame.setLocation(width / 2 - 200, height / 2 - 150);
        //显示
        jFrame.setVisible(true);
	}
}

六.用户界面类与问题域类

6.1.问题域类

1.类图

2.加上标准方法

3.代码分析

Operation.java

public class Operation {
    
    
	private double num1;
	private double num2;
	public double getResult() {
    
    
		return 0;
	}
	public double getNum1() {
    
    
		return num1;
	}
	public void setNum1(double num1) {
    
    
		this.num1 = num1;
	}
	public double getNum2() {
    
    
		return num2;
	}
	public void setNum2(double num2) {
    
    
		this.num2 = num2;
	}
	
}

//加法类
class OperationAdd extends Operation{
    
    
	public double getResult() {
    
    
		return getNum1() + getNum2() ;
	}
}

//减法类
class OperationSub extends Operation{
    
    
	public double getResult() {
    
    
		return getNum1() - getNum2() ;
	}
}
//乘法类
class OperationMul extends Operation{
    
    
	public double getResult() {
    
    
		return getNum1() * getNum2() ;
	}
}
//除法类
class OperationDiv extends Operation{
    
    
	public double getResult() {
    
    
		return getNum1() / getNum2() ;
	}
}

//圆的面积
class OperationCircle extends Operation{
    
    
	public double getResult() {
    
    
		return getNum1() * getNum1() * Math.PI ;
	}
}

OperationFactory.java

public class OperationFactory {
    
    
	public static Operation createOperate(String operate) {
    
    
		Operation op = null;
		switch(operate) {
    
    
		//charAt取第一个字符
			case "+":{
    
    
				op = new OperationAdd();
				break;
			}
			case "-":{
    
    
				op = new OperationSub();
				break;
			}
			case "*":{
    
    
				op = new OperationMul();
				break;
			}
			case "/":{
    
    
				op = new OperationDiv();
				break;
			}
			case "圆的面积":{
    
    
				op = new OperationCircle();
				break;
			}
			default : break;	
		}
		return op;
	}
}

6.2.用户界面类

6.3.事件处理类

猜你喜欢

转载自blog.csdn.net/weixin_44179485/article/details/113528986