java.awt包的Window类
一个窗体对象是一个顶级(top-level)窗体,该窗体没有边框和菜单条;该窗体的默认的布局形式是BorderLayout形式。一个窗体对象必须领有一个frame,或者Dialog或者另外一个窗体对象。窗体对象概念如下图所示:
在多屏幕环境中,咱们可这样的构造方法Window(Window, GraphicsConfiguration)在不同的屏幕设施(screen device)中创立一个窗体对象。 GraphicsConfiguration对象示意的上指标屏幕设施。在一个虚构设施的多屏幕环境中,桌面区域能够跨多个物理屏幕设施,所有设施的边界是绝对于虚构设施坐标零碎的(参见上图)。虚构坐标零碎的原坐标要高于次要物理屏幕的左上角坐标。而后窗体依据虚构设施中的主屏幕的坐标来定位。
在这种环境下,当咱们呼叫一个setLocation办法时,必须给该办法传送一个虚构坐标值。同样,当咱们应用getLocationOnScreen办法,窗体对象会返回一个虚构设施的坐标值。当咱们呼叫GraphicsConfiguration类的getBounds办法时,咱们会虚构坐标零碎中的源点值。上面的代码是设置一个窗体在(10,10)地位,该地位绝对于物理屏幕的源点的地位。
如果GraphicsConfiguration的边界没有越界,那么该窗领会被设置为(10,10),而该值是虚构坐标值,所以它会呈现次要物理屏幕中。
该坐标值不等于指定的GraphicsConfiguration对象的物理屏幕的值。示例代码如下:
Window w = new Window(Window owner, GraphicsConfiguration gc);Rectangle bounds = gc.getBounds();w.setLocation(10 + bounds.x, 10 + bounds.y);
留神:顶级窗体(蕴含Windows, Frames和Dialogs)的地位和大小是由操作系统的桌面的窗体管理系统来管制的。也就是说,咱们呼叫setLocation、setSize和setBounds办法时,是咱们向视窗操作系统的窗体管理系统发送申请(当然是间接间接的)。
然而在某些状况下,窗体管理系统可能会疏忽这样的申请,或者批改这些几何申请,以便可能放到适合地位,从而可能靠近操作系统中桌面设置的要求。因为有操作系统本地的事件处理是异步的起因,所以getBounds、getLocation、getSize和getLocationOnScreen返回的后果可能不会是屏幕上Window的理论几何值,除非所有的申请都处理完毕了。这是因为窗体管理系统在解决这些子申请批改相应的申请数据所造成的。比方咱们可缩放利用窗体的大小,而相应的窗体管理系统会随时调整窗体的显示大小值。对于这样调整的后果,个别会产生多个ComponentEvent事件对象,以示意新的几何图形。Window能够产生以下事件:
- WindowOpen
- WindowClosed
- WindowGainedFocus
- WindowLostFocus
该类创立自JDK 1.0版本。
java.awt包的Graphics2D类
该类继承Graphics类,然而提供了更简单的管制、坐标转换、色彩治理和文本布局。该类是出现二维空间、文本和图片的根本类。
坐标空间—所有传送给Graphics2D对象的坐标都是在独立坐标零碎中指定的,该零碎叫做User Space,该空间是由利用应用的。该类蕴含AffineTransform对象,用来出现状态的一部分,该类定义了怎么转换用户坐标为Device Space的设施依赖的坐标。
设施空间的坐标通常援用独立设施像素,而后在这些像素之间进行排序填充,以打消这些gap值。一些Graphics2D对象能够被用来捕捉出现操作,而后保留图形metafile文件,以便未知的物理设施上回放。因为这种解决方案不为人所,所以Graphics2D实现把用户坐标转换成虚拟空间坐标。每个Graphics2D对象都关联一个指标,该指标就是出现的中央。GraphicsConfiguration对象定义了出现指标的个性,比方像素格局和解决方案。在Graphics2D对象生命周期中应用雷同的出现指标。当创立一个Graphics2D对象时,GraphicsConfiguration指定一个默认的转换给Graphics2D对象的指标对象,比方Component或者Image对象。这个默认的转换隐射用户空坐标零碎到屏幕或者打印机设施的坐标零碎,其中X减少示意坐标程度右移,如果Y减少示意重直向下移。屏幕默认的转换单元是72 dpi(像素值)。打印是每英寸72像素值。对于图形缓存,也应用雷同的转换单元。
出现处理过程—该过程被分为四个阶段, 指标是由Graphics2D出现属性来管制的。出现器能够通过更多的步骤来优化,不论是缓存后果,以便于前面呼叫时应用,也能够把一个操作分解成多个虚构步骤。其出现处理过程如下:
- 决定出现什么
- 束缚出现操作到以后的clip. 所谓Clip是在用户空间中通过一个Shape指定的,并且被程序所管制。程序应用Graphics和Graphics2d类的clip操作方法来出现。这种user clip通过Transform对象被转换到设施空间。设施空间应用device clip与user clip组成一个composite clip以最终决定最初的clipping区。User clip不会被出现零碎的所批改,而只会被composite clip所隐射。
- 决定什么色彩被出现
- 依据Graphics2D上下文的以后的Composite属性,把色彩作用到指标绘制界面。
出现操作有三种,每种操作都本人的出现处理过程。
Shape operations (形态操作)
如果操作是一个画(shape)操作,那么呼叫办法createStokedShape来构建一个新的形态对象,该对象蕴含指定Shape的形状。该形态从user space转换到device space的形态,转换时应用Graphics2d上下文的以后Transform对象。
该形态的形状是应用Shape的办法getPathIterator抽取进去,该办法返回一个PathIterator对象,该对象依据Shape的边界进行迭代。
如果Graphics2D对象不能解决PathIterator曲形段,而后呼叫Shape的getPathIterator办法。
在Graphics2D上下文中以后Paint须要PaintContext对象,该上下文对象指定设施空间中的色彩出现
Text operations (文本操作)
上面的步骤用来决定所需的字形(glyph)来出现指定的字符串:
如果参照是一个字符串,那么在Graphics2D上下文中的以后Font对象被要求转换字符串的Unicode字符为一组字形,以便与根本布局和字符实现的形态算法起出现具体的字形。
如果参见是一个AttributedCharacterIterator对象,那么该迭代器对象会被要求转换它本人到TextLayout对象,转换时应用它内置的字体属性。TextLayout对象实现了简单的字形布局算法,该算法应用Unicode双向布局主动调整多种字体。
如果参见是GlyphVector对象,那么该对象曾经蕴含了相应的指定字体字形代码,该代码有每个字形的地位坐标值。
以后Font对象须要获取指定字形的形状,这些形状在user space中被看成形态。
依据以上的Shape操作,字符形状被填充到指定的字形上
在PaintContext对象中呼叫以后的Paint对象,以便指定device space中的色彩来出现。
- Image Operations (图形)
源Image的bounding box定义了交加区域,在Image Space中该bounding box是被指定的,也就是Image对象的本地坐标零碎
如果AffineTransform被传送到drawImage办法,AffineTransform对象被用来从image space转换到user space中去。如果没有AffineTransform对象,那么bounding box被认为曾经存在于user space中了。
而后源Image的bounding box从user space转换到device space中去,转换时应用以后的Transform对象。留神,在device space的矩形区域中是不会有转换动作的。
Image对象决定哪种颜色被出现,而后依据源和目标坐标隐射到指定的以后的Transform对象中去,以及优化的image转换。
Default Rendering Attributes—Graphics2D出现属性默认值:
- Paint—Component的色彩Font—Component的字体
- Stoke—一个方形的笔
- Transform—Component的GraphicsConfiguration对象的getDefaultTransform办法的返回对象
- Composite—示意AlphaComposite.SRC_OVER规定Clip—没有出现Clip时,那么是该Component的输入的clip值。
出现兼容性问题—JDK 1.1出现模型是基于像素模型,该模型指定坐标是无穷小的,也就是像素之间的填充。绘制操作是应用一个像素宽度的笔来绘制实现的,该笔填一个一个依据绘制门路填充像素到一个指定的锚点。JDK 1.1出现模式是由大多数现有被平台用来出现的类组成,这些类须要把整数坐标转换成离散的笔来实现指定的像素。Java 2D API反对拒锯齿出现技术,一只笔应用一个像素不能齐全反对N和N+1的落差景象,所以如果设置的抗锯齿性能,那么出现器会决定应用哪个
像素来填补两个像素之间的落差。Java 2D API保护JDK出现行为的兼容性问题,比方原有的legacy操作和已存的出现行为不会在Java 2D API中批改。Legacy办法隐射既定了的通用的绘制和填充办法,这些办法分明的标识了Graphics2D怎么继承Graphic基类,该类基于Stroke和Transform属性。无限的执行步骤是默认的属性设施,比方默认的Stroke是BasicStroke类,它是一个1值没有虚线,并且默认提Transform给屏幕绘制的惟一传输对象。
上面是锯齿和反锯齿预出现行为规定:
- 设施坐标被定义到device像素之间,以防止产生锯齿的反锯齿出现的不一致性。如果坐标被定义在一个像素的两头,那么该像素的一些局部会被一个形态所笼罩,比方矩形只有一半被笼罩。当应用锯齿出现时,笼罩一半的像素能够shape的外部或者内部。当应用抗锯齿出现时,整个shape的边界像素会有一半被笼罩。另一方面,因为坐标在像素之间被定义,所以一个shape像矩形不会有一半被笼罩,不论它是否被应用抗锯齿出现。Line和门路应用BasicStoke对象能够被“normalized”(标准化)之后,能够提供outline的出现一致性,标准化(normalization)过程是通过KEY_STROKE_CONTROL来管制。而形象标准化算法不是指定的,然而它的指标是确保line是可视化的一致性。
下列是所有legacy办法是基于默认的属性设置:
填充操作,包含fillRect, fillRoundRect, fillOval, fillArc, fillPolygon和clearRect. 比方
fill(new Rectangle(x, y, w, h)); - 同样绘制操作,包含drawLine, drawRect, drawRoundRect, drawOval, drawArc, drawPolyline和drawPolygon. draw(new Rectangle(x, y, w, h));
- 办法draw3DRect和fill3DRect办法实现了Graphics类的drawLine和fillRect办法。这些办法预约义了它们的行为,定义时是依据Graphics2D上下文中的以后Stroke和Paint对象的来确定的。它重写了以后Paint对象,并且应用fillRect来形容雷同的形象行为。Graphics类只定义了setColor办法来管制喷绘的色彩。而在Java 2D API包中扩大了Color对象的,并且实现了新的Paint接口,现存的setColor办法是为了不便设置以后Paint属性的到一个Color对象,setColor办法等同setPaint办法。其中类Graphics定义了两个办法来管制色彩怎么被利用到指标中去。
setPaintMode办法实现设置默认的组件,等同于setComposite (new AlphaComposite)办法
setXORMode(Color xorColor)办法用来不便设置一个特定的Composite对象,而疏忽Alpha源色彩
组件和设置指标色彩为值:
dstpixel = (PixelOf(scrColor) ^ PixelOf(xorColor) ^ dstpixel);
总结
Java给咱们第三方程序提供了大量的API来不便开发,因而,当咱们应用Java编程开发时,必然有一个默认习惯:依据本人的开发技术需要,先认真看API能够给咱们提供什么,并且认真浏览这些API的性能形容。
图片起源:http://www.cungun.com/ 游戏