1.处理2D图形

要想使用java 2D库绘制图形,需要获得一个Graphics2D类对象。这个类是Graphics类的子类。

paintComponent方法自动获得一个Graphics2D类对象,我们只需要进行一次类型转换。

public void paintComponent(Graphics g){

Graphics2d g2 = (Graphics2D) g;

}

Java 2D库采用面向对象的方式将几何图形组织起来。包含描述直线、矩形、椭圆的类(当然也支持更复杂的图形):

Line2D Rectangle2D Ellipse2D

这些类全部实现了Shape接口。

想绘制图形,

(1)先要创建一个实现了Shape接口的类的对象,

(2)然后调用Graphics2D类中的draw方法

每个图形类有两个版本,如 Rectangle2D.Float, Rectangle2D.Double

(一般来说用float即可,精度足够,可以节约空间,增加Double是因为精度丢失会有错误,当然也可以用强制类型转换)

2D矩形类

┌Rectangle2D.Float

Rectangle2D-┤

└Rectangle2D.Double

因此,创建Rectangle2D.Float对象需要提供float型数值坐标。Rectangle2D.Double提供double型坐标。

Rectangle2D.Float floatRect = new Rectangle2D.Float(10.0F,25.0F,22.5F,20.0F);

Rectangle2D.Double doubleRect= new Rectangle2D.Double(10.0,25.0,22.5,20.0);

实际可以使用

Rectangle2D floatRect = new Rectangle2D.Float(10.0F,25.0F,22.5F,20.0F);

Rectangle2D doubleRect= new Rectangle2D.Double(10.0,25.0,22.5,20.0);

Point2D类也有两个子类

Point2D p = new Point2D.Double(10,20);

Rectangle2D和Ellipse2D类都是由公共超类RectangularShape继承而来。因为椭圆也有矩形边界。

RectangularShape常用的方法有  getWidth,  getHeight ,  getCenterX,  getCenterY

构造矩形:

Rectangle2D rect = new Rectangle2D.Double(lux,luy,rdx,rdy);

表示 构造左上角位于(lux , luy)右下角位于(rdx , rdy)的矩形

但如果顶点不是左上角时可以这样构造:

Rectangle2D rect = new Rectangle2D.Double();//先构造一个空矩形

rect.setFrameFromDiagonal(px,py,qx,qy);

或者已知顶点为Point2D类型的两个对象p、q,可以这样调用

rect.setFrameFromDiagonal(p ,q);

构造椭圆:

Ellipse2D e = new Ellipse2D.Double(150,200,100,50);

表示 用左上角位于(150,200)、宽100、高50的外接矩形构造一个椭圆

知道椭圆中心点时可以这样

Ellipse2D e = new Ellipse2D.Double(centerX-width/2,centerY-height/2,width,height);

构造直线:

Line line = new Line2D.Double(start,end);

Line line = new Line2D.Double(startx,starty,endx,endy);

例子:

public class DrawTest {

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable(){

public void run (){

JFrame frame = new JFrame();

frame.setTitle("2D图形");

frame.add(new DrawComponent());//添加自己的JComponent

frame.setSize(400,400);//设置窗口大小

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

});

}

}

class DrawComponent extends JComponent{

public void paintComponent(Graphics g){

final int DEFAULT_WIDTH = 400;

final int DEFAULT_HEIGHT = 400;

Graphics2D g2 = (Graphics2D)g;

double leftx = 100;

double topy =100;

double width =200;

double height = 150;

//画矩形

Rectangle2D rect = new Rectangle2D.Double(leftx,topy,width,height);

g2.draw(rect);

//画椭圆

Ellipse2D ellip = new Ellipse2D.Double();

ellip.setFrame(rect);

g2.draw(ellip);

//画一条直线

g2.draw(new Line2D.Double(leftx,topy,leftx+width,topy+height));

//画另一个椭圆

double centerx = rect.getCenterX();

double centery = rect.getCenterY();

double radius = 150 ;

Ellipse2D circle = new Ellipse2D.Double();

circle.setFrameFromCenter(centerx,centery,centerx+width,centery+height);

g2.draw(circle);

}

}

2.使用颜色

Graphics2D类的setPaint方法可以为图形环境上的所有后续的绘制操作选择颜色,(setColor等同于setPaint)例如:

g2.setPaint(Color.RED);

g2.drawString("Warning",100,100);

只需要将调用draw替换为调用fill就可以用一种颜色填充一个封闭图形(例如:矩形或者椭圆形)

Rectangle2D rect = new Rectangle2D.Double(leftx,topy,width,height) ;

g2.setPaint(Color.RED);

g2.fill(rect);//fills rect with red color

想要设置背景颜色,就需要使用Component类中的setBackground方法。component类是JComponent类的祖先

JComponent类setBackground需要做的工作

第一,你需要一个UI

第二,你必须将其设置为非透明。

第三,调用super的paintComponent方法。

注:如果使用JPanel则不需UI与设置非透明,因为JPanel就是不透明的

public class DrawColor {

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable(){

public void run(){

JFrame frame = new JFrame();

frame.setTitle("2D图形颜色填充");

//frame.setBackground(Color.black);

MyComponent mp = new MyComponent();

//mp.setOpaque(true);//将component设置为不透明

mp.setBackground(Color.blue);

frame.add(mp);

frame.setSize(400,400); //设置窗口大小

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

});

}

}

/*setBackground需要做的工作

第一,你需要一个UI

第二,你必须将其设置为非透明。

第三,调用super的paintComponent方法。

*/

class MyComponent extends JComponent{

public MyComponent() {

super();

setUI(new ComponentUI(){});//设定一个UI

setOpaque(true);//将component设置为不透明

}

public void paintComponent(Graphics g){

super.paintComponent(g);//调用super的paintComponent方法

Graphics2D g2 = (Graphics2D)g;

//画矩形

Rectangle2D rect = new Rectangle2D.Double(100,100,200,150);

g2.setPaint(Color.RED);//设置颜色

g2.fill(rect);//画图

}

}

java 2d 图形_Java学习笔记--Swing2D图形相关推荐

  1. java程序伪代码_Java学习笔记——伪代码及程序控制

    开学刚刚一个月,学习Java也已经有三周. 老师给了下面的实验题目: 某教师需要一个学生成绩计算应用程序.每个学生总评成绩是由平时成绩.期中成绩.期末成绩 和其它成绩组成,其所占比例为:平时成绩30% ...

  2. java 字符串赋值_Java 学习笔记(二)变量

    标识符  标识符就是名字.类名,变量名,方法名,参数名等  标识符的命名规则  以字母.下划线或美元符号$开头,不能以数字开头 其后可以是字母.数组或美元符号$ 区分大小写 避免使用关键字  ...

  3. java 调用弗雷_JAVA 学习笔记

    封装: 将类的某些信息隐藏在类的内部,不允许外部程序访问,而是通过该类提供的方法实现对隐藏信息的操作和访问,保证了数据的安全性.(可以隐藏类的细节,方便修改) 封装的实现步骤: 1.修改属性的可见性: ...

  4. java日期类型_Java 学习笔记 (三) Java 日期类型

    以下内容摘自:  https://www.cnblogs.com/crazylqy/p/4172324.html import java.sql.Timestamp; import java.text ...

  5. JAVA翻译官_Java学习笔记之——Java介绍

    1.Java体系: JavaSE:标准版,其他两个体系的基础 JavaEE:企业版 JavaME:微型版,适用于消费类型的微型设备 2.Java三大特性:封装.继承.多态 3.Java的特点:面向对象 ...

  6. java jcf查看_Java学习笔记——JCF集合框架

    List基本使用 特别是有顺序,所有可以用get(i)读取出来 public static void main(String[] args) { //1.List基本使用 List lst = new ...

  7. java嵌套循环语句_Java学习笔记(七) 循环语句

    一.for循环语句 1.1 循环结构 循环结构的组成: 初始语句:用于表示循环开启的起始状态,简单说就是循环开始的时候什么样 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行 ...

  8. java 静态成员 创建_Java学习笔记11---静态成员变量、静态代码块、成员变量及构造方法的初始化或调用顺序...

    当创建一个对象时,各种成员变量及构造方法的初始化或调用顺序是怎样的呢? (1).如果类尚未加载,则先初始化静态成员变量和静态代码块,再初始化成员变量,最后调用相应的构造方法: (2).如果类已经加载过 ...

  9. java算法优化_Java学习笔记---Java简单的代码算法优化(例)

    例:用一张1元纸币兑换1分.2分.5分硬币,要求兑换50枚硬币,求出所有组合. package mypackage01; public class demo { public static void ...

  10. java 类可见性_Java学习笔记(类的可见性)

    1)类的可见性:public;友好的(无关键字);protected;private; public:公开类,在包内,包外都可见,是可见性级别最高的; 友好的:也是默认的安全级别,包外不可见,包内可见 ...

最新文章

  1. C#学习视频分享与开发技术QQ交流群
  2. mysql global temporary table_【转】MySQL Temporary Table相关问题的探究
  3. ROS最正确的限速--------小包优先+带宽均分+简单队列限制上传速度
  4. php钓鱼怎么使用方法,路亚钓法操作步骤及抛投技巧
  5. 【quickhybrid】H5和原生的职责划分
  6. 在一个centos6上安装多个不同版本python
  7. 【深扒】深入理解 JavaScript 中的异步编程
  8. 【生活中的逻辑谬误】以先后论因果和简化推理
  9. 基于JS/H5实现二维码扫码增强版-带视频演示
  10. 网站html源代码如何修改,如何修改网页源代码
  11. 《郭论》郭德纲/著 读后得2021-02-22
  12. java assert int_java中的assert(转载)2
  13. 通达信板块监控指标_通达信板块监测指标公式
  14. 考点图文详解 - 局域网与城域网(第四章)
  15. 康耐视3D-DSMax图像采集详细操作流程
  16. 零基础搭建:可扫码、实时分析的设备巡检系统
  17. Android本地服务器NanoHttpd配置Https双向认证
  18. Stm32之RTC时钟(2021-07-26)
  19. html 界面模糊的效果,CSS3 filter(滤镜) 说明,超级马赛克。<( ̄︶ ̄)↗[GO!]
  20. 【C/C++】C语言特性总结

热门文章

  1. 排序算法--基数排序
  2. 孙鑫VC学习笔记:第十一讲 (二) 图形的保存与重绘方法一
  3. docker安装mysql5.7_docker安装mysql5.7
  4. 拓端tecdat|R语言逻辑回归和泊松回归模型对发生交通事故概率建模
  5. oracle 变长数组,oracle:变长数组varray,嵌套表,集合
  6. ios 添加block 类别_ios block是什么数据类型?
  7. 用caffe训练测试自己的图片
  8. LetNet5卷积参数理解
  9. 实地踩坑,新鲜出炉,阿里云GPU服务器Centos7.7深度学习环境搭建实战
  10. python求解对给定字符串,求解所有子序列是否为回文序列