【JAVA】-- 绘图技术(paint()、Graphics类、双缓冲技术、addWindowListener())

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

一、paint()方法

Component类提供了两个和绘图相关最重要的方法:

1、paint(Graphics g)绘制组件的外观。

2、repaint()刷新组件的外观。

3、update()更新容器,清楚画图区并调用paint方法

当组件第一次再屏幕显示的时候,程序自动调用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);
        }

}

二、Graphics类

此类可以理解为画笔,提供了各种绘图方法:

1、画直线 drawLine(int x1,int y1,int x2,int y2)

//在点(x1,y1)到(x2,y2)之间画线段

2、画矩形边框drawRect(int x,int y,int width,int height)

//x表示矩形左边缘的位置,y表示矩形上边缘的位置,width表示矩形的宽,height表示矩形的高

3、画椭圆边框drawOval(int x,int y,int width,int height)

//x表示椭圆左边缘的位置,y表示矩形上边缘的位置,width表示矩形的宽,height表示矩形的高

4、填充矩形 fillRect(int x,int y,int width,int height)

//用预先指定的颜色填充矩形

5、填充椭圆fillOval(int x,int y,int width,int height)

//用预先指定的颜色填充椭圆

6、画图片drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)

//绘制指定图像中已缩放到适合指定矩形内部的图像

img:要绘制的指定图像

wdith:矩形的宽度

height:矩形的高度

observer:当转换了更多图像时要通知的对象

7、画字符串drawString(String str,int x,int y)

用预先设置好的颜色和字体来绘制文本str,文本左下角的坐标为(x,y)

8、设置画笔的字体setFont(Font font) 

//Font f = new Font(String name,int type,int size)  三个参数分别为字体名称如:“宋体”、字体样式如:Font.PLAINT、字体大小。

9、设置画笔的颜色setColor(Color c) 

//将文字、边框或要填充的区域为指定颜色

使用示例:

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()

addWindowListener(new WindowAdapter() {
                    public void windowClosing(WindowEvent e){
                        System.exit(0);
                    }
                });
等价于frame.setDefaultCloseOptration(JFrame.EXIT_ON_CLOSE);

表示在窗口添加一个Windows事件消息,关闭窗口时可以正常退出。

后面文章会使用绘图写一个坦克大战练习,有兴趣的可以看看。

你可能感兴趣的:(java,java,开发语言)