画出弧形:
g.drawArc:
前两个参数:代表中心点,后面代表宽,高,后面是弧度的大小;
![1167156-20181130180129547-1964603200.png](https://i-blog.csdnimg.cn/blog_migrate/ec817e42197e8558b358b6c632243f97.png)
50代表弧度,后面方向;
![1167156-20181130180132634-1069228985.png](https://i-blog.csdnimg.cn/blog_migrate/79be58a524adfc5db17f18f1b10112f6.png)
![1167156-20181130180134586-1613958967.png](https://i-blog.csdnimg.cn/blog_migrate/a5d1c65d39b33a3bab7646ff33b746f9.png)
SWING编程三个部分:
(1)组件和布局管理器;
(2)绘图技术;
(3)事件处理机制;
![1167156-20181130180143794-1807126344.png](https://i-blog.csdnimg.cn/blog_migrate/5e16fa42c3efaa5bbf13bf723fe63465.png)
鼠标,键盘按下的某个按钮或者移动等都是事件;
JAVA认为,消息是一种事件对象;事件监听者也是一个类;
事件监听者中有函数或者方法专门去处理事件;
![1167156-20181130180147377-215884036.png](https://i-blog.csdnimg.cn/blog_migrate/87a1595c2edafff70ebc3e2675265c92.png)
import java.awt.Event.*;
需要对事件
进行处理,把Event包带进去;
![1167156-20181130180147746-582100377.png](https://i-blog.csdnimg.cn/blog_migrate/03aa1514f400fedf669b9fc478bccf30.png)
Border布局
中间是 默认的;
![1167156-20181130180147953-2039286911.png](https://i-blog.csdnimg.cn/blog_migrate/7746f2f1c9b140781942c6f3b245dbe6.png)
点击按钮做相应的 反映:
事件源:jb1/jb2
事件监听者:Demo9_3这个类监听
![1167156-20181130180148184-436533139.png](https://i-blog.csdnimg.cn/blog_migrate/a1282095d08c253fef741cb03a59f0a1.png)
事件处理方法:actionPerformed(ActionEvent e)
如何监听?注册监听:
事件源在前提供一个方法,addActionListener
在事件源的身上添加一个监听方法
![1167156-20181130180148413-49380674.png](https://i-blog.csdnimg.cn/blog_migrate/97e0c1a13301b584a38ba029a03b7dd5.png)
![1167156-20181130180148935-165161191.png](https://i-blog.csdnimg.cn/blog_migrate/9b86d6e1fb72bd1c07b564ac069b04d8.png)
![1167156-20181130180149220-837658640.png](https://i-blog.csdnimg.cn/blog_migrate/04c6208040ed7b4230ca387f11572106.png)
//区分事件的处理方法
setActionCommand("黑色");
如果jb1被点击了,“黑色”的值会被传出去
ActionEvent e 事件对象
![1167156-20181130180149505-583625446.png](https://i-blog.csdnimg.cn/blog_migrate/66e042f7c24b6367ffb54819d55ec3e3.png)
![1167156-20181130180149836-543295899.png](https://i-blog.csdnimg.cn/blog_migrate/bcf17165e84cf8aab54a26a2ed98f286.png)
如何拿到颜色值呢?
![1167156-20181130180150107-1288504230.png](https://i-blog.csdnimg.cn/blog_migrate/b6346d1c6b805464a8fab622ada3cd63.png)
一旦一个类在这个事件上监听了,
这个事件就会自动传递给他;
![1167156-20181130180150434-635997656.png](https://i-blog.csdnimg.cn/blog_migrate/b05e33cec9348c7e949406e4370d9b40.png)
这个动作也可以被多个事件监听者进行监听;
可以被Cat监听:
![1167156-20181130180150793-779349842.png](https://i-blog.csdnimg.cn/blog_migrate/9ed4d2ae683f805bf2e6c9486bfbc885.png)
![1167156-20181130180151186-1642607212.png](https://i-blog.csdnimg.cn/blog_migrate/6487461de8baf0f6cea048ae19f8222d.png)
![1167156-20181130180151448-1763842634.png](https://i-blog.csdnimg.cn/blog_migrate/fa8d9a6dd0a69c92a10d5cee9c142dbf.png)
一个普通的类也可以被监听;
一个事件源被多个类监听;
![1167156-20181130180151809-2012193260.png](https://i-blog.csdnimg.cn/blog_migrate/902e188868aec2a7bf5094521df96cfb.png)
![1167156-20181130180152106-1977757306.png](https://i-blog.csdnimg.cn/blog_migrate/6a721ac61829ad0aebe7fcf4892c7968.png)
this的具体实例:demo9_3,构造函数的实例;
![1167156-20181130180152304-1490696074.png](https://i-blog.csdnimg.cn/blog_migrate/457c0d971ce1abff9ee677fb9e2b081a.png)
demo9_3是事件监听者;
![1167156-20181130180152543-980986791.png](https://i-blog.csdnimg.cn/blog_migrate/d9cd4d2046d839ff97eaa75c2d137169.png)
事件处理方法:
actionPerformed
![1167156-20181130180152796-421270240.png](https://i-blog.csdnimg.cn/blog_migrate/e59448b902787dba1189728676bfd671.png)
事件对象:
ActionEvent arg0
![1167156-20181130180153705-1682312426.png](https://i-blog.csdnimg.cn/blog_migrate/0c1bf7e17c7848227034f3506151d7a6.png)
![1167156-20181130180154553-600596133.png](https://i-blog.csdnimg.cn/blog_migrate/fec2e56a22471d311634a026bd47c3e6.png)
![1167156-20181130180154822-1448221036.png](https://i-blog.csdnimg.cn/blog_migrate/65e3b35ddfd724530d862fc937ff1aba.png)
通过键盘进行事件监听:
![1167156-20181130180155569-35536961.png](https://i-blog.csdnimg.cn/blog_migrate/69f8d0d8721e15cd7cff228da222eff0.png)
需要实现接口implements,这样mp才有监听的能力;
![1167156-20181130180155868-1002827776.png](https://i-blog.csdnimg.cn/blog_migrate/db107e89c513037fc75d38fbf567f28f.png)
给MyPanel添加方法;双击会出现三个函数:
KeyPressed -键被按下
KeyReleased-键被释放
KeyTyped-键的值被输出
![1167156-20181130180156162-145514418.png](https://i-blog.csdnimg.cn/blog_migrate/49a1c99a0a1850229ab2bdc07d26f26b.png)
![1167156-20181130180156577-1741104408.png](https://i-blog.csdnimg.cn/blog_migrate/e3e63d066360344e5265847eaf32c00c.png)
(char)e.getKeyCode( );
![1167156-20181130180156787-832304838.png](https://i-blog.csdnimg.cn/blog_migrate/ba35816a4b41191119030b0872383283.png)
VK_DOWNN向下的键
圆要动起来,需要重绘刷新,调用repaint()函数;
this.repaint( );
![1167156-20181130180157131-230072678.png](https://i-blog.csdnimg.cn/blog_migrate/a05866b6e96262bf3ee0c19fd82e96a4.png)
![1167156-20181130180157430-790968432.png](https://i-blog.csdnimg.cn/blog_migrate/5c621b0e6dbdc9b558217590862c3f2f.png)
上下左右了:
可以跑起来了;
变快的话,步长快速改变就行
y+=10;
---------------------------------------------------------------------
java事件处理机制
如何通过键盘或鼠标的控制使Java程序中的功能有响应?
java事件处理机制--初步介绍
java事件处理是采取“委派事件模型”。所谓“委派事件模型”是指当事件发生时,产生事件的对象(即事件源),会把此“信息”传递给“事件的监听者”处理的一种方式,而这里所说的“信息”实际上就是java.awt.event事件类库里某个类所创建的对象,我们暂时把它称为“事件的对象”。
![1167156-20181130180157859-1610427567.jpg](https://i-blog.csdnimg.cn/blog_migrate/cfd038b93b9ed9d91540721333ee309a.jpeg)
比如:当按下按钮时,就会在按钮触发一个“事件”,程序就会产生一个“事件对象”来表示这个事件,并把这个“事件对象”传递给“事件的监听者”,“事件的监听者”再根据“事件对象”的类型进行相应处理。
为了让“产生事件的对象”[比如按钮]知道要把事件传递给哪一个“事件监听者”,我们必需先把“事件监听者”在“产生事件的对象”注册,这个操作也就是要告知“产生事件的对象”要把事件传递给它。
![1167156-20181130180158177-1011125617.jpg](https://i-blog.csdnimg.cn/blog_migrate/3874df504f0fbba3f953f681997c1737.jpeg)
实例[Window016.java] /** * 功能:事件处理机制 */ import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Window016 extends JFrame implements ActionListener{ //定义组件 JPanel mp=null; JButton jb1,jb2; public static void main(String[] args) { Window016 win=new Window016(); } //构造函数 public Window016(){ //创建组件 mp=new JPanel(); jb1=new JButton("黑色"); jb2=new JButton("红色"); //设定布局管理器 //加入组件 mp.setBackground(Color.black); this.add(mp); this.add(jb1,BorderLayout.NORTH); this.add(jb2,BorderLayout.SOUTH); //猫类在监听 Cat mycat1=new Cat(); jb1.addActionListener(mycat1); jb2.addActionListener(mycat1); //注册监听 jb1.addActionListener(this); jb2.addActionListener(this); //指定action命令 jb1.setActionCommand("黑色"); jb2.setActionCommand("红色"); //JFrame窗体设置 this.setTitle("事件处理机制"); this.setSize(400, 300); this.setLocationRelativeTo(null); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //对事件处理的方法 public void actionPerformed(ActionEvent e) { //判断是哪个按钮被点击 if(e.getActionCommand().equals("黑色")){ System.out.println("点击了黑色按钮"); mp.setBackground(Color.BLACK); }else if(e.getActionCommand().equals("红色")){ System.out.println("点击了红色按钮"); mp.setBackground(Color.RED); }else{ System.out.println("不知道"); } } } class Cat implements ActionListener{ public void actionPerformed(ActionEvent arg0) { if(arg0.getActionCommand().equals("黑色")){ System.out.println("Cat也知道你按下了黑色按钮"); }else if(arg0.getActionCommand().equals("红色")){ System.out.println("Cat也知道你按下了红色按钮"); }else { System.out.println("Cat也不知道"); } } }
x
1
实例[Window016.java]
2
/**
3
* 功能:事件处理机制
4
*/
5
import java.awt.*;
6
import javax.swing.*;
7
import java.awt.event.*;
8
public class Window016 extends JFrame implements ActionListener{
9
//定义组件
10
JPanel mp=null;
11
JButton jb1,jb2;
12
public static void main(String[] args) {
13
Window016 win=new Window016();
14
}
15
//构造函数
16
public Window016(){
17
//创建组件
18
mp=new JPanel();
19
jb1=new JButton("黑色");
20
jb2=new JButton("红色");
21
//设定布局管理器
22
23
//加入组件
24
mp.setBackground(Color.black);
25
this.add(mp);
26
this.add(jb1,BorderLayout.NORTH);
27
this.add(jb2,BorderLayout.SOUTH);
28
29
//猫类在监听
30
Cat mycat1=new Cat();
31
jb1.addActionListener(mycat1);
32
jb2.addActionListener(mycat1);
33
//注册监听
34
jb1.addActionListener(this);
35
jb2.addActionListener(this);
36
37
//指定action命令
38
jb1.setActionCommand("黑色");
39
jb2.setActionCommand("红色");
40
41
//JFrame窗体设置
42
this.setTitle("事件处理机制");
43
this.setSize(400, 300);
44
this.setLocationRelativeTo(null);
45
this.setVisible(true);
46
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
47
}
48
49
//对事件处理的方法
50
public void actionPerformed(ActionEvent e) {
51
//判断是哪个按钮被点击
52
if(e.getActionCommand().equals("黑色")){
53
System.out.println("点击了黑色按钮");
54
mp.setBackground(Color.BLACK);
55
}else if(e.getActionCommand().equals("红色")){
56
System.out.println("点击了红色按钮");
57
mp.setBackground(Color.RED);
58
}else{
59
System.out.println("不知道");
60
}
61
}
62
}
63
64
class Cat implements ActionListener{
65
public void actionPerformed(ActionEvent arg0) {
66
if(arg0.getActionCommand().equals("黑色")){
67
System.out.println("Cat也知道你按下了黑色按钮");
68
}else if(arg0.getActionCommand().equals("红色")){
69
System.out.println("Cat也知道你按下了红色按钮");
70
}else {
71
System.out.println("Cat也不知道");
72
}
73
}
74
}
------------------------------------------------------------------------------
实例[Window017.java] /** * 功能:加深对事件处理机制的理解 * 1、通过上下左右键,来控制一个小球的移动。 */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Window017 extends JFrame { //设定组件 MyPanels mp=null; public static void main(String[] args) { Window017 win=new Window017(); } //构造函数 public Window017(){ //构建组件 mp=new MyPanels(); //监听 this.addKeyListener(mp); //加入组件 this.add(mp); //设置窗体 this.setTitle("键盘事件监听"); this.setSize(400, 300); this.setLocationRelativeTo(null); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } //定义自己的面板 class MyPanels extends JPanel implements KeyListener{ int x=10,y=10; public void paint(Graphics g){ super.paint(g); g.fillOval(x, y, 10, 10); } public void keyPressed(KeyEvent e) {//keyPressed代表键被按下 System.out.println("被按下"+((char)e.getKeyCode())); if(e.getKeyCode()==KeyEvent.VK_DOWN){ System.out.println("向下"); y++; }else if(e.getKeyCode()==KeyEvent.VK_UP){ System.out.println("向上"); y--; }else if(e.getKeyCode()==KeyEvent.VK_LEFT){ System.out.println("向左"); x--; }else if(e.getKeyCode()==KeyEvent.VK_RIGHT){ System.out.println("向右"); x++; } //调用repaint()函数,来重绘界面 this.repaint(); } public void keyReleased(KeyEvent e) {//keyReleased代表键被弹起 } public void keyTyped(KeyEvent e) {//keyTyped代表具体的值被输出 }
1
实例[Window017.java]
2
/**
3
* 功能:加深对事件处理机制的理解
4
* 1、通过上下左右键,来控制一个小球的移动。
5
*/
6
import java.awt.*;
7
import java.awt.event.*;
8
import javax.swing.*;
9
public class Window017 extends JFrame {
10
//设定组件
11
MyPanels mp=null;
12
public static void main(String[] args) {
13
Window017 win=new Window017();
14
}
15
//构造函数
16
public Window017(){
17
//构建组件
18
mp=new MyPanels();
19
20
//监听
21
this.addKeyListener(mp);
22
23
//加入组件
24
this.add(mp);
25
//设置窗体
26
this.setTitle("键盘事件监听");
27
this.setSize(400, 300);
28
this.setLocationRelativeTo(null);
29
this.setVisible(true);
30
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
31
}
32
}
33
//定义自己的面板
34
class MyPanels extends JPanel implements KeyListener{
35
int x=10,y=10;
36
public void paint(Graphics g){
37
super.paint(g);
38
g.fillOval(x, y, 10, 10);
39
}
40
41
public void keyPressed(KeyEvent e) {//keyPressed代表键被按下
42
System.out.println("被按下"+((char)e.getKeyCode()));
43
if(e.getKeyCode()==KeyEvent.VK_DOWN){
44
System.out.println("向下");
45
y++;
46
}else if(e.getKeyCode()==KeyEvent.VK_UP){
47
System.out.println("向上");
48
y--;
49
}else if(e.getKeyCode()==KeyEvent.VK_LEFT){
50
System.out.println("向左");
51
x--;
52
}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
53
System.out.println("向右");
54
x++;
55
}
56
57
//调用repaint()函数,来重绘界面
58
this.repaint();
59
}
60
61
public void keyReleased(KeyEvent e) {//keyReleased代表键被弹起
62
63
}
64
65
public void keyTyped(KeyEvent e) {//keyTyped代表具体的值被输出
66
67
}
![1167156-20181130180200593-451996934.png](https://i-blog.csdnimg.cn/blog_migrate/c6c28ca46da8ef7ec210f51270d5be56.png)