Java 之 Graphics 绘图

本文详细介绍了Java中Graphics类的使用方法,包括如何获取Graphics对象,以及如何利用Graphics类的各种方法进行基本图形的绘制,如直线、点、矩形、圆角矩形、3-D高亮显示矩形、圆弧、椭圆、折线图和图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Graphics 绘图

类声明:public abstract class Graphics extend Object

注:因为是从个人有道云笔记粘贴过来,图片无法显示。

有道云地址:http://note.youdao.com/noteshare?id=9a7bc83734e9c4b0f0037e21db6ecc40&sub=C358B72F17B1491C9E810B5AA31BD932

Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制。

构造函数摘要

因为 Graphics 是一个抽象类,所以应用程序不能直接调用此构造方法。图形上下文从其他图形上下文获取,或者通过在组件上调用 getGraphics() 来创建。

如何获取 Graphics 对象

注:获取 Graphics 对象方式有不少,但是能的不多。

一、重写 paint(Graphics g) 方法

public class MyPanel extends JPanel {
    @Override
    protected void paint(Graphics g) {
        super.paint(g);
        Graphics myGraphics = g;
    }
}

二、Component.getGraphics()

 

public class MyFram extend JFrame{
    private Graphics graphics;
    private JPanel panel;

    public MyFram(){
        setTitle("获取Graphics 对象");
        setSize(300,300);
        setLocation(nwe Point(300,200));
        setVisible(true);
        /**
            TODO: 获取 Graphics 对象
            因为 JPanel 继承了 Component 类所以可以调用 getGraphics() 方法。
        */
        graphics = panel.getGraphics();
        graphics.drawLine(3,5,200,300);
        add(panel);
    }
}

此时会出现 NullPointerException
原因: 因为 JPanel、JFrame等类没有实现 getGraphics() 方法。

所以想要使用 getGraphics() 来获取对象,使用前确认调用 getGraphics() 方法的对象有没有重写 getGraphics() 方法。此外,还有别的方法我就不在演示,自行查找。

方法摘要

1、画线、画点

// TODO: 方法声明
public abstarct void drawLine(int x1,int y1,int x2,int y2);

参数解释

x1、y1 第一个点的坐标;x2、y2 第二个点的坐标

示例

// TODO: 画一条线段
g.drawLine(3,3,50,50);
// TODO: 画一个点。两点重合既是画点。
g.drawLine(100,100,100,100);

2、画矩形

    // 绘制指定矩形边框,即只是线条矩形
    public void drawRect(int x, int y, int width, int height)
    // 绘制填充矩形
    public abstract void fillRect(int x, int y, int width, int height)

参数解释

x, y 为矩形左上角的坐标点,即位置。 width、height 矩形的宽高。

示例

    // TODO: 绘制线条矩形
    g.drawRect(80,100,40,25);
    // TODO: 设置颜色
    g.setColor(Color.yellow);
    // TODO: 绘制填充
    g.fillRect(20,70,20,30);

效果

 

3、画圆角矩形

    // 绘制圆角线条矩形
    public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
    // 绘制圆角填充矩形
    public abstract void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)

参数解释

x,y --> 矩形左上角位置坐标点
width,height --> 矩形宽高
arcWidth --> 4 个角弧度的水平直径
arcHeight --> 4 个角弧度的垂直直径

示例

    // TODO: 绘制圆角线条矩形
    g.drawRoundRect(10,10,150,70,40,25);
    // TODO: 设置颜色
    g.setColor(Color.blue);
    // TODO: 绘制圆角填充矩形
    g.fillRoundRect(80,100,100,100,60,40);
    /**
        TODO: 用绘制圆角矩形的方法绘制 圆形
        当 width、height、arcWidth、arcHeight 相等,即为 圆。
    */
    g.setColor(Color.red);
    g.fillRoundRect(80,90,100,100,100,100);

效果

 

4、画 3-D 高亮显示矩形

    // 绘制圆角线条矩形
    public void draw3DRect(int x, int y, int width, int height, boolean raised)
    // 绘制圆角填充矩形
    public void fill3DRect(int x, int y, int width, int height, boolean raised)

参数解释

x,y --> 矩形左上角位置坐标点
width,height --> 矩形宽高
raised --> 一个用于确定矩形是凸出平面显示还是凹入平面显示的 boolean 值

示例

    g.setColor(Color.red);
    // TODO: 绘制三维线条矩形
    g.draw3DRect(80,100,40,25,true);
    g.setColor(Color.yellow);
    // TODO: 绘制三维填充矩形
    g.fill3DRect(20,70,20,30,false);

效果

 

5、画圆弧

    // 绘制圆角线条矩形
    public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
    // 绘制圆角填充矩形
    public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)

参数解释

x,y --> 矩形左上角位置坐标点
width,height --> 矩形宽高
startAngle --> 开始角度
arcAngle --> 相对于开始角度而言,弧跨越的角度。

示例

    // TODO: 绘制圆弧线
    g.drawArc(10,40,90,50,0,180);
    g.setColor(Color.yellow);
    // TODO: 绘制填充缺右上角的四分之三的椭圆
    g.fillArc(10,100,40,40,0,-270);

效果

 

6、画椭圆

     // 绘制线条椭圆
    public abstract void drawOval(int x, int y, int width, int height)
    // 绘制填充椭圆
    public abstract void fillOval(int x, int y, int width, int height)

参数解释

x,y --> 矩形左上角位置坐标点
width,height --> 矩形宽高

示例

    // TODO: 绘制线条椭圆
    g.drawOval(50,50,130,80);
    g.setColor(Color.blue);
    // TODO: 绘制填充椭圆
    g.fillOval(180,180,50,80);

效果

 

7、画折线图

    // 绘制 折线图
    public abstract void drawPolyline(int[] xPoints,int[] yPoints,int nPoints)

参数解释

xPoints - x 坐标数组。 yPoints - y 坐标数组。 nPoints - 点的总数。

示例

    // TODO: 横坐标集
    int x[] = {50,80,120,180};
    // TODO: 纵坐标集
    int y[] = {150,100,80,70};
    // 绘制 折线图
    g.drawPolyline(x,y,4);

效果

 

8、画 图片

    // 绘制 指定路径图片
    public abstract boolean drawImage(Image img,int x,int y, int width,int height,ImageObserver observer)  

参数解释

img --> 要绘制的指定图像。 x - x 坐标。
y - y 坐标。
width - 矩形的宽度。
height - 矩形的高度。
observer - 转换了更多图像时要通知的对象。

示例

    // TODO: 此路径为相对路径,并不是获取该系统文件夹下路径图片。
    ImageIcon image = new ImageIcon(this.getClass().getResource("bigdata.jpg"));
    // TODO: 根据 icon 获取 image
    Image myImage = image.getImage();
    // TODO: 绘制 图片
    g.drawImage(myImage, 0, 0, this.getWidth(), this.getHeight(),this);

效果

 

### Java Graphics 绘图示例 在 Java 中,`Graphics` 是用于绘制图形的核心类之一。它提供了丰富的 API 来绘制基本形状、线条、字符串以及其他复杂的视觉效果。以下是几个典型的 `Graphics` 绘图示例及其解释。 #### 示例 1:绘制简单几何图形 以下代码展示了如何使用 `Graphics` 类绘制矩形和直线: ```java import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class SimpleGraphicsExample extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 设置颜色为红色并绘制矩形 g.setColor(Color.RED); g.drawRect(50, 50, 200, 100); // 更改颜色为蓝色并绘制直线 g.setColor(Color.BLUE); g.drawLine(50, 50, 250, 150); } public static void main(String[] args) { JFrame frame = new JFrame("Simple Graphics Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 200); frame.add(new SimpleGraphicsExample()); frame.setVisible(true); } } ``` 在这个例子中,我们创建了一个继承自 `JPanel` 的类,并重写了它的 `paintComponent(Graphics g)` 方法[^1]。通过设置不同的颜色 (`setColor`) 并调用相应的绘图函数(如 `drawRect` 和 `drawLine`),实现了基础的几何图形绘制。 #### 示例 2:使用 Graphics2D 进行高级绘图 为了获得更强的功能支持,可以考虑使用 `Graphics2D` —— 它是 `Graphics` 的子类,具有更多的特性,例如变换、抗锯齿渲染等。 ```java import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; public class AdvancedGraphicsExample extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // 启用抗锯齿 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 填充椭圆 g2d.setColor(Color.GREEN); g2d.fillOval(70, 70, 150, 80); // 绘制弧线 g2d.setColor(Color.ORANGE); g2d.drawArc(90, 90, 100, 60, 0, 270); } public static void main(String[] args) { JFrame frame = new JFrame("Advanced Graphics Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 250); frame.add(new AdvancedGraphicsExample()); frame.setVisible(true); } } ``` 这里引入了 `Graphics2D` 对象,并启用了抗锯齿功能以提高图像质量[^2]。还演示了填充椭圆形以及绘制部分圆周的方法。 #### 示例 3:绘制带缩放的图片 如果想在应用程序里嵌入一张图片,则可借助 `Graphics.drawImage()` 方法完成这一需求。 ```java import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; public class ImageDrawExample extends JPanel { private Image image; public ImageDrawExample() { try { image = new ImageIcon("sample_image.png").getImage(); } catch (Exception ex) { System.err.println("Failed to load image."); } } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (image != null) { int scaledWidth = getWidth(); // 自适应宽度 int scaledHeight = getHeight(); // 自适应高度 // 缩放后绘制图片 g.drawImage(image, 0, 0, scaledWidth, scaledHeight, this); } } public static void main(String[] args) { JFrame frame = new JFrame("Image Drawing Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 300); frame.add(new ImageDrawExample()); frame.setVisible(true); } } ``` 在此案例中,我们将一幅名为 `"sample_image.png"` 的图片加载进来并通过适当比例调整其大小后再显示于屏幕上[^3]。 --- ### 注意事项 - 所有涉及 GUI 开发的操作都应在事件调度线程(Event Dispatch Thread)内执行。 - 当处理外部资源(像本例中的图片文件)时,请务必确认这些资源存在且路径正确无误[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值