代码链接:https://download.csdn.net/download/qq_52354698/86402022?spm=1001.2014.3001.5501

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

利用java绘制一个圆

package com.qdu.draw;
import javax.swing.*;
import java.awt.*;
/**
* @author dell
* @version 1.0
*/
public class DrawCircle extends JFrame {
private MyPanel myPanel = null;
public static void main(String[] args) {
new DrawCircle();
}
public DrawCircle() {
myPanel = new MyPanel();
this.add(myPanel);
this.setSize(400, 300);
this.setVisible(true);
}
}
class MyPanel extends JPanel {
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawOval(10, 10, 100, 100);
}
}
Component 类提供了两个和绘图相关的重要的方法
当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件
在以下情况paint()将会被再次调用
画直线:g.drawLine(10, 10, 100, 100);

画矩形边框:g.drawRect(10, 10, 100, 100);

画椭圆边框:g.drawOval(10, 10, 100, 100)

填充矩形:g.setColor(Color.blue); g.fillRect(10, 10, 100, 100);

填充椭圆:g.setColor(Color.red); g.fillOval(10, 10, 100, 100);

画图片:Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/在人间负债^.jpg")); g.drawImage(image, 10, 10, 1080, 1080, this);


7. 画字符串:g.setColor(Color.red); g.setFont(new Font("隶书", Font.BOLD, 50)); g.drawString("北京你好",100,100);


package com.qdu.tankgame;
import javax.swing.*;
import java.awt.*;
/**
* @author dell
* @version 1.0
*/
public class MyPanel extends JPanel {
Hero hero = null;
public MyPanel() {
hero = new Hero(100, 100);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 1000, 750);
drawTank(hero.getX(), hero.getY(), g, 0, 0);
}
/**
* @param x 坦克左上角x坐标
* @param y 坦克左上角y坐标
* @param g 画笔
* @param direct 坦克方向(上下左右)
* @param type 坦克类型(自己、敌人)
*/
public void drawTank(int x, int y, Graphics g, int direct, int type) {
switch (type) {
case 0:
g.setColor(Color.cyan);
break;
case 1:
g.setColor(Color.yellow);
break;
}
switch (direct) {
case 0:
//坦克左边的轮子
g.fill3DRect(x, y, 10, 60, false);
//坦克右边的轮子
g.fill3DRect(x + 30, y, 10, 60, false);
//坦克中间的矩形
g.fill3DRect(x + 10, y + 10, 20, 40, false);
//坦克中间的圆形
g.fillOval(x + 10, y + 20, 20, 20);
//坦克的炮筒
g.drawLine(x + 20, y + 30, x + 20, y);
break;
case 1:
System.out.println("尚未处理");
}
}
}

实现键盘监听事件,来控制小球的移动
package com.qdu.event_;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.XMLFormatter;
/**
* @author dell
* @version 1.0
*/
public class BallMove extends JFrame {
MyPanel myPanel = null;
public static void main(String[] args) {
BallMove ballMove = new BallMove();
}
public BallMove() {
myPanel = new MyPanel();
this.add(myPanel);
this.setSize(400, 300);
this.addKeyListener(myPanel);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class MyPanel extends JPanel implements KeyListener {
private int x = 10;
private 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) {
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
y++;
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
y--;
} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
x--;
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
x++;
}
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
}

java 事件处理是采用“委派事件模型”。当事件发生时,产生事件的对象,会把此“信息”传递给“事件的监听者”处理,这里所说的“信息”实际上就是java.awt.event事件类库里某个类所创阿金的对象,把它称为“事件的对象”。



package com.qdu.tankgame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/**
* @author dell
* @version 1.0
*/
public class MyPanel extends JPanel implements KeyListener {
Hero hero = null;
public MyPanel() {
hero = new Hero(100, 100);
hero.setSpeed(3);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 1000, 750);
drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 0);
}
/**
* @param x 坦克左上角x坐标
* @param y 坦克左上角y坐标
* @param g 画笔
* @param direct 坦克方向(上下左右)
* @param type 坦克类型(自己、敌人)
*/
public void drawTank(int x, int y, Graphics g, int direct, int type) {
//根据坦克的类型,绘制不同的颜色
switch (type) {
case 0:
g.setColor(Color.cyan);
break;
case 1:
g.setColor(Color.yellow);
break;
}
//根据坦克方向,来绘制不同的方向的坦克
//0:向上,1:向右,2:向下,3:向左
switch (direct) {
case 0:
//坦克左边的轮子
g.fill3DRect(x, y, 10, 60, false);
//坦克右边的轮子
g.fill3DRect(x + 30, y, 10, 60, false);
//坦克中间的矩形
g.fill3DRect(x + 10, y + 10, 20, 40, false);
//坦克中间的圆形
g.fillOval(x + 10, y + 20, 20, 20);
//坦克的炮筒
g.drawLine(x + 20, y + 30, x + 20, y);
break;
case 1:
//坦克左边的轮子
g.fill3DRect(x, y, 60, 10, false);
//坦克右边的轮子
g.fill3DRect(x, y + 30, 60, 10, false);
//坦克中间的矩形
g.fill3DRect(x + 10, y + 10, 40, 20, false);
//坦克中间的圆形
g.fillOval(x + 20, y + 10, 20, 20);
//坦克的炮筒
g.drawLine(x + 30, y + 20, x + 60, y + 20);
break;
case 2:
//坦克左边的轮子
g.fill3DRect(x, y, 10, 60, false);
//坦克右边的轮子
g.fill3DRect(x + 30, y, 10, 60, false);
//坦克中间的矩形
g.fill3DRect(x + 10, y + 10, 20, 40, false);
//坦克中间的圆形
g.fillOval(x + 10, y + 20, 20, 20);
//坦克的炮筒
g.drawLine(x + 20, y + 30, x + 20, y + 60);
break;
case 3:
//坦克左边的轮子
g.fill3DRect(x, y, 60, 10, false);
//坦克右边的轮子
g.fill3DRect(x, y + 30, 60, 10, false);
//坦克中间的矩形
g.fill3DRect(x + 10, y + 10, 40, 20, false);
//坦克中间的圆形
g.fillOval(x + 20, y + 10, 20, 20);
//坦克的炮筒
g.drawLine(x + 30, y + 20, x, y + 20);
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
}
//处理wdsa键按下的事件
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W){
hero.setDirect(0);
hero.moveUp();
} else if (e.getKeyCode() == KeyEvent.VK_D) {
hero.setDirect(1);
hero.moveRight();
}else if (e.getKeyCode() == KeyEvent.VK_S){
hero.setDirect(2);
hero.moveDown();
} else if (e.getKeyCode() == KeyEvent.VK_A) {
hero.setDirect(3);
hero.moveLeft();
}
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
}

package com.qdu.tankgame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
/**
* @author dell
* @version 1.0
*/
public class MyPanel extends JPanel implements KeyListener {
Hero hero = null;
Vector<EnemyTank> enemyTanks = new Vector<>();//使用vector保证后续的线程安全
int enemyTankSize = 3;
public MyPanel() {
hero = new Hero(100, 100);
hero.setSpeed(3);
for (int i = 0; i < enemyTankSize; i++) {
//创建敌人坦克
EnemyTank enemyTank = new EnemyTank(100 * (i + 1), 0);
//设置敌人坦克方向
enemyTank.setDirect(2);
//加入坦克
enemyTanks.add(enemyTank);
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 1000, 750);
//画出自己的坦克
drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 0);
//画出敌人的坦克
for (int i = 0; i < enemyTanks.size(); i++) {
EnemyTank enemyTank = enemyTanks.get(i);
drawTank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 1);
}
}
/**
* @param x 坦克左上角x坐标
* @param y 坦克左上角y坐标
* @param g 画笔
* @param direct 坦克方向(上下左右)
* @param type 坦克类型(自己、敌人)
*/
public void drawTank(int x, int y, Graphics g, int direct, int type) {
//根据坦克的类型,绘制不同的颜色
switch (type) {
case 0:
g.setColor(Color.cyan);
break;
case 1:
g.setColor(Color.yellow);
break;
}
//根据坦克方向,来绘制不同的方向的坦克
//0:向上,1:向右,2:向下,3:向左
switch (direct) {
case 0:
//坦克左边的轮子
g.fill3DRect(x, y, 10, 60, false);
//坦克右边的轮子
g.fill3DRect(x + 30, y, 10, 60, false);
//坦克中间的矩形
g.fill3DRect(x + 10, y + 10, 20, 40, false);
//坦克中间的圆形
g.fillOval(x + 10, y + 20, 20, 20);
//坦克的炮筒
g.drawLine(x + 20, y + 30, x + 20, y);
break;
case 1:
//坦克左边的轮子
g.fill3DRect(x, y, 60, 10, false);
//坦克右边的轮子
g.fill3DRect(x, y + 30, 60, 10, false);
//坦克中间的矩形
g.fill3DRect(x + 10, y + 10, 40, 20, false);
//坦克中间的圆形
g.fillOval(x + 20, y + 10, 20, 20);
//坦克的炮筒
g.drawLine(x + 30, y + 20, x + 60, y + 20);
break;
case 2:
//坦克左边的轮子
g.fill3DRect(x, y, 10, 60, false);
//坦克右边的轮子
g.fill3DRect(x + 30, y, 10, 60, false);
//坦克中间的矩形
g.fill3DRect(x + 10, y + 10, 20, 40, false);
//坦克中间的圆形
g.fillOval(x + 10, y + 20, 20, 20);
//坦克的炮筒
g.drawLine(x + 20, y + 30, x + 20, y + 60);
break;
case 3:
//坦克左边的轮子
g.fill3DRect(x, y, 60, 10, false);
//坦克右边的轮子
g.fill3DRect(x, y + 30, 60, 10, false);
//坦克中间的矩形
g.fill3DRect(x + 10, y + 10, 40, 20, false);
//坦克中间的圆形
g.fillOval(x + 20, y + 10, 20, 20);
//坦克的炮筒
g.drawLine(x + 30, y + 20, x, y + 20);
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
}
//处理wdsa键按下的事件
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_W) {
hero.setDirect(0);
hero.moveUp();
} else if (e.getKeyCode() == KeyEvent.VK_D) {
hero.setDirect(1);
hero.moveRight();
} else if (e.getKeyCode() == KeyEvent.VK_S) {
hero.setDirect(2);
hero.moveDown();
} else if (e.getKeyCode() == KeyEvent.VK_A) {
hero.setDirect(3);
hero.moveLeft();
}
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
}
