javaDay06总结
1、像素:计算机在屏幕上显示的内容都是由屏幕上的每个像素组成 eg.显示器分辨率800600,表示每一行有800个点,有600行,整个屏幕共有480000个像素*
2、绘图原理:1)paint(Graphics g)绘制组件外观 2)repaint()刷新组件外观
当组件第一次在屏幕上显示的时候,程序会自动调用paint()方法来绘制组件
以下情况paint()会被调用:1)窗口最大化/最小化 2)窗口大小发生变化 3)repaint函数被调用
Graphics类:可理解为一支画笔,提供多种绘制图形的方法 eg.画直线、画矩形、画图片
package com.mys;
import java.awt.*;
import javax.swing.*;
public class Demo1 extends JFrame{
MyPanel mp=null;
public static void main(String []args){
Demo1 demo1=new Demo1();
}
//构造函数
public Demo1(){
mp=new MyPanel();
this.add(mp);
this.setSize(300,400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
//定义一个MyPanel(用于绘图和显示绘图的区域)
class MyPanel extends JPanel{
//覆盖JPanel的paint方法,Graphic绘图的重要类,可理解为一支画笔
public void paint(Graphics g){
//调用父类函数进行初始化
super.paint(g);
//填充矩形
//g.fillRect(0,0 ,300 ,400 );
//画圆
//g.drawOval(20,20,20,20);
//设置颜色
//g.setColor(Color.CYAN);
//填充矩形
//g.fill3DRect(20,20,40,60,true);
//在面板上画图片
//getDefaultToolkit获取默认工具包;getImage返回从指定文件获取像素数据的图像
Image im=Toolkit.getDefaultToolkit().getImage("src/cn/mys/qq.jpg");
g.drawImage(im,20,20,200,150,this);//this代表JPanel
//画字
//g.setFont(new Font("隶书", Font.BOLD,20 ));
//g.drawString("mys",40 ,60 );
//画弧线
//g.drawArc(40,60 ,100 ,200 ,400 ,300 );
}
}
3、Java事件处理机制
初步介绍:当事件发生时,产生事件的对象(事件源)将信息传递给事件的监听者处理的一直种方式,信息即事件的对象
一个类实现监听的步骤:1)实现相应的接口【eg.Key Listener】2)把接口处理的方法根据需要重写 3)事件源注册监听 4)事件传递靠事件对象
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Demo2 extends JFrame implements ActionListener {
//定义组件
JButton jb1,jb2;
JPanel jp;
public static void main(String []args){
Demo2 demo2=new Demo2();
}
public Demo2(){
//创建组件
jb1=new JButton("黑色");
jb2=new JButton("红色");
jp=new JPanel();
jp.setBackground(Color.BLACK);//设置背景颜色
Cat cat=new Cat();
//注册监听
jb1.addActionListener(this);//事件源对象jb1 事件监听对象this
jb1.addActionListener(cat);//事件源对象jb1 事件监听对象cat
jb2.addActionListener(this);
//指定anction命令
jb1.setActionCommand("黑色");
jb2.setActionCommand("红色");
this.add(jb1,BorderLayout.NORTH);
this.add(jb2,BorderLayout.SOUTH);
this.add(jp,BorderLayout.CENTER);
this.setSize(400,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
//对事件处理的方法 actionPerformed
@Override
public void actionPerformed(ActionEvent e) {//ActionEvent e 事件的对象
//判断是那个按钮被点击
if(e.getActionCommand().equals("黑色")){
System.out.println("黑色被按下");
jp.setBackground(Color.BLACK);//设置背景颜色为黑色
}else if(e.getActionCommand().equals("红色")){
System.out.println("红色被按下");
jp.setBackground(Color.RED);//设置背景颜色为红色
}else{
System.out.println("不知道");
}
}
}
//任何一个类,只要其实现了相应的接口,就可以去监听某个事件源
class Cat implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//判断是那个按钮被点击
if(e.getActionCommand().equals("黑色")){
System.out.println("猫猫知道黑色被按下");
}else if(e.getActionCommand().equals("红色")){
System.out.println("猫猫知道红色被按下");//为什么猫猫不知道红色被按下???
}else{
System.out.println("不知道");
}
}
}
深入理解:
1)事件源:一个产生或触发的事件对象,当这个事件源对象的某个状态发生某种变化时,就会产生某种类型的事件(一个事件源可能会生成多个不同类型的事件)
2)事件:承载事件源状态改变信息的载体,or事件源向事件监听者传输事件状态信息的载体,查阅jdk文档:常见的事件类AtionEvent、AdjustmentEvent、ComponentEvent、ContainerEvent、FocusEvent、ItemEvent、KeyEvent、MouseEvent、TextEvent、WindowEvent
3)事件监听者:一个类,实现某个事件监听器接口,作为事件监听者对接收到的事件进行处理,不同的事件监听器接口可以监听不同的事件,一个类可以实现一个事件监听器接口,也可以实现多个事件监听器接口
/*
功能:一个事件源可能会生成多个不同类型的事件,
一个类可以实现一个事件监听器接口,也可以实现多个事件监听器接口
*/
package com.mys;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Demo4 extends JFrame{
//定义组件
MyPanel2 mp2;
public static void main(String []args){
Demo4 demo4=new Demo4();
}
public Demo4(){
mp2=new MyPanel2();
this.add(mp2);
//注册监听
this.addMouseListener(mp2);
this.addKeyListener(mp2);
this.addMouseMotionListener(mp2);
this.setSize(300,400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class MyPanel2 extends JPanel implements MouseListener,KeyListener,MouseMotionListener{
public void paint(Graphics g){
super.paint(g);
g.fillOval(10,10 ,10 ,10 );
}
//鼠标点击
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击:x="+e.getX()+" y="+e.getY());
}
//鼠标按下
@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按下");
}
//释放鼠标
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("释放鼠标");
}
//鼠标移动到MyPanel
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标移动到MyPanel");
}
//鼠标离开MyPanel
@Override
public void mouseExited(MouseEvent e) {
System.out.println("鼠标离开MyPanel");
}
//键值
@Override
public void keyTyped(KeyEvent e) {
System.out.println("键值:"+e.getKeyChar());
}
//键按下
@Override
public void keyPressed(KeyEvent e) {
System.out.println("键按下:"+e.getKeyChar());
}
//键释放
@Override
public void keyReleased(KeyEvent e) {
System.out.println("键释放");
}
//鼠标拖拽
@Override
public void mouseDragged(MouseEvent e) {
System.out.println("鼠标拖拽");
}
//鼠标移动
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("鼠标移动,当前位置:x="+e.getX()+" y="+e.getY());
}
}
小结
1.Java采用委托机制处理事件
2.Java中的事件是分类的,如窗体事件、鼠标事件
3.Java一个类要监听某个事件,则必须实现相应的事件监听接口
4.事件监听接口有多种,要根据不同的情况实现不同的接口
5.实现监听接口的类中需要重写处理函数
6.在事件源中需要注册事件监听类,否则事件监听类接收不到事件源发生的事件