Java笔记5(java绘图原理、事件处理机制、监听器、坦克大战)

java绘图原理Demo9_1.java 

/*

* 功能:java绘图原理

*/



package com.test1;

import java.awt.*;

import javax.swing.*;



public class Demo9_1 extends JFrame{



/**

* @param args

*/

public static void main(String[] args) {

Demo9_1 demo9_1=new Demo9_1();



}



public Demo9_1()

{

MyPanel1 mp=new MyPanel1();



this.add(mp);

this.setSize(400,500);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}



}



//定义一个MyPanel(自定义的面板,用于绘图和现实绘图的区域)

class MyPanel1 extends JPanel

{

//覆盖JPanel的paint方法

public void paint(Graphics g) //Graphics是绘图的重要类,画笔类

{//paint(Graphic g)绘制组件的外观,repaint()刷新组件的外观

//1.调用父类函数完成初始化

//这句话,不能少

super.paint(g);

System.out.println("paint被调用");

//以下情况paint()会被调用

//1.窗口最小化,再最大化。

//2.窗口的大小发生变化

//3.repaint函数被调用



//先画出一个圆

g.drawOval(10, 10, 30, 30);



//画出直线

g.drawLine(80, 10, 40, 40);



//画出矩形边框

g.drawRect(10, 50, 40, 60);



//设置颜色

g.setColor(Color.blue);

//填充矩形

g.fillRect(10,50,40,60);



g.setColor(Color.red);

g.fillRect(70,70,40,40);//填充矩形

g.fillOval(70, 10, 60, 40);//填充椭圆



//在面板上画出图片,记住这种在面板上画图像的方法

Image im=Toolkit.getDefaultToolkit().getImage

(Panel.class.getResource("/刘亦菲2.jpg"));

//实现

g.drawImage(im, 140, 10, 200, 300, this);



//画出文字

g.setColor(Color.red);//设置颜色

g.setFont(new Font("微软简行楷",Font.BOLD,30));//设置字体

g.drawString("祖国万岁", 5, 150);//画文字



//画孤形

g.drawArc(10, 180, 120, 300, 50, 100);

}

}



坦克大战v1.0_Demo9_2

/*

* 功能:坦克大战v1.0

* 1.画出坦克

*/



package com.test2;

import java.awt.*;

import javax.swing.*;



