【JavaSE】绘图与事件入门学习笔记
-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);//窗口大小发生变化自动调用paintSystem.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;@Overridepublic void paint(Graphics g) {//要调用父类的绘制方法,这样在repaint的时候才能重新绘制图像,而不是堆叠图像super.paint(g);g.setColor(Color.red);g.fillOval(x, y, 100, 100);}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {char keyChar=e.getKeyChar();if(keyChar=='s'){y+=2;this.repaint();}}@Overridepublic 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包中定义列出常用的事件监听器接口
-