前言:
在学习java的过程中,我最近接触到了与图形绘制相关的内容。为了完成学业中的作业,我拜读了许多大佬的文章和程序。现在作业倒是做完了,为了让自己最近所学有所属,我决定整理一下。若我所写有误,欢迎大佬批评指正。
关于简单绘制时图形容器的选择:
首先,有个前提得说明白。我们绘制图形时,自然是调用Graphics类进行绘制。但是绘制好的图形,我们总该找个容器来装吧。因此,可供选择的容器就有awt的子类Panel和Canvas类。Canvas可理解为画布,是容器的一种。而Panel类也为容器,两者皆可容纳Graphics的对象,但是Panel类可容纳对象的种类更多。当然,我们在单纯绘制简单图形时,使用Canvas类没有任何问题。但是使用Panel类,明显程序可塑性和可维护性会变得更强。在java中也有Javax.swing.JPanel对Panel进行拓展。在我们初学时,Panel其实已经够用。
import javax.swing.JFrame;//框架
import javax.swing.JPanel;//容器
import java.awt.Canvas;
?关于Graphics与Graphics2D之间的关系:
java对Graphics进行了拓展,也就是说Graphics2D是Graphics的拓展。我们在使用Graphics的时候,经常会看见它们的强制转换。将Graphics转化为Graphics2D类型进行使用,我在书写程序时也经常这样做。
Graphics2D gx=(Graphics2D) g;
?关于常用的Graphics图形绘制工具:
画直线:
abstract void drawLine(int x1,int y1,int x2,int y2) 调用该函数可以画一条从(x1,y1)到(x2,y2)的直线
gk.drawLine(gw*i,0,gw*i,180);
画椭圆(圆):
abstract void drawOval(int x, int y, int width, int height) 调用该函数可以画一个空心椭圆。形参表示这个椭圆的外接矩形的信息。x,y表示外接矩形左上角的坐标,width和height即外接矩形的宽高。在此基础上进行变行,将外界矩形变为一个正方形,即可画出一个圆来。
public abstract void fillOval(int x, int y, int width, int height) 调用该函数可以画一个实心椭圆。其它参数信息与画空心椭圆的函数一致。
gk.drawOval(20,20,20,20);//空心圆
gk.fillOval(80,80,20,20);//实心圆
画矩形:
abstract void drawRect(int x, int y, int width, int height ) 调用该函数,可以绘制一个矩形。x,y是矩形左上角的点的坐标,width和height为矩形的宽高
abstract void fillRect(int ,x, int y, int width, int height ) 调用该函数可以画一个实心矩形。同理x,y是矩形左上角的一个点,而width和height是矩形的宽高
gx.fillRect(x,y,20,20);//绘制方形
gx.drawRect(x,y,20,20);//绘制空心矩形
当然我们还有其它绘制图像的函数,从这点来说,java还是很方便的。其它函数可以去查查jdk手册,简单方便。
设置线条颜色:
我们经常遇到这样的需求,就是要求设置所绘制的图形的颜色。没有颜色,图形绘制出来难免显得单调。我们graphics刚好有设置线条颜色的函数。
abstract void setColor( Color c )调用这个函数可以设置线条颜色,其实就是相当于设置绘画时画笔的颜色。默认的画笔颜色,可以认为是黑色的。形参呢,其实就是Color的对象。而我们Color中设置了封装好的颜色对象,比如Color.RED,Color.BLUE。我们也可以手动设置RGB颜色对象。说到这里我们就不得不提,使用Color对象的时候要对Color库进行引用。Color是属于awt中的库。其引用代码可以这样写。
import java.awt.Color;//色彩
?我们在画图前预先设置好画笔的颜色,再进行图像绘制,就可以得到我们想要颜色的图像了。至于实心图形的绘制,也是一样的道理。我们只需要将画笔理解为颜料就可以了。
Graphics2D gx=(Graphics2D) g;
gx.setColor(Color.GREEN);//改变画笔颜色
gx.fillOval(x,y,20,20);//绘制圆形
?一个绘图实例:
我个人觉得这个例子在这一模块来说可能不太好。因为该题涉及了和鼠标的交互,作为一个单纯对图像绘制解说的例子,可能会存在干扰。但是我手头暂时没有好的例子。说直白点,就是作者太懒,没有预先写好适合例子的代码,各位读者讲究一下吧。
编写Java程序,创建一个窗体,并实现交互。在窗体内“单击鼠标左键”,在光标处绘制一个“绿圆”;窗体内“单击鼠标右键”,在光标处绘制一个“红色方框”;窗体内“双击鼠标左键”,清空所有已画“圆”和“方”。
其它得地方我就不拿出来了,我就把我设置图形的部分拿出来分享吧
class MyJpanel extends JPanel{
int x,y;
int num=0;
public void paint(Graphics g){
Graphics2D gx=(Graphics2D) g;
if(num==1){
gx.setColor(Color.GREEN);//改变画笔颜色
gx.fillOval(x,y,20,20);//绘制圆形
}//单击左键
else if(num==3){
gx.setColor(Color.WHITE);
super.paint(gx);//清除画面内容
}//双击左键
else if(num==2){
gx.setColor(Color.RED);
gx.fillRect(x,y,20,20);//绘制方形
}//单击右键
}
}//容器
|