public class MyTankGame1 extends JFrame{



MyPanel mp=null;

public MyTankGame1()

{

mp=new MyPanel();



this.add(mp);

this.setSize(400,300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}



public static void main(String[] args) {

MyTankGame1 mtg=new MyTankGame1();

}



}



//我的面板

class MyPanel extends JPanel

{

//定义一个我的坦克

Hero hero=null;



//构造函数

public MyPanel()

{

hero=new Hero(10,10);

}



//重写paint函数

public void paint(Graphics g)

{

super.paint(g); //这句不能少

g.fillRect(0,0,400,300);//设置游戏面板背景

this.drawTank(hero.getX(), hero.getY(), g, 0, 1);

}



//画出坦克的函数

public void drawTank(int x,int y,Graphics g,int direct,int type)

{

//判断坦克的类型

switch(type)

{

case 0:

g.setColor(Color.cyan);

break;

case 1:

g.setColor(Color.yellow);

break;

}



//判断方向

switch(direct)

{

case 0: //向上

//画出我的坦克(到时封装成一个函数)

//1.画出左边的矩形

g.fill3DRect(x, y, 5, 30,false);

//2.画出右边的矩形

g.fill3DRect(x+15, y, 5, 30,false);



//3.画出中间矩形

g.fill3DRect(x+5, y+5, 10, 20,false);



//4.画出中间的圆形

g.fillOval(x+5, y+10, 10, 10);



//5.画出线

g.drawLine(x+10, y+15, x+10, y);



//画齿轮

g.setColor(Color.darkGray);

g.drawLine(x+1, y+2, x+4, y+2);

g.drawLine(x+1, y+5, x+4, y+5);

g.drawLine(x+1, y+8, x+4, y+8);

g.drawLine(x+1, y+11, x+4, y+11);

g.drawLine(x+1, y+14, x+4, y+14);

g.drawLine(x+1, y+17, x+4, y+17);

g.drawLine(x+1, y+20, x+4, y+20);

g.drawLine(x+1, y+23, x+4, y+23);

g.drawLine(x+1, y+27, x+4, y+27);



g.drawLine(x+16, y+2, x+19, y+2);

g.drawLine(x+16, y+5, x+19, y+5);

g.drawLine(x+16, y+8, x+19, y+8);

g.drawLine(x+16, y+11, x+19, y+11);

g.drawLine(x+16, y+14, x+19, y+14);

g.drawLine(x+16, y+17, x+19, y+17);

g.drawLine(x+16, y+20, x+19, y+20);

g.drawLine(x+16, y+23, x+19, y+23);

g.drawLine(x+16, y+27, x+19, y+27);

break;

}

}

}





//坦克类

class Tank

{

//表示坦克的横坐标

int x=0;

//坦克纵坐标

int y=0;



public int getX() {

return x;

}



public void setX(int x) {

this.x = x;

}



public int getY() {

return y;

}



public void setY(int y) {

this.y = y;

}



public Tank(int x,int y)

{

this.x=x;

this.y=y;

}



}



//我的坦克

class Hero extends Tank

{

public Hero(int x,int y)

{

super(x,y);//用父类的构造函数初始化子类的成员变量

}

}



java事件处理机制_Demo9_3.java

/*

* 功能:java事件处理机制

*

*/



/*

* 1.一个类要实现监听的步骤

* a.实现相应的接口[KeyListener,MouseListener,ActionListener,WindowListener,]

* b.把接口的处理方法根据需要重新编写(override)

* c.在事件源注册监听

* d.事件传递是靠事件对象

*/

package com.test3;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;



public class Demo9_3 extends JFrame implements ActionListener //让窗体对象实现对事件的监听

{



//定义一个panel

JPanel mp=null;

JButton jb1=null;

JButton jb2=null;



public static void main(String[] args) {

Demo9_3 demo9_3=new Demo9_3();

}



public Demo9_3()

{

//初始化一个面板和两个按钮

mp=new JPanel();

jb1=new JButton("黑色");

jb2=new JButton("红色");



Cat myCat1=new Cat();



//注册监听

jb1.addActionListener(this);//让窗体对象监听

jb1.addActionListener(myCat1);//让猫对象监听

//指定action命令

jb1.setActionCommand("blackbtn");



jb2.addActionListener(this);//添加事件监听,让窗体对象监听

jb2.addActionListener(myCat1);//让猫对象监听

jb2.setActionCommand("redbtn");



this.add(jb1,BorderLayout.NORTH);//将按钮jb1添加到窗体北边

mp.setBackground(Color.black);//设置面板颜色

this.add(mp);

this.add(jb2,BorderLayout.SOUTH);//将按钮jb2添加到窗体南边



this.setSize(200,150); //设置窗体大小

this.setLocation(400,300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);



}



//对事件处理的方法

@Override

public void actionPerformed(ActionEvent e) {

System.out.println("OK");



//判断是哪个按钮被点击

if(e.getActionCommand().equals("blackbtn"))

{

System.out.println("你点击黑色按钮了!");

mp.setBackground(Color.BLACK);

}

else if(e.getActionCommand().equals("redbtn"))

{

System.out.println("你点击红色按钮了!");

mp.setBackground(Color.RED);

}

else

{

System.out.println("不知道!");

}

}

}



//任何一个类,只要他实现了相应的接口,就可以去临界听某个事件源

class Cat implements ActionListener //让猫也现实对事件的监听

{

@Override

public void actionPerformed(ActionEvent e) {

if(e.getActionCommand().equals("blackbtn"))

{

System.out.println("猫监听到你按下了黑色按钮!");

}

else if(e.getActionCommand().equals("redbtn"))

{

System.out.println("猫监听到你按下了红色按钮!");

}

else

{

System.out.println("猫没有监听到按钮消息!");

}

}

}



Demo9_4.java

/*

* 功能:加深对事件处理机制的理解

* 1.通过上下左右键,来控制一个小球的位置

*/



package com.test4;

import java.awt.*;

import java.awt.event.*;



import javax.swing.*;



import java.awt.event.KeyListener;



public class Demo9_4 extends JFrame{



/**

* @param args

*/

public static void main(String[] args) {

Demo9_4 demo9_4=new Demo9_4();



}



//构造函数

public Demo9_4()

{

MyPanel mp=new MyPanel();



//mp加入到JFrame

this.add(mp);



//实现监听

this.addKeyListener(mp);



this.setSize(400,300);

this.setLocation(300,200);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

}



//定义自己的面板

class MyPanel extends JPanel implements KeyListener

{

int x=10;

int y=10;

public void paint(Graphics g)

{

super.paint(g);

g.fillOval(x, y, 20, 20);

}



@Override

public void keyPressed(KeyEvent e) //某一个键被压下

{

//System.out.println("键被按下!"+(char)e.getKeyCode());

if(e.getKeyCode()==KeyEvent.VK_DOWN)

{

if(y<248)

y+=2;

else

return;

}

else if(e.getKeyCode()==KeyEvent.VK_UP)

{

if(y>0)

y-=2;

else

return;

}

else if(e.getKeyCode()==KeyEvent.VK_LEFT)

{

if(x>0)

x-=2;

else

return;

}

else if(e.getKeyCode()==KeyEvent.VK_RIGHT)

{

if(x<368)

x+=2;

else

return ;

}

else

return;

//调用repaint(),重绘窗口

this.repaint();

}



@Override

public void keyReleased(KeyEvent e) //某一个键被释放

{

System.out.println("键被释放!");



}



@Override

public void keyTyped(KeyEvent e) //键的值被输出

{

System.out.println("被按下的键是:"+(char)e.getKeyChar());



}

}



监听器Demo9_5.java

/*

* 功能:让一个监听器监听多个不同的事件

*/



package com.test5;

import java.awt.*;

import java.awt.event.*;



import javax.swing.*;



public class Demo9_5 extends JFrame{



MyPanel mp=null;

public static void main(String[] args) {

Demo9_5 demo9_5=new Demo9_5();



}

//构造函数

public Demo9_5()

{

mp=new MyPanel();

this.add(mp);



//注册监听

this.addMouseListener(mp);

this.addKeyListener(mp);

this.addMouseMotionListener(mp);

this.addWindowListener(mp);



this.setSize(400,300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

}



//1.让MyPanel知道鼠标按下的消息,并且知道点击的位置(x,y)

//2.让MyPanel知道哪个键按下

//3.让MyPanel知道鼠标移动、拖拽

//4.让MyPanel知道窗口的变化(关闭,最小化,最大化)



class MyPanel extends JPanel implements

MouseListener,KeyListener,MouseMotionListener,WindowListener

{

public void paint(Graphics g)

{

super.paint(g);

}



@Override

public void mouseClicked(MouseEvent e) //鼠标点击

{

System.out.println("鼠标点击了 x="+e.getX()+" y="+e.getY());



}



@Override

public void mouseEntered(MouseEvent e) //鼠标移入

{

System.out.println("鼠标来了");



}



@Override

public void mouseExited(MouseEvent e) //鼠标离开MyPanel

{

System.out.println("鼠标走了");



}



@Override

public void mousePressed(MouseEvent e) //鼠标按下

{

// TODO Auto-generated method stub



}



@Override

public void mouseReleased(MouseEvent e) //鼠标释放

{

// TODO Auto-generated method stub



}



@Override

public void keyPressed(KeyEvent e) //键按下

{

// TODO Auto-generated method stub



}



@Override

public void keyReleased(KeyEvent e) //键松开

{

System.out.println("按下的键是:"+e.getKeyChar());



}



@Override

public void keyTyped(KeyEvent e) //打印键的值

{

// TODO Auto-generated method stub



}



@Override

public void mouseDragged(MouseEvent e) //鼠标拖拽

{

// TODO Auto-generated method stub



}



@Override

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

{

System.out.println("鼠标当前坐标是:x="+e.getX()+"y="+e.getY());



}



@Override

public void windowActivated(WindowEvent e) //窗口变为活动窗口

{

System.out.println("windowActivated");



}



@Override

public void windowClosed(WindowEvent e) //窗口关闭了

{

System.out.println("windowClosed");



}



@Override

public void windowClosing(WindowEvent e) //窗口正在关闭

{

System.out.println("windowClosing");



}



@Override

public void windowDeactivated(WindowEvent e) //窗口变为非活动窗口

{

System.out.println("windowDeactivated");



}



@Override

public void windowDeiconified(WindowEvent e) //窗口变到最大图标区域

{

System.out.println("windowDeiconified");



}



@Override

public void windowIconified(WindowEvent e) //窗口变到最小图标区域

{

System.out.println("windowIconified");



}



@Override

public void windowOpened(WindowEvent e) //窗口打开了

{

System.out.println("windowOpened");



}



}



坦克大战v2.0_ MyTankGame2.java

/*

* 功能:坦克大战v2.0

* 1.画出坦克

* 2.我的坦克可以上下左右移动

*/



package com.test6;

import java.awt.*;

import javax.swing.*;



import java.awt.event.*;

import java.util.*;



public class MyTankGame2 extends JFrame{



MyPanel mp=null;



//构造函数

public MyTankGame2()

{

mp=new MyPanel();

this.add(mp);



//注册监听

this.addKeyListener(mp);



this.setSize(400,300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}



public static void main(String[] args) {

MyTankGame2 mtg=new MyTankGame2();

}



}



//我的面板

class MyPanel extends JPanel implements KeyListener

{

//定义一个我的坦克

Hero hero=null;



//定义敌人的坦克组

Vector<EnemyTank>ets=new Vector<EnemyTank>();



int enSize=3;



//构造函数

public MyPanel()

{

hero=new Hero(100,200);



//初始化敌人的坦克

for(int i=0;i<enSize;i++)

{

//创建一个辆敌人的坦克对象

EnemyTank et=new EnemyTank((i+1)*50,0);

et.setColor(0);//设置颜色

et.setDirect(2);

//加入

ets.add(et);



}

}



//重写paint函数

public void paint(Graphics g)

{

super.paint(g); //这句不能少

g.fillRect(0,0,400,300);//设置游戏面板背景



//画出自己的坦克

this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);



//画出敌人的坦克

for(int i=0;i<ets.size();i++)

{

this.drawTank(ets.get(i).getX(), ets.get(i).getY(), g, ets.get(i).getDirect(), 0);

}

}



//画出坦克的函数(扩展)

public void drawTank(int x,int y,Graphics g,int direct,int type)

{

//判断坦克的类型

switch(type)

{

case 0:

g.setColor(Color.cyan);

break;

case 1:

g.setColor(Color.yellow);

break;

}



//判断方向

switch(direct)

{

case 0: //向右

//画出上面的矩形

g.fill3DRect(x, y, 30, 5, false);

//画出下面的矩形

g.fill3DRect(x, y+15, 30, 5, false);

//画出中间的矩形

g.fill3DRect(x+5, y+5, 20, 10, false);

//画出圆形

g.fillOval(x+10, y+5, 10, 10);

//画出线

g.drawLine(x+15, y+10, x+30, y+10);

//画齿轮

g.setColor(Color.darkGray);

g.drawLine(x+2, y+1, x+2, y+4);

g.drawLine(x+5, y+1, x+5, y+4);

g.drawLine(x+8, y+1, x+8, y+4);

g.drawLine(x+11, y+1, x+11, y+4);

g.drawLine(x+14, y+1, x+14, y+4);

g.drawLine(x+17, y+1, x+17, y+4);

g.drawLine(x+20, y+1, x+20, y+4);

g.drawLine(x+23, y+1, x+23, y+4);

g.drawLine(x+26, y+1, x+26, y+4);



g.drawLine(x+2, y+16, x+2, y+19);

g.drawLine(x+5, y+16, x+5, y+19);

g.drawLine(x+8, y+16, x+8, y+19);

g.drawLine(x+11, y+16, x+11, y+19);

g.drawLine(x+14, y+16, x+14, y+19);

g.drawLine(x+17, y+16, x+17, y+19);

g.drawLine(x+20, y+16, x+20, y+19);

g.drawLine(x+23, y+16, x+23, y+19);

g.drawLine(x+26, y+16, x+27, y+19);

break;

case 1: //向左

//画出上面的矩形

g.fill3DRect(x, y, 30, 5, false);

//画出下面的矩形

g.fill3DRect(x, y+15, 30, 5, false);

//画出中间的矩形

g.fill3DRect(x+5, y+5, 20, 10, false);

//画出圆形

g.fillOval(x+10, y+5, 10, 10);

//画出线

g.drawLine(x+15, y+10, x, y+10);

//画齿轮

g.setColor(Color.darkGray);

g.drawLine(x+2, y+1, x+2, y+4);

g.drawLine(x+5, y+1, x+5, y+4);

g.drawLine(x+8, y+1, x+8, y+4);

g.drawLine(x+11, y+1, x+11, y+4);

g.drawLine(x+14, y+1, x+14, y+4);

g.drawLine(x+17, y+1, x+17, y+4);

g.drawLine(x+20, y+1, x+20, y+4);

g.drawLine(x+23, y+1, x+23, y+4);

g.drawLine(x+26, y+1, x+26, y+4);



g.drawLine(x+2, y+16, x+2, y+19);

g.drawLine(x+5, y+16, x+5, y+19);

g.drawLine(x+8, y+16, x+8, y+19);

g.drawLine(x+11, y+16, x+11, y+19);

g.drawLine(x+14, y+16, x+14, y+19);

g.drawLine(x+17, y+16, x+17, y+19);

g.drawLine(x+20, y+16, x+20, y+19);

g.drawLine(x+23, y+16, x+23, y+19);

g.drawLine(x+26, y+16, x+27, y+19);

break;

case 2: //向下

//画出我的坦克(到时封装成一个函数)

//1.画出左边的矩形

g.fill3DRect(x, y, 5, 30,false);

//2.画出右边的矩形

g.fill3DRect(x+15, y, 5, 30,false);

//3.画出中间矩形

g.fill3DRect(x+5, y+5, 10, 20,false);

//4.画出中间的圆形

g.fillOval(x+5, y+10, 10, 10);

//5.画出线

g.drawLine(x+10, y+15, x+10, y+30);



//画齿轮

g.setColor(Color.darkGray);

g.drawLine(x+1, y+2, x+4, y+2);

g.drawLine(x+1, y+5, x+4, y+5);

g.drawLine(x+1, y+8, x+4, y+8);

g.drawLine(x+1, y+11, x+4, y+11);

g.drawLine(x+1, y+14, x+4, y+14);

g.drawLine(x+1, y+17, x+4, y+17);

g.drawLine(x+1, y+20, x+4, y+20);

g.drawLine(x+1, y+23, x+4, y+23);

g.drawLine(x+1, y+27, x+4, y+27);



g.drawLine(x+16, y+2, x+19, y+2);

g.drawLine(x+16, y+5, x+19, y+5);

g.drawLine(x+16, y+8, x+19, y+8);

g.drawLine(x+16, y+11, x+19, y+11);

g.drawLine(x+16, y+14, x+19, y+14);

g.drawLine(x+16, y+17, x+19, y+17);

g.drawLine(x+16, y+20, x+19, y+20);

g.drawLine(x+16, y+23, x+19, y+23);

g.drawLine(x+16, y+27, x+19, y+27);

break;

case 3: //向上

//画出我的坦克(到时封装成一个函数)

//1.画出左边的矩形

g.fill3DRect(x, y, 5, 30,false);

//2.画出右边的矩形

g.fill3DRect(x+15, y, 5, 30,false);

//3.画出中间矩形

g.fill3DRect(x+5, y+5, 10, 20,false);

//4.画出中间的圆形

g.fillOval(x+5, y+10, 10, 10);

//5.画出线

g.drawLine(x+10, y+15, x+10, y);



//画齿轮

g.setColor(Color.darkGray);

g.drawLine(x+1, y+2, x+4, y+2);

g.drawLine(x+1, y+5, x+4, y+5);

g.drawLine(x+1, y+8, x+4, y+8);

g.drawLine(x+1, y+11, x+4, y+11);

g.drawLine(x+1, y+14, x+4, y+14);

g.drawLine(x+1, y+17, x+4, y+17);

g.drawLine(x+1, y+20, x+4, y+20);

g.drawLine(x+1, y+23, x+4, y+23);

g.drawLine(x+1, y+27, x+4, y+27);



g.drawLine(x+16, y+2, x+19, y+2);

g.drawLine(x+16, y+5, x+19, y+5);

g.drawLine(x+16, y+8, x+19, y+8);

g.drawLine(x+16, y+11, x+19, y+11);

g.drawLine(x+16, y+14, x+19, y+14);

g.drawLine(x+16, y+17, x+19, y+17);

g.drawLine(x+16, y+20, x+19, y+20);

g.drawLine(x+16, y+23, x+19, y+23);

g.drawLine(x+16, y+27, x+19, y+27);

break;

}

}



@Override

public void keyPressed(KeyEvent e) //键按下处理

{

//a表示向左,s表示向上,w表示向上,d表示向右

if(e.getKeyCode()==KeyEvent.VK_D)

{

this.hero.setDirect(0);//设置我的坦克的方向,向右

this.hero.moveRight();

}

else if(e.getKeyCode()==KeyEvent.VK_A)

{

this.hero.setDirect(1);//向左

this.hero.moveLeft();

}

else if(e.getKeyCode()==KeyEvent.VK_S)

{

this.hero.setDirect(2);//向下

this.hero.moveDown();

}

else if(e.getKeyCode()==KeyEvent.VK_W)

{

this.hero.setDirect(3);//向上

this.hero.moveUp();

}

//重绘Panel

this.repaint();

}



@Override

public void keyReleased(KeyEvent e)

{



}



@Override

public void keyTyped(KeyEvent e)

{



}

}

坦克大战v2.0_ Members.java

package com.test6;



//坦克类

class Tank

{

//表示坦克的横坐标

int x=0;

//坦克纵坐标

int y=0;

//坦克方向

int direct=0;//0表示右,1表示左,2表示下,3表示上

//坦克的速度

int speed=1;

//坦克的颜色

int color;



public int getColor() {

return color;

}



public void setColor(int color) {

this.color = color;

}



public int getSpeed() {

return speed;

}



public void setSpeed(int speed) {

this.speed = speed;

}



public int getDirect() {

return direct;

}



public void setDirect(int direct) {

this.direct = direct;

}



public int getX() {

return x;

}



public void setX(int x) {

this.x = x;

}



public int getY() {

return y;

}



public void setY(int y) {

this.y = y;

}



public Tank(int x,int y)

{

this.x=x;

this.y=y;

}



}



//敌人的坦克

class EnemyTank extends Tank

{

public EnemyTank(int x,int y)

{

super(x,y);

}

}



//我的坦克

class Hero extends Tank

{



public Hero(int x,int y)

{

super(x,y);//用父类的构造函数初始化子类的成员变量

}



//坦克向上移动

public void moveUp()

{

y-=speed;

}

//坦克向右移动

public void moveRight()

{

x+=speed;

}

//坦克向下移动

public void moveDown()

{

y+=speed;

}

//坦克向左移动

public void moveLeft()

{

x-=speed;

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值