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是因为精度丢失会有错误,当然也可以用强制类型转换)
|
因此,创建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学习笔记--Swing2D图形的更多相关文章
-
Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
-
java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
-
java学习笔记7--抽象类与抽象方法
接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...
-
0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
-
0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
-
Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
-
0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
-
0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
-
0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
随机推荐
-
自己动手写插件底层篇—基于jquery移动插件实现
序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...
-
CSS中常见的位置(position)属性
常用的位置属性列表: position(top.bottom.left.right) .overflow.z-index position用法: 值 描述 relative 相对定位,原位置仍占用空间 ...
-
CSS系列:less备忘
less备忘 //这是一个运行在koala中的less文件,//注释不会被编译到css文件中,/**/注释会 ****************by 李可 2016/04/19 /*所有,所有伪类*/ ...
-
给Jquery动态添加的元素添加事件2
$('div').on('click', 'button', function(e){console.log($(e.target).is(':button'))}); $('<button&g ...
-
Linux内存管理学习笔记 转
https://yq.aliyun.com/articles/11192?spm=0.0.0.0.hq1MsD 随着要维护的服务器增多,遇到的各种稀奇古怪的问题也会增多,要想彻底解决这些“小”问题往往 ...
-
start_kernel——boot_init_stack_canary
/* * Initialize the stackprotector canary value. * * NOTE: this must only be called from functions t ...
-
Julia语言:让高性能科学计算人人可用
Julia语言:让高性能科学计算人人可用要:一群科学家对现有计算工具感到不满:他们想要一套开源系统,有C的快速,Ruby的动态,Python的通用,R般在统计分析上得心应手,Perl的处理字符串处理, ...
-
记第一届 CCCC-团体程序设计天梯赛决赛 参赛
其他都没什么,上午报道,下午比赛两个半小时,最后139分 但四我超遗憾的是,最后在做L3-1二叉搜索树,因为看到有辣么多人做出来,可是我没做出来啊 比赛结束后看了看其他两道当场吐血,L3-3直捣黄龙不 ...
-
Python中闭包、装饰器的概念
1.闭包(Closure)的概念: 内部函数中对enclosing作用域的变量进行引用 1 passline = 60 2 def func(val): 3 print('%x' % id(val)) ...
-
Get Remote Computer Install Software
#requires -Version 2 function Get-Software { param ( [string] $DisplayName='*', [string] $UninstallS ...