14. 画图
14.1 坐标系
坐标原点位于左上角,以像素为单位。在jaca坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。
14.2 画图实例
画一个圆形
package com.draw;
import javax.swing.*;
import java.awt.*;
/**
* @author Rain
*/
public class DrawCircle extends JFrame{//JFrame对应一个窗口
//定义一个面板
private MyPanel mp = null;
public static void main(String[] args) {
new DrawCircle();
}
public DrawCircle(){
//初始化面板
mp = new MyPanel();
//把面板放入窗口(画框)
this.add(mp);
//设置窗口大小
this.setSize(400,300);
// 关闭窗口就结束程x
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//弹出窗口
this.setVisible(true);
// 监听窗口关闭事件
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.out.println("关闭窗口了");
System.exit(0);
}
});
}
}
//1.先定义一个MyPanel(画板),继承JPanel类
class MyPanel extends JPanel{
//1.
@Override
public void paint(Graphics g) {//绘图方法
super.paint(g);//调用父类的方法完成初始化
System.out.println("paint调用");
//画一个圆
g.drawOval(10,10,100,100);
}
}
14.3 绘图原理
Component类提供了两个和绘图相关最重要的方法
- paint(Graphics g)绘制组件的外观
- repaint()刷新组件的外观
当组件第一次在屏幕显示的时候,程序会自动调用paint()方法绘制组件。
paint()被调用情况:
- 组件第一次屏幕显示
- 窗口最小化,再最大化
- 窗口大小发生变化
- repaint方法被调用
14.4 Graphics(画笔)常用方法
Graphics类可以理解为画笔,提供了各种绘制图形的方法
- 画直线:drawLine(int x1, int y1, int x2, int y2)
// 画直线 点1坐标,点2坐标
g.drawLine(10,10,100,100);
- 画矩形边框:drawRect(int x, int y, int width, int height)
// 画矩形 图片左上角坐标x,y;矩形宽高w,h
g.drawOval(10,10,300,300);
- 画椭圆边框:drawOval(int x, int y, int width, int height)
// 画椭圆 图片左上角坐标x,y;椭圆宽高w,h
g.drawOval(10,10,300,300);
- 填充矩形:fillRect(int x, int y, int width, int height)
// 填充矩形 左上角坐标,矩形宽高
g.fillRect(10,10,100,100);
- 填充椭圆:fillOval(int x, int y, int width, int height)
// 填充椭圆 图片左上角坐标x,y;椭圆宽高w,h
g.fillOval(10,10,300,300);
- 画图片:drawImage(Image img, int x, int y, int width, int height)
// 读取out文件夹下,项目根目录中的图片
Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/image1.png"));
// 画图片 (图片,左上角横坐标,左上角纵坐标,宽,高,this)
g.drawImage(image,60,60,100,100,this);
- 画字符串:drawString(String str, int x, int y)
// 画字符串 字符串, 左下角坐标
g.drawString("你好,世界", 100,100);
- 设置画笔字体:setFont(Font font)
// 设置字体:字体,加粗,字号
g.setFont(new Font("隶书", Font.BOLD, 50));
- 设置画笔颜色:setColor(Color c)
// 设置画笔颜色
g.setColor(Color.red);
14.5 事件处理机制
java事件处理是采用"委派事件模型"。当事件发生时,产生事件的对象,会把此"信息"传递给"事件的监听者"处理,这里所说的"信息"实际上就是java.awt.event事件类库里某个类所创建的对象,把他称为"事件的对象"。
实现KeyListener接口类可以作为事件监听器,把事件监听器放入窗口对象可以监听事件发生,在对应的方法中实现功能
举例:
打印键盘按下的键,如果如果按下的是Q,打印”输入正确“
import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
// 窗口类,继承JFrame类
public class Event_ extends JFrame {
TestEvent testEvent;
public Event_(){
// 创建事件监听器
testEvent = new TestEvent();
// 把事件监听器放入窗口
this.addKeyListener(testEvent);
// 设置窗口大小
this.setSize(500, 500);
// 关闭窗口就结束程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 弹出窗口
this.setVisible(true);
}
public static void main(String[] args) {
new Event_();
}
}
// 事件监听器类,实现KeyListener接口
// 需要实现下面三个方法
class TestEvent implements KeyListener{
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) { // 键盘按下
// 打印按下的键
System.out.println((char) e.getKeyCode());
// 如果按下的是Q,打印”输入正确“
if (e.getKeyCode() == KeyEvent.VK_Q){
System.out.println("输入正确");
}
}
@Override
public void keyReleased(KeyEvent e) { // 键盘松开
}
}