JAVA坐标系中,x表示水平方向,距离坐标原点x个像素;y表示垂直方向,距离坐标原点y个像素。
需要类继承JFrame或JPanel类来画窗口。
public class TankClient extends JFrame{...}
setTitle(String s) //设置窗口标题
setLocation(int x,int y) //设置窗口位置
setSize(int width,int height) //设置窗口宽和高
setVisible(true) //设置窗口可见,默认为false
1、paint(Graphics g)绘制组件的外观。
2、repaint()刷新组件的外观。
3、update()更新容器,清楚画图区并调用paint方法
当组件第一次再屏幕显示的时候,程序自动调用paint()方法绘制组件。
1、窗口最小化再最大化
2、窗口的大小发生变化
3、repaint方法被调用
import java.awt.*;
import javax.swing.JFrame;
public class paint extends JFrame{
public static void main(String[] args) {
paint tc = new paint();
tc.lauchFrame();
}
private void lauchFrame() {
setLocation(300, 50);
setSize(500,500);
setVisible(true);
setTitle("tankwar");
}
public void paint(Graphics g){
super.paint(g);
}
}
此类可以理解为画笔,提供了各种绘图方法:
//在点(x1,y1)到(x2,y2)之间画线段
//x表示矩形左边缘的位置,y表示矩形上边缘的位置,width表示矩形的宽,height表示矩形的高
//x表示椭圆左边缘的位置,y表示矩形上边缘的位置,width表示矩形的宽,height表示矩形的高
//用预先指定的颜色填充矩形
//用预先指定的颜色填充椭圆
//绘制指定图像中已缩放到适合指定矩形内部的图像
img:要绘制的指定图像
wdith:矩形的宽度
height:矩形的高度
observer:当转换了更多图像时要通知的对象
用预先设置好的颜色和字体来绘制文本str,文本左下角的坐标为(x,y)
//Font f = new Font(String name,int type,int size) 三个参数分别为字体名称如:“宋体”、字体样式如:Font.PLAINT、字体大小。
//将文字、边框或要填充的区域为指定颜色
public class Draw01 extends JFrame{//设置框架
//定义一个画板
private MyPanel01 mp = null;
public static void main(String[] args) {
//创建对象实例
new Draw01();
}
//构造器
public Draw01(){
//初始化画板
mp = new MyPanel01();
//把面板放入画框里
this.add(mp);
//设置画框带下
this.setSize(800,600);
//设置显示
this.setVisible(true);
//设置点击 × 就退出程序(画框)
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//定义MyPanel01类,继承JPanel;画板
class MyPanel01 extends JPanel{
@Override
public void paint(Graphics g) {
super.paint(g);
//画的内容;不同的类型
//1.圆或椭圆
g.drawOval(50,50,150,150);
//2.直线
g.drawLine(50,50,100,100);
//3.矩形边框
g.drawRect(50,50,100,100);
//4.填充矩形
//设置画笔颜色
g.setColor(Color.pink);
g.fillRect(10,10,40,40);
//5.填充椭圆
g.setColor(Color.ORANGE);
g.fillOval(120,120 ,50,40);
//6.填充图片
Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/qq.png"));
g.drawImage(image,200,0,300,200,this);
//7.画字符串
//设置画笔颜色
g.setColor(Color.red);
//设置字体和姿态以及大小
g.setFont(new Font("宋体",Font.BOLD,25));
//画字符串
g.drawString("Letting go",300,300);
}
}
为了消除作图的闪烁(卡顿、低帧率),使用双缓冲。
在内存虚拟空间中先把图形绘制好,然后一次性把图形调入。
使用示例:
import javax.swing.JFrame;
import java.awt.*;
public class TankClient extends JFrame{
Image offScreenImage = null;//虚拟空间,双缓冲技术,解决卡顿问题
public void update(Graphics g){//虚拟空间,先存放,再一次性调入
super.update(g);
if(offScreenImage == null)
offScreenImage = createImage(GAME_WIDTH,GAME_HEIGHT);//新建区域
Graphics gOffScreen = offScreenImage.getGraphics();//从虚拟区域获取画笔gOFFScreen
Color c = gOffScreen.getColor();//提取背景色
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
gOffScreen.setColor(c);//恢复原色
paint(gOffScreen);
g.drawImage(offScreenImage,0,0,null);//画笔从off虚拟区域的0,0点开始画
}
}
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
等价于frame.setDefaultCloseOptration(JFrame.EXIT_ON_CLOSE);
表示在窗口添加一个Windows事件消息,关闭窗口时可以正常退出。
后面文章会使用绘图写一个坦克大战练习,有兴趣的可以看看。