JAVA的绘图功能非常丰富,绘图包括字体、颜色、图形,以下我们将分技术专题来讲。
一、关于JAVA的绘图机制。
JAVA中的任何一个图形组件,小到文本框、标签,大到一个FRAME,一个DIALOG,都有一个专门负责显示其界面的函数,这个函数名称是固定的:paint,它的原型为:
public void paint(Graphics g)
{
……
}
每当组件大小、位置、组件内容发生变化时,该函数即负责生成新的图形界面显示。由于该函数可以被子类继承,因此,继承的子类有能力修改该函数。如果子类中没有出现该函数,则表示其行为完全继承自父类。则不管是组件中是否添加了新的内容,是否发生了大小的改变,是否发生了位移,父类都要有一个专门的线程,来负责描绘变化以后的组件界面。 paint函数由父类自动维护,并且如果子类一旦重载该函数,必须自己去维护所有的界面显示。
二、设置画笔颜色
1、颜色常识
任何颜色都是三原色组成(RGB),JAVA中支持224位彩色,即红绿蓝色分量可取值介于0..255之间。下面首先学习一个JAVA中的类Color
Color中的常量:
public final static Color black=new Color(0,0,0);
public final static Color blue=new Color(0,0,255);
…..
Color的构造函数:
public Color(int r,int g,int b);
使用举例:如果想构造一个灰色对象,则用下面的句子:
Color gray=new Color(205,205,205);
2、设置画笔颜色语法
g.setColor(color); //color是一个Color对象
每修改一次颜色它影响的就是下面所有的绘图语句,一直影响到再次碰到setColor函数才以新的颜色代替。
3、使用JColorChooser组件选择颜色
JAVA中有一个已经定义好的选色器,通过简单的语法我们就可以将该窗口调出来,从其中选择自己喜欢的颜色。下面的这个例子就是通过颜色选取器选取颜色,并将选择到的颜色做为窗体的背景色。
(1)JColorChooser简介
JColorChooser组件的showDialog()方法让用户从弹出的窗口中选择一个颜色,并传给Color对象。其调用语法如下:
color=JColorChooser.showDialog(this,”选色”,color);
第一个参数指定调用选色器的父窗体,第二个参数指定选色器窗口标题,最后一个为接收颜色的颜色对象。
4、如何将一个图形(以文件存在,如JPG或者GIF)画到窗体的画布中
其实放置图形到画板中实际就是调用了画板的drawImage函数。其大致思路如下:
首先获取一个ImageIcon对象,这个对象将会从指定的文件中读取相关图象信息,它支持GIF和JPG、BMP等基本图象格式。语法如下:
ImageIcon icon=new ImageIcon(GraExp5.class.getResource("1.gif"));
获取到图象的图标以后,就可以从图标中获取到绘制到画板上的实际需要的图象:
Image img=icon.getImage();
有了这个图象对象,我们就可以用画板的drawImage函数画图了。
g.drawImage(img,0,0,null);
中间两个参数是图象绘制时在画板的起始点坐标。
例如:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GraExp5 extends JFrame
{
ImageIcon icon;
Image img;
public GraExp5()
{
icon=new ImageIcon(GraExp5.class.getResource("1.gif"));
img=icon.getImage();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setSize(new Dimension(400,300));
show();
}
public void paint(Graphics g)
{
g.drawImage(img,0,0,null);
}
public static void main(String[] args)
{
GraExp5 ge=new GraExp5();
}
}
程序分析:
需要注意的是,图象文件所在的位置应该和该类放在同一个目录中,这样不至于出错。
6、系统扩展,综合应用,如何为一个窗体设置背景图片。
要为一个窗体添加背景图片,必须知道绘制JComponent组件的过程。Swing轻量组件的绘制是组件和组件UI代表合作的结果。
JComponent.paint先绘制组件,然后绘制组件的边框,再绘制组件的子组件。调用的顺序确保组件、边框和子组件都是可视的。如果组件有一个UI代表,则JComponent.paintComponent调用该代表的Update方法,该方法为不透明组件擦除背景,然后绘制组件。
CInstead是一个不透明的组件,如果重载paint方法,其背景图是无法被擦除的,因此,即使更新了组件的所有包含组件,在界面上是看不到的。所以必须重载paintComponent方法,在绘制子组件前先擦除背景。
对双缓存组件,paint方法负责把组件绘制到屏外缓存中,然后把屏外缓存拷贝到组件的屏上代表中,正因为如此,我们不建议为Swing组件重载paint,如果需要重新定义如何绘制组件,那么就重载paintComponent()。
7、用可获取的字体、样式、字号修饰文字
(1)函数说明:
字形类Font用于规范组件所使用的字形大小、样式和字体等。其构造函数:
public Font(String name,int style,int size);
name表示本地可获取字体名称
style表示字体样式,包含Font.PLAIN,Font.BOLD,Font.ITALIC三种,分别对应平体、加粗和斜体。
一个有用的方法用来获取本地可用字体
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fa=ge.getAvailableFontFamilyNames();
通过从绘图环境中获取到本地可用的字体名数组。
java绘图闪屏与双缓冲
文章分类:Java编程
在使用awt绘图时,如果绘制的图像刷新太快,会出现闪屏现象。而针对闪屏现象,大都是采取双缓冲的方法来解决的。但是经过google了很多资料后发现对为什么会出现闪屏及为什么用双缓冲能解决这个问题,说的都不太具体。
首先说说为什么会造成闪屏现象。就现在你在显示银幕上看到的图像,是由很多的小图形组成。如果使用java中的awt来画图的话,一般情况是调用repaint方法,然后repaint方法自动调用paint方法。在paint方法中的调用是这样的:
画一个背景矩形
再画一个前景图形
。。。等等
这样就造成一个现象,当我们的paint方法还没有画完整个图形,这个时候屏幕刷新了(此时只显示了80%的图像)。等下次再刷新时,整个图像画完了,两次显示的图像不一样就会给人以频闪的感觉。所以造成频闪的原因是荧幕刷新太快,并且画图时不是把一个完整的图画到一次输出到显存。
为了解决频闪的问题,前辈们就想了一个双缓冲的方法。何为双缓冲呢?实际上就是把要画的东东先画到一个虚拟的图片上,然后一次性把这个图片画到显存里面。
在java中用awt画图存在频闪问题,但是查看了一些资料,如果用Swing的话就不存在,应为swing内置就是有双缓冲的。