当前位置: 首页 > article >正文

《Java核心技术 卷I》Swing处理2D图形

处理2D图形

Java1.0开始,Graphics类就包含绘制直线、矩形和椭圆等方法,但是绘制图形的操作能力有限,我们将使用Java2D的图形库。想绘制需要获得Graphics2D类的一个对象,是Graphics的子类。paintCompoent方法接收一个2D类对象,并强制转换。

Java2D库采用面向对象的方式组织几何图形,提供了直线,矩形,椭圆的类:

Line2D,Rectangle2D,Ellipse2D,都实现了Shape接口,调用draw方法绘制。

Java2D库针对像素,采用浮点坐标,而不是整数坐标,内部计算采用单精度float。

涉及到加f后缀和将double强转,都有点麻烦,设计者提供了两个版本:

  • 节省空间版本,用float坐标
  • 为懒惰程序员提供的版本,使用double类型的坐标(本书采用这种)

用法类似于,new Rectangle2D.Float或new Rectangle2D.Double

构造点也是,Point2D.Float和Point2D.Double

椭圆也继承一个矩形类,是椭圆的外界矩形。

图形类之间的关系

Rectangle2D和Ellipse2D队形很容易构造,需要指定:

  • 左上角的x和y坐标
  • 宽和高

对于椭圆,表示外界矩形:

var e = new Ellipse2D.Double(150,200,100,50);//左上角坐标150,200,宽100、高50

通过中心点构造椭圆:

var ellipse = new Ellipse2D.Double(centerX-width /2,centyY-height/2,width,height);

构造直线需要起点和终点

案例:绘制几何图形

package draw;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class DrawTest {

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            var frame = new DrawFrame();
            frame.setTitle("DrawTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }

}

class DrawFrame extends JFrame {
    public DrawFrame() {
        add(new DrawComponent());
        pack();
    }
}


class DrawComponent extends JComponent {
    
    private static final int DEFAULT_WIDTH = 400;
    private static final int DEFAULT_HEIGHT = 400;
    
    @Override
    protected void paintComponent(Graphics g) {
        var g2 = (Graphics2D)g;
        //画一个矩形
        double leftX = 100;
        double topY = 100;
        double width = 200;
        double height = 150;
        
        var rect = new Rectangle2D.Double(leftX, topY, width, height);
        g2.draw(rect);
        
        //画一个椭圆
        var ellipse = new Ellipse2D.Double(leftX, topY, width, height);
        g2.draw(ellipse);
        //画一个和外接矩形相同的圆心的圆
        double centerX = rect.getCenterX();
        double centerY = rect.getCenterY();
        double radius = 150;
        var circle = new Ellipse2D.Double();
        circle.setFrameFromCenter(centerX, centerY, centerX+radius, centerY+radius);
        g2.draw(circle);
    }
    
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
    
}

效果:

java.awt.geom.RectangularShape 1.2

  • double getCenterX()
  • double getCenterY()
  • double getMinX()
  • double getMinY()
  • double getMaxX()
  • double getMaxY(),返回闭合矩形的中心,以及最小、最大x和y坐标值。
  • double getWidth()
  • double getHeight(),返回闭合矩形的宽和高
  • double getX()
  • double getY(),返回闭合矩形左上角的x和y坐标

java.awt.geom.Rectangle2D.Double 1.2

  • Rectangle2D.Double(double x,double y, double w,double h),利用给定的左上角、宽和高,构造一个矩形。

java.awt.geom.Ellipse2D.Double 1.2

  • Ellipse2D.Double(double x,double y,double w,double h),利用有给定左上角、宽和高的外接矩形,构造一个椭圆。

java.awt.geom.Point2D.Double 1.2

  • Point2D.Double(double x,double y),利用给定坐标构造一个点

java.awt.geom.Line2D.Double 1.2

  • Line2D.Double(Point2D start,Point2D end)
  • Line2D.Double(double startX,double startY,double endX,double endY),使用给定的起点和终点,构造一条直线。

http://www.kler.cn/a/395304.html

相关文章:

  • 深入探索 React Hooks:原理、用法与性能优化全解
  • QTcpSocket 服务端和客户端
  • 删库跑路,启动!
  • sqlsever 分布式存储查询
  • 探索MoviePy:Python视频编辑的瑞士军刀
  • 苦等三年!金克斯大人回来了!
  • 探索 Python HTTP 的瑞士军刀:Requests 库
  • JavaScript逆向爬虫教程-------基础篇之深入JavaScript运行原理以及内存管理
  • openwebui二改界面环境搭建
  • Ubuntu网络(prot)连通性检测
  • 当使用key-value方式进行参数传递时,若key对应的是一个对象或数组结构,如何利用API Post工具进行模拟操作。
  • thinkphp6 --数据库操作 增删改查
  • Flutter:使用Future发送网络请求
  • unity3d————插值运算补充点
  • 使用 Spring Security 实现基于角色的权限管理
  • ssm111基于MVC的舞蹈网站的设计与实现+vue(论文+源码)_kaic
  • C#笔记(3)
  • 解决Spring Boot整合Redis时的连接问题
  • 【Python · PyTorch】卷积神经网络(基础概念)
  • 长连接配置以及断线重连
  • Ubuntu 20.04配置ollama并下载安装调用本地大语言模型
  • 低光增强常用的损失函数pytorch实现
  • 「QT」高阶篇 之 d-指针 的用法
  • javascript用来干嘛的?赋予网站灵魂的语言
  • axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)
  • 百度世界2024|李彦宏:智能体是AI应用的最主流形态,即将迎来爆发点