java 2d 图形_Java学习笔记--Swing2D图形
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图形相关推荐
- java程序伪代码_Java学习笔记——伪代码及程序控制
开学刚刚一个月,学习Java也已经有三周. 老师给了下面的实验题目: 某教师需要一个学生成绩计算应用程序.每个学生总评成绩是由平时成绩.期中成绩.期末成绩 和其它成绩组成,其所占比例为:平时成绩30% ...
- java 字符串赋值_Java 学习笔记(二)变量
标识符 标识符就是名字.类名,变量名,方法名,参数名等 标识符的命名规则 以字母.下划线或美元符号$开头,不能以数字开头 其后可以是字母.数组或美元符号$ 区分大小写 避免使用关键字 ...
- java 调用弗雷_JAVA 学习笔记
封装: 将类的某些信息隐藏在类的内部,不允许外部程序访问,而是通过该类提供的方法实现对隐藏信息的操作和访问,保证了数据的安全性.(可以隐藏类的细节,方便修改) 封装的实现步骤: 1.修改属性的可见性: ...
- java日期类型_Java 学习笔记 (三) Java 日期类型
以下内容摘自: https://www.cnblogs.com/crazylqy/p/4172324.html import java.sql.Timestamp; import java.text ...
- JAVA翻译官_Java学习笔记之——Java介绍
1.Java体系: JavaSE:标准版,其他两个体系的基础 JavaEE:企业版 JavaME:微型版,适用于消费类型的微型设备 2.Java三大特性:封装.继承.多态 3.Java的特点:面向对象 ...
- java jcf查看_Java学习笔记——JCF集合框架
List基本使用 特别是有顺序,所有可以用get(i)读取出来 public static void main(String[] args) { //1.List基本使用 List lst = new ...
- java嵌套循环语句_Java学习笔记(七) 循环语句
一.for循环语句 1.1 循环结构 循环结构的组成: 初始语句:用于表示循环开启的起始状态,简单说就是循环开始的时候什么样 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行 ...
- java 静态成员 创建_Java学习笔记11---静态成员变量、静态代码块、成员变量及构造方法的初始化或调用顺序...
当创建一个对象时,各种成员变量及构造方法的初始化或调用顺序是怎样的呢? (1).如果类尚未加载,则先初始化静态成员变量和静态代码块,再初始化成员变量,最后调用相应的构造方法: (2).如果类已经加载过 ...
- java算法优化_Java学习笔记---Java简单的代码算法优化(例)
例:用一张1元纸币兑换1分.2分.5分硬币,要求兑换50枚硬币,求出所有组合. package mypackage01; public class demo { public static void ...
- java 类可见性_Java学习笔记(类的可见性)
1)类的可见性:public;友好的(无关键字);protected;private; public:公开类,在包内,包外都可见,是可见性级别最高的; 友好的:也是默认的安全级别,包外不可见,包内可见 ...
最新文章
- C#学习视频分享与开发技术QQ交流群
- mysql global temporary table_【转】MySQL Temporary Table相关问题的探究
- ROS最正确的限速--------小包优先+带宽均分+简单队列限制上传速度
- php钓鱼怎么使用方法,路亚钓法操作步骤及抛投技巧
- 【quickhybrid】H5和原生的职责划分
- 在一个centos6上安装多个不同版本python
- 【深扒】深入理解 JavaScript 中的异步编程
- 【生活中的逻辑谬误】以先后论因果和简化推理
- 基于JS/H5实现二维码扫码增强版-带视频演示
- 网站html源代码如何修改,如何修改网页源代码
- 《郭论》郭德纲/著 读后得2021-02-22
- java assert int_java中的assert(转载)2
- 通达信板块监控指标_通达信板块监测指标公式
- 考点图文详解 - 局域网与城域网(第四章)
- 康耐视3D-DSMax图像采集详细操作流程
- 零基础搭建:可扫码、实时分析的设备巡检系统
- Android本地服务器NanoHttpd配置Https双向认证
- Stm32之RTC时钟(2021-07-26)
- html 界面模糊的效果,CSS3 filter(滤镜) 说明,超级马赛克。<( ̄︶ ̄)↗[GO!]
- 【C/C++】C语言特性总结
热门文章
- 排序算法--基数排序
- 孙鑫VC学习笔记:第十一讲 (二) 图形的保存与重绘方法一
- docker安装mysql5.7_docker安装mysql5.7
- 拓端tecdat|R语言逻辑回归和泊松回归模型对发生交通事故概率建模
- oracle 变长数组,oracle:变长数组varray,嵌套表,集合
- ios 添加block 类别_ios block是什么数据类型?
- 用caffe训练测试自己的图片
- LetNet5卷积参数理解
- 实地踩坑,新鲜出炉,阿里云GPU服务器Centos7.7深度学习环境搭建实战
- python求解对给定字符串,求解所有子序列是否为回文序列