-Java绘图坐标体系
-
坐标体系-介绍
坐标原点位于左上角,以像素为单位。
在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。
-
坐标体系-像素
- 绘图还必须要搞清一个非常重要的概念-像素 一个像素等于多少厘米?
- 计算机在屏幕上显示的内容都是由屏幕上的每 一个像素组成的。例如,计算机显示器的分辨率是800x600,表示计算机屏幕上的每一行由800个点组成,共有600行整个计算机屏幕共有480 000个像素。像素是一个密度单位,而厘米是长度单位,两者无法比较
-Java绘图技术
-
介绍-快速入门
在应用界面画一个圆
package com.xijie.draw; import javax.swing.*; import java.awt.*; public class DrawCircle extends JFrame { public static void main(String[] args) { DrawCircle drawCircle = new DrawCircle(); } public DrawCircle() { //初始化面板 JPanel panel = new MyPanel(); //将画板添加到框架 this.add(panel); //设置应用程序标题 this.setTitle("画一个圆吧!"); //设置窗口大小 this.setSize(800,600); //显示框架 this.setVisible(true); //设置关闭窗口时退出程序 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MyPanel extends JPanel { //在绘制面板时自动调用 public void paint(Graphics g) { //父类初始化画笔 super.paint(g); //获取2D画图对象 Graphics2D g2d = (Graphics2D) g; //setcolor设置当前颜色 g2d.setColor(Color.red); //填充一个圆形区域 g2d.fillOval(50, 50, 100, 100); g2d.setColor(Color.green); //画一个圆形 g2d.drawOval(150, 150, 100, 100); g2d.setColor(Color.blue); g2d.drawOval(250, 250, 100, 100); //窗口大小发生变化自动调用paint System.out.println("paint方法被调用了"); } }
-
绘图原理
-
Component类提供了两个和绘图相关最重要的方法:
- paint(Graphics g)绘制组件的外观
- repaint()刷新组件的外观。
-
当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件
在以下情况paint()将会被调用:
- 窗口最小化,再最大化
- 窗口的大小发生变化
- repaint函数被调用
-
-
Graphics类
Graphics类你可以理解就是画笔,为我们提供了各种绘制图形的方法:[参考jdk帮助文档]
- 画直线 drawLine(int x1,int y1,int x2,int y)
- 画矩形边框 drawRect(int x, int y, int width, int height)
- 画椭圆边框 drawOval(int x, int y, int width, int height)
- 填充矩形 fillRect(int x, int y, int width, int height)
- 填充椭圆 fillOval(int x, int y, int width, int height)
- 画图片 drawlmage(lmage img, int x, int y, …)
- 画字符串 drawString(String str, int x, int y)
- 设置画笔的字体 setFont(Font font)
- 设置画笔的颜色 setColor(Color c)
演示代码:
package com.xijie.draw; import javax.swing.*; import java.awt.*; public class GraphicFunctions extends JFrame { public static void main(String[] args) { new GraphicFunctions(); } public GraphicFunctions() { this.add(new MyPanel1()); this.setSize(800, 600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } class MyPanel1 extends JPanel { public void paint(Graphics g) { super.paint(g); g.setColor(Color.red); //1. 画直线 drawLine(int x1,int y1,int x2,int y) g.drawLine(10, 10, 50, 10); //2. 画矩形边框 drawRect(int x, int y, int width, int height) g.drawRect(60, 10, 20, 20); //3. 画椭圆边框 drawOval(int x, int y, int width, int height) g.drawOval(100,10,30,20); //4. 填充矩形 fillRect(int x, int y, int width, int height) g.fillRect(150,10,40,30); //5. 填充椭圆 fillOval(int x, int y, int width, int height) g.fillOval(200,10,35,30); //6. 画图片 drawlmage(lmage img, int x, int y, ..) Image image=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/image/down.jpeg")); g.drawImage(image,250,10,70,40,this); //7. 画字符串 drawString(String str, int x, int y) //8. 设置画笔的字体 setFont(Font font) //9. 设置画笔的颜色 setColor(Color c) g.setColor(Color.blue); g.setFont(new Font("幼圆",Font.ITALIC,20)); g.drawString("java牛逼",10,100); } }
-事件处理机制
-
小球按键移动案例,按s向下移动小球
package com.xijie.draw; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class BallMoving extends JFrame { public static void main(String[] args) { new BallMoving(); } BallMoving() { MainPanel mainPanel = new MainPanel(); this.add(mainPanel); this.addKeyListener(mainPanel); this.setTitle("小球移动测试"); this.setSize(800, 600); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } class MainPanel extends JPanel implements KeyListener { int x = 0, y = 0; @Override public void paint(Graphics g) { //要调用父类的绘制方法,这样在repaint的时候才能重新绘制图像,而不是堆叠图像 super.paint(g); g.setColor(Color.red); g.fillOval(x, y, 100, 100); } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { char keyChar=e.getKeyChar(); if(keyChar=='s'){ y+=2; this.repaint(); } } @Override public void keyReleased(KeyEvent e) { } }
-
基本说明
java事件处理是采取“委派事件模型”。当事件发生时,产生事件的对象,会把此"信息"传递给“事件的监听者"处理,这里所说的"信息"实际上就是 java.awt.event 事件类库里某个类所创建的对象,把它称为"事件的对象”。
-
机制分析
- 用户操作引起事件源;
- 事件源被发送到事件监听者(事件处理方法);
- 事件处理方法处理事件
-
事件处理机制深入理解
-
前面我们提到几个重要的概念 事件源,事件,事件监听器我们下面来全面的介绍它们。
-
事件源:事件源是一个产生事件的对象,比如按钮,窗口等。
-
事件:事件就是承载事件源状态改变时的对象,比如当键盘事件、鼠标事件、窗口事件等等,:会生成一个事件对象,该对象保存着当前事件很多信息,比如KeyEvent 对象有含义被按下键的Code值。java.awt.event包 和javax.swing.event包中定义了各种事件类型
-
事件类型(查阅JDK文档)
事件类 说明 ActionEvent 通常在按下按钮,或双击一个列表项或选中某个菜单时发生 AdjustmentEvent 当操作一个滚动条时发生 ComponentEvent 当一个组件隐藏,移动,改变大小时发生 ContainerEvent 当一个组件从容器中加入或者删除时发生 FocusEvent 当一个组件获得或失去焦点时发生 ItemEvent 当一个复选框或列表项被选中时,当一个选择框或选择菜单被选中 KeyEvent 当键盘按键被按下或松开时发生 MousesEvent 当鼠标被拖动,移动,点击,按下 TextEvent 当文本区和文本域的文本发生改变时发生 WindowEvent 当一个窗口激活,关闭,失效,恢复,最小化 -
事件监听器接口
- 当事件源产生一个事件,可以传送给事件监听者处理
- 事件监听者实际上就是一个类,该类实现了某个事件监听器接口。比如前面我们案例中的MyPanle就是一个类,它实现了KeyListener接口,它就可以作为一个事件监听者,对接受到的事件进行处理
- 事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现多个监听接口
- 这些接口在java.awt.event包和javax.swing.event包中定义列出常用的事件监听器接口
-