第四章图形编程【PPT课件】

2020-11-04 12:44:25 本页面

【导读】Component类提供了一个方法:add();可以把一个容器添加到另一个容器里,

文章介绍图

  

【正文】 第四章图形编程
Swing简介
一.AWT工具包
java的抽象窗口工具包(AWT:Abstract
windowInterface)包含在,
它提供了许多用来设计GUI的组件类和容
器类
基本AWT库处理用户界面元素的方法是把
这些元素的创建和行为委托给每个目标平
台上的本地GUI工具箱进行处理
AWT的层次关系
EventComponentGraphicsMenuCompon
ButtonScrollBarContainer
CanvasList
CheckBox
Label
TextField
TextArea
Window
FrameDialog
Font
Applet
Panel
二.JavaSwing
Swing:非基于对等体的GUI工具箱
Swing具有更丰富并且更方便的用户
界面元素集合
Swing对底层平台的依赖更少
Swing会带来交叉平台上的统一视觉
体验
Swing类被放在
Swing组件层次关系
Componemt
Container
Window
FrameDialog
JFrameJDialog
JComponent
JPanelJLabel
JScrollerJMenuBarJButton
Jtext..
三.AWT与Swing的关系
对于使用过Java早期版本的人来说,大
部分AWT组件都有其Swing等价物
后者的名字一般是在前面添加一个字母
“J”,如:JButton,JFrame,JPanel等
一.组件
Java把由Component类的子类或间接子类
创建的对象称为一个组件
例:Buttonbutton1=newButton();
例:TextFieldtextfield=new
TextField();
例:Labellabel=newLabel();
二.容器
Java把由container类的子类或间接子类创建
的对象称为一个容器
例:
Framefra=newFrame(“这是一个窗口”);
Applet是Panel的子类,是Container的间接
子类
Applet本身也是一个容器
三.添加组件
Component类提供了一个方法:add();
例:(button);
例:(TextField);
容器本身也可以看作是一个组件,因此
可以把一个容器添加到另一个容器里,
实现容器嵌套
例:add(fra);
四。布局管理器
Java采用非常优秀的概念来进行布局
一个容器内的所有组件都由一个布局管
理器来进行管理
Java支持以下四种布局管理器
FlowLayout
BorderLayout
CardLayout
GridBagLayout
在Java中,顶层窗口(没有包含在另一
个窗口内的窗口)称为框架
AWT库中有一个基于对等体的Frame类对
应着顶层
该类的Swing版本为JFrame,JFrame是Frame
子类
例:框架是容器的例子
五.常用容器
import.*;
publicclassSimpleFrameTest
{publicstaticvoidmain(String[]args)
{
SimpleFramemyframe=new
SimpleFrame();
(
);
();
}
}
classSimpleFrameextendsJFrame
{
publicSimpleFrame()
{
setSize(WIDTH,HEIGHT);
}
publicstaticfinalintWIDTH=300;
publicstaticfinalintHEIGHT=200;

通过调用toolkit来得到系统相关信息
例:
例:获得屏幕尺寸
Toolkitkit=
();
DimensionscreenSize=
();
intscreenHeight=;
intscreenWidth=;
classCenteredFrameextendsJFrame
{
publicCenteredFrame()
{
//getscreendimensions
Toolkitkit=();
DimensionscreenSize=();
intscreenHeight=;
intscreenWidth=;
//centerframeinscreen
setSize(screenWidth/2,screenHeight/2);
setLocation(screenWidth/4,screenHeight/4)
//setframeiconandtitle
Imageimg=("");
setIconImage(img);
setTitle("CenteredFrame");
}}
API
booleanisVisible()检查组件是否可见
voidsetVisible(booleanb)
设置组件可见
voidsetBounds(intx,inty,int
width,intheight)移动并缩放组件
DimensiongetSize()得到组件的大小
voidsetSize(intwidth,intheight)
voidsetSize(Dimensiond)
把组件缩放到指定调度和宽度
voidtoFrond()放在其它窗口前面
voidtoBack()放在其它窗口后面
voidsetResizable(booleanb)缩放框架
voidsetTitle(Strings)设置标题
voidsetIconImage(Imageimage)
将Image用作图标
DimensiongetScreenSize()
得到用户屏幕大小
内容窗格是用来添加组件的,获得内容
窗格的代码如下:
在AWT中可调用add()把组件直接添加
到AWTFrame中,但在Swing中组件只
能添加到内容窗格里
六.显示信息
前面的例子中,信息都显示在控制台窗
口,现在我们试着把信息显示到JFrame中
JFrame的结构有点复杂,它包括:根窗格、
布局窗格、透明窗格和内容窗格
用户也可以创建一个画板,然后在画板上进
行绘制,最后将画板添加到内容窗格里,此
时需要重写paintComponent()
paintComponent(Graphicsg)是定义在
JComponent中,每当该方法被调用时,系统就
自动产生一个Graphics类型的参数,传递给
paintComponent方法中的参数g
Containercp=getContentPane();
Componentc=…;
(c);
Graphics类提供绘制图像和输出文本的方法
创建一个画板
classMyPanelextendsJPanel
{
publicvoidpaintComponent(Graphicsg)
{
(Graphicsg)
(“Hello!world”)
….}}
MyPanel扩展了JPanel,
但面板的背景颜色等工
作要由Jpanel来完成,
确保父类也参预绘制
只要窗口重新绘制,paintComponent()
就被自动调用(在AWT中是paint())
例.在画板上输出信息
classNotHelloWorldFrameextendsJFrame
{publicNotHelloWorldFrame()
{setTitle("NotHelloWorld");
setSize(WIDTH,HEIGHT);
//addpaneltoframe
NotHelloWorldPanelpanel=new
NotHelloWorldPanel();
ContainercontentPane=getContentPane();
(panel);}
classNotHelloWorldPanelextendsJPanel
{
publicvoidpaintComponent(Graphicsg)
{
(g);
("NotaHello,Worldprogram",
MESSAGE_X,MESSAGE_Y);
}
publicstaticfinalintMESSAGE_X=75;
publicstaticfinalintMESSAGE_Y=100;
}
常用API
ContainergetContentPane()
返回JFrame的内容窗格
voidrepain()重新绘制组件
voidrepaint(intx,
inty,intwidth,intheight)
重新绘制组件的一部分
voidpaintComponent(Graphicsg)
需要重写该方法来说明你的组件应如何绘制
一.2D图形
随着,J2SE包含了一
个Java2D库,该库实现了一个非常强大
的图形操作集
如何获得Graphics2D类对象
该类是Graphics类的子类,通常可用
Graphics对象转换而来.例:
publicvoidpaintComponent(Graphicsg)
{graphics2Dg2=(graphics2D)g;
…..
}
JDK
java2D形体使用浮点数坐标系,这样可为
坐标指定单位。
存在的问题:Retangle2Dr=……….;
floatf=();/*Error*/
getWidth()返回double值,应进行转换:
floatf=(float)();
例:
因此,2D库的形体类有两种版本:
classDrawPanelextendsJPanel
{publicvoidpaintComponent(Graphicsg)
{(g);
Graphics2Dg2=(Graphics2D)g;
//drawarectangle
doubleleftX=100;
doubletopY=100;
doublewidth=200;
doubleheight=150;
Rectangle2Drect=new(leftX,topY,
width,height);
(rect);
//drawtheenclosedellipse
Ellipse2Dellipse=new();
(rect);
(ellipse);
//drawadiagonalline
(new(leftX,topY,
leftX+width,topY+height));
//drawacirclewiththesamecenter
doublecenterX=();
doublecenterY=();
doubleradius=150;
Ellipse2Dcircle=new();
(centerX,centerY,
centerX+radius,centerY+radius);
(circle);
}
}
API
(floatx,floaty,float
width,floatheight)
(doublex,doubley,
doublewidth,doubleheight)
(doublex,doubley,
doublewidth,doubleheight)
(Point2Dstart,Point2Dend)
(doublestartx,doublestarty,
doubleendx,doubleendy)
(doublex,doubley)
fill(Graphics2Drec)填充颜色
drawGraphics2Drec)绘制图形rec
二.颜色
Graphics2D类的setPaint方法(Graphics
类为setColor方法)用来设置颜色。例:
();
(“SetColor”,100,100)
black、blue、cyan、darkgray、gray、
green、lightgray、magenta、orange、
pink、red、white、yellow
通过指定红绿蓝三色比例,用Color对象来复
合成一种新的颜色。Color构造器如下:
Color(intredness,intgreenness,intblueness)
其中参数取值为0--255
API
voidColor(intr,intg,intb)
例:(newColor(0,128,128));
voidsetcolor(Colorc)
voidsetPaint(paintp)
voidsetBackground(Colorc)
voidsetForeground(Colorc)
例:填充颜色的例子
classFillPanelextendsJPanel
{
publicvoidpaintComponent(Graphicsg)
{
(g);
Graphics2Dg2=(Graphics2D)g;
//drawarectangle
doubleleftX=100;
doubletopY=100;
doublewidth=200;
doubleheight=150;
Rectangle2Drect=new
(leftX,topY,width,height);
();
(rect);
//drawtheenclosedellipse
Ellipse2Dellipse=new();
(rect);
(newColor(0,128,128));
//adullblue-green
(ellipse);
}
}
例:将字符串显示在画板中央的例子
三.文本和字体
SanaSerif
Serif
Monospaced
Dialog
DialogInput
+
Fontserif=new
Font(“Serif”,,14);
(serif);
字符输出的效果取决于下面三个因素:
使用的字体
字符串
绘制字体的设备
几个基本术语:上坡度
下坡度
空行
基线
基线


调用Graphics2D类中的getFontRenderContext
方法,可获得一个FontRenderContext类的对象,把这
个对象传给Fond类的getStringBounds方法,该方法返
回一个包围字符串的矩形.代码如下:
Stringmessage=“Hello,World!”;
Fontf=newFoun(“serif”,,14);
FontRenderContextcontext=
g2.getFontRenderContext();
Retangle2Dbounds=
f.getStringBounds(message,context);
获得字符串宽度、高度、上坡度、下坡
度的方法如下:
doublestringwidth=
();
doublestringheigth=
();
doubleascent=-();
doubledescent=()
+();
基点
将字符串显示在面板中央的代码如下:
Stringmessage=“Hello,World!”;
Fontf=newFoun(“serif”,,14);
FontRenderContextcontext=
g2.getFontRenderContext();
Retangle2Dbounds=
f.getStringBounds(message,context);
doublex=(getWidth()-
bounds.getWidth())/2;
doubley=(getHeigth()-
())/2;
doubleascent=-();
doublebasey=y+ascent;
(message,
(int)x,(int)basey);
例:将字符串显示在画板中央的例子
API:
Font(Stringname,intstyle,intSize)
StringgetFontName()
StringgetFamily()
StringgetName()
Retangle2DgetStringBounds(Strings,
FountRenderContextcontext)
floatgetAscent()
floatgetDecent()
floatgetHeight()
floatgetWeight()
voidsetFont(Fontfont)
voidDrawString(Stringstr,intx,inty)
四.图象---
在Java应用程序中须通过使用Toolkit对
象,调用getDefaultToolkit(),完成将一
个图象文件加载到程序中,再调用
Graphics类提供的DrawImage()显示它。
目前只能读取gif和JPEG格式的文件
下面一段代码用来在本地机上加载一个名
为:
Imageimg=().
getImage(“”)
若从网络上加载,必须提供URL
例:URLu=newURL(

Imageimg=().
getImage(u)
显示代码:
•publicvoidpaintComponent(Graphicsg)
•{….
•(img,x,y,null);
•}
图象的跟踪加载
使用MediaTracker类中的方法addImage()
可以将一个图象的加载过程放入媒体跟
踪器,从而实现对图象加载过程的跟踪
MediaTrackertracker=newMediaTracker();
Imageimg=ToolkitgetDefaultToolkit().
getImage(name);
Intid=1;
(img,id);
Try{(id);}
Catch(InterruptedExceptione){}
API
ToolkitgetDefaultToolkit()
ImagegetImage(Stringfilename)
BooleandrawImage(Imageimg,intx,inty,
ImageObserverobserver)
BooleandrawImage(Imageimg,intx,inty,
intwidth,intheight,ImageObserverobserver)
VoidcopyArea(intx,inty,intwidth,
intheight,intdx,intdy)
voiddispose()
Java
VoidaddImage(Imageimage,intid)
VoidwaitForId(intid)
VoidwaitForAll()
//acquiretheimage
image=
().getImage("");
MediaTrackertracker=newMediaTracker(this);
(image,0);
try{(0);}
catch(InterruptedExceptionexception){}
publicvoidpaintComponent(Graphicsg)
{(g);
intimageWidth=(this);
intimageHeight=(this);
(image,0,0,null);
for(inti=0;i*imageWidth<=getWidth();i++)
for(intj=0;j*imageHeight<=getHeight();j++)
if(i+j>0)
(0,0,imageWidth,imageHeight,
i*imageWidth,j*imageHeight);}
privateImageimage;}
点击复制文档内容
教学课件相关推荐
文库吧 www.wenkub.com
备案图鄂ICP备17016276号-1