1. 键盘控制

  1. /**
  2. * @author 韩顺平
  3. * @version 1.0
  4. * 演示小球通过键盘控制上下左右的移动-> 讲解Java的事件控制
  5. */
  6. public class BallMove extends JFrame { //窗口
  7. MyPanel mp = null;
  8. public static void main(String[] args) {
  9. BallMove ballMove = new BallMove();
  10. }
  11. //构造器
  12. public BallMove() {
  13. mp = new MyPanel();
  14. this.add(mp);
  15. this.setSize(400, 300);
  16. //窗口JFrame 对象可以监听键盘事件, 即可以监听到面板发生的键盘事件
  17. this.addKeyListener(mp);
  18. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  19. this.setVisible(true);
  20. }
  21. }
  22. //面板, 可以画出小球
  23. //KeyListener 是监听器, 可以监听键盘事件
  24. class MyPanel extends JPanel implements KeyListener {
  25. //为了让小球可以移动, 把他的左上角的坐标(x,y)设置变量
  26. int x = 10;
  27. int y = 10;
  28. @Override
  29. public void paint(Graphics g) {
  30. super.paint(g);
  31. g.fillOval(x, y, 20, 20); //默认黑色
  32. }
  33. //有字符输出时,该方法就会触发
  34. @Override
  35. public void keyTyped(KeyEvent e) {
  36. }
  37. //当某个键按下,该方法会触发
  38. @Override
  39. public void keyPressed(KeyEvent e) {
  40. //System.out.println((char)e.getKeyCode() + "被按下..");
  41. //根据用户按下的不同键,来处理小球的移动 (上下左右的键)
  42. //在java中,会给每一个键,分配一个值(int)
  43. if(e.getKeyCode() == KeyEvent.VK_DOWN) {//KeyEvent.VK_DOWN就是向下的箭头对应的code
  44. y+=2;
  45. } else if(e.getKeyCode() == KeyEvent.VK_UP) {
  46. y-=2;
  47. } else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
  48. x-=2;
  49. } else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
  50. x+=2;
  51. }
  52. //让面板重绘
  53. this.repaint();
  54. }
  55. //当某个键释放(松开),该方法会触发
  56. @Override
  57. public void keyReleased(KeyEvent e) {
  58. }
  59. }

2. 事件处理机制

  1. 前面我们提到几个重要的概念事件源,事件,事件监听器我们下面来全面的介绍它们

  2. 事件源:事件源是一个产生事件的对象,比如按钮,窗口等

  3. 事件:事件就是承载事件源状态改变时的对象,比如当键盘事件、鼠标事件、窗口事件
    等等,会生成一个事件对象,该对象保存着当前事件很多信息,比如 KeyEvent对象有
    含有被按下键的code值。 java. awt event包和 avax swingevent包中定义了各种事
    件类型

  4. 事件类型
    第16章 坦克大战 - 图1

  5. 事件监听器接口

    1. 当事件源产生一个事件,可以传送给事件监听者处理
    2. 事件监听者实际上就是一个类,该类实现了某个事件监听器接口比如前面我们案例中的 My Panel就是一个类,它实现了KeyListener接口,它就可以作为一个事件监听者,对接受到的事件
      进行处理
    3. 事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件一个类可以实现多个监听接口
    4. 这些接口在 java. awt. even包和 javax. swing event包中定义.列出常用的事件监听器接口查看jdk文档聚集了

第16章 坦克大战 - 图2

3. Graphics 类

Graphics类你可以理解就是画笔为我们提供了各种绘制图形的方法:[参考jdk帮助文档]

  1. 画直线 drawLine(intx1inty1,intx2inty2)
  2. 画矩形边框 draw Rect(int x, int y, int width, int height)
  3. 画椭圆边框 drawOval(int x, int y, int width, int height)
  4. 填充矩形 fillRect(int x, int y, int width, int height)
  5. 填充椭圆 fillOval(int x, int y, int width, int height)
  6. 画图片 drawlmage(Image img, int x, int y)
  7. 画字符串 drawString(String str, intx, inty)
  8. 设置画笔的字体 setFont(Font font)
  9. 设置画笔的颜色 setcolor(Color c)

4. java 绘图技术

坐标体系-介绍

  1. 下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中第一个是x坐标表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。

坐标体系-像素

  1. 绘图还必须要搞清一个非常重要的概念-像素一个像素等于多少厘米
  2. 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示
    器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行
    整个计算机屏幕共有480000个像素。像素是一个密度单位而厘米是长度单位
    者无法比较

介绍-快速入门

  1. public class DrawCircle extends JFrame { //JFrame对应窗口,可以理解成是一个画框
  2. //定义一个面板
  3. private MyPanel mp = null;
  4. public static void main(String[] args) {
  5. new DrawCircle();
  6. System.out.println("退出程序~");
  7. }
  8. public DrawCircle() {//构造器
  9. //初始化面板
  10. mp = new MyPanel();
  11. //把面板放入到窗口(画框)
  12. this.add(mp);
  13. //设置窗口的大小
  14. this.setSize(400, 300);
  15. //当点击窗口的小×,程序完全退出.
  16. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  17. this.setVisible(true);//可以显示
  18. }
  19. }
  20. //1.先定义一个MyPanel, 继承JPanel类, 画图形,就在面板上画
  21. class MyPanel extends JPanel {
  22. //说明:
  23. //1. MyPanel 对象就是一个画板
  24. //2. Graphics g 把 g 理解成一支画笔
  25. //3. Graphics 提供了很多绘图的方法
  26. //Graphics g
  27. @Override
  28. public void paint(Graphics g) {//绘图方法
  29. super.paint(g);//调用父类的方法完成初始化.
  30. System.out.println("paint 方法被调用了~");
  31. //画出一个圆形.
  32. //g.drawOval(10, 10, 100, 100);
  33. //演示绘制不同的图形..
  34. //画直线 drawLine(int x1,int y1,int x2,int y2)
  35. //g.drawLine(10, 10, 100, 100);
  36. //画矩形边框 drawRect(int x, int y, int width, int height)
  37. //g.drawRect(10, 10, 100, 100);
  38. //画椭圆边框 drawOval(int x, int y, int width, int height)
  39. //填充矩形 fillRect(int x, int y, int width, int height)
  40. //设置画笔的颜色
  41. // g.setColor(Color.blue);
  42. // g.fillRect(10, 10, 100, 100);
  43. //填充椭圆 fillOval(int x, int y, int width, int height)
  44. // g.setColor(Color.red);
  45. // g.fillOval(10, 10, 100, 100);
  46. //画图片 drawImage(Image img, int x, int y, ..)
  47. //1. 获取图片资源, /bg.png 表示在该项目的根目录去获取 bg.png 图片资源
  48. // Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
  49. // g.drawImage(image, 10, 10, 175, 221, this);
  50. //画字符串 drawString(String str, int x, int y)//写字
  51. //给画笔设置颜色和字体
  52. g.setColor(Color.red);
  53. g.setFont(new Font("隶书", Font.BOLD, 50));
  54. //这里设置的 100, 100, 是 "北京你好"左下角
  55. g.drawString("北京你好", 100, 100);
  56. //设置画笔的字体 setFont(Font font)
  57. //设置画笔的颜色 setColor(Color c)
  58. }
  59. }

绘图原理

Component类提供了两个和绘图相关最重要的方法:

  1. paint(Graphics g)绘制组件的外观
  2. repaint() 刷新组件的外观。

当组件第一次在屏幕显示的时候程序会自动的调用 paint方法来绘制组件
在以下情况 paint()将会被调用:

  1. 窗口最小化再最大化
  2. 窗口的大小发生变化
  3. repaint 方法被调用