12.绘图
大约 3 分钟学习笔记Java基础
一、绘图坐标体系
注
- 坐标原点位于左上角,以像素为单位;
- 坐标原点(0,0):
- 第一个是 X 坐标,表示当前位置 水平 方向距离原点 X 个像素;
- 第二个是 Y 坐标,表示当前位置 垂直 方向距离原点 Y 个像素;
Graphics 常用方法:
画直线 | drawLine(int x1, int y1,intx2,inty2) |
---|---|
画矩形边框 | 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) |
画图片 | drawImage (Image img, int x, int y, ...) |
画字符串 | drowString (String str, int x, int y) |
设置画笔字体 | setFont (Font font) |
设置画笔颜色 | setColor (Color c) |
// 画一个圆形
// JFrame 对应窗口, 可以理解为 画框
public class DrawCircle extends JFrame{
// 定义一个面板
private MyPanel mp = null;
public static void main(String[] args) {
new DrawCircle();
}
// 构造器,定义窗口相关内容
public DrawCircle(){
// 初始化面板
mp = new MyPanel();
// 将面板放入窗口
this.add(mp);
// 设置窗口大小
this.setSize(400,400);
// 点击窗口的退出按钮后,程序结束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 可以显示
this.setVisible(true);
}
}
// 定义一个面板,继承 JPanel 类
class MyPanel extends JPanel{
// 重写绘图方法
@Override
public void paint(Graphics g) {
// 调用父类的方法,完成初始化
super.paint(g);
// 画一个圆形,x,y,width,height
g.drawOval(10, 10, 100,100);
// 画直线
g.drawLine(120,10,120,224);
// 画一个图片
// 图片需要放在 out 目录中的 项目目录下
Image img = Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("/1.png"));
// this 表示为当前画板
g.drawImage(img,130,10,224,224,this);
// 画字
g.setColor(Color.BLUE); // 设置颜色
g.setFont(new Font("隶属",Font.BOLD, 50)); // 设置字体
g.drawString("学习 Java",10,280);
}
}
注
Componest 类提供了两个和绘图相关的重要方案:
- paint(Graphics g):绘制组件外观;
- 当组件第一次显示时,程序会自动调用该方法来绘制组件;
- 当窗口方法变化时,该方法也会被调用;
- repaint 方法被调用时,paint 也会被调用;
- repaint() : 刷新组件的外观;
二、事件处理机制
注
事件监听接口一般在 java.awt.event 包中; 通过 KeyListevent 来监听键盘事件,KeyEvent 提供了多种监听方法,如:code 值,char 字符,test 内容等
// 小球通过方向键移动 - 案例
public class BollMove extends JFrame{
public static void main(String[] args) {
new BollMove();
}
private MyPanel mp;
public BollMove(){
mp = new MyPanel();
this.add(mp);
// 监听对象
this.addKeyListener(mp);
this.setSize(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class MyPanel extends JPanel implements KeyListener {
int x = 10;
int y = 10;
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x,y,20,20);
}
// 有字符输出时,该方法会触发
@Override
public void keyTyped(KeyEvent e) {
}
// 当某个键按下,该方法会触发
@Override
public void keyPressed(KeyEvent e) {
// 通过 code 值监听键盘
if (e.getKeyCode() == KeyEvent.VK_RIGHT){
x++;
}else if (e.getKeyCode() == KeyEvent.VK_LEFT){
x--;
}else if (e.getKeyCode() == KeyEvent.VK_UP){
y--;
}else if (e.getKeyCode() == KeyEvent.VK_DOWN){
y++;
}
// 刷新画板
this.repaint();
}
// 当某个键松开,该方法会触发
@Override
public void keyReleased(KeyEvent e) {
}
}