




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 图形编程4.1AWT与Swing简介一.AWT工具包java的抽象窗口工具包(AWT:Abstract window Interface)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类基本AWT库处理用户界面元素的方法是把这些元素的创建和行为委托给每个目标平台上的本地GUI工具箱进行处理AWT的层次关系EventComponentGraphicsMenuComponButtonScrollBarContainerCanvasListCheckBoxLabelTextFieldTextAreaWindowFrameDialogFontAppletPanel二. J
2、ava Swing Swing:非基于对等体的GUI工具箱Swing具有更丰富并且更方便的用户界面元素集合Swing对底层平台的依赖更少Swing会带来交叉平台上的统一视觉体验Swing类被放在javax.Swing包上Swing 组件层次关系ComponemtContainerWindowFrameDialogJFrameJDialogJComponentJPanelJLabelJScrollerJMenuBarJButtonJtext.三.AWT与Swing的关系对于使用过Java早期版本的人来说,大部分AWT组件都有其Swing等价物后者的名字一般是在前面添加一个字母“J”,如:JBut
3、ton,JFrame,JPanel等5.2组件和容器一.组件Java把由Component类的子类或间接子类创建的对象称为一个组件例:Button button1=new Button();例:TextField textfield=new TextField();例:Label label=new Label();二.容器Java把由container类的子类或间接子类创建的对象称为一个容器例:Frame fra=new Frame(“这是一个窗口”);Applet是Panel的子类,是Container的间接子类Applet本身也是一个容器三.添加组件Component类提供了一个方法:a
4、dd();例:fra.add(button);例:fra.add(TextField);容器本身也可以看作是一个组件,因此可以把一个容器添加到另一个容器里,实现容器嵌套例:add(fra);四。布局管理器Java 采用非常优秀的概念来进行布局一个容器内的所有组件都由一个布局管理器来进行管理Java支持以下四种布局管理器 FlowLayout BorderLayout CardLayout GridBagLayout五.常用容器1.框架在Java中,顶层窗口(没有包含在另一个窗口内的窗口)称为框架AWT库中有一个基于对等体的Frame类对应着顶层该类的Swing版本为JFrame,JFrame是
5、Frame 子类例:框架是容器的例子 SimpleFrameTest.java import javax.swing.*;public class SimpleFrameTest public static void main(String args) SimpleFrame myframe = new SimpleFrame(); myframe.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); myframe.show(); class SimpleFrame extends JFrame public SimpleFrame() setSi
6、ze(WIDTH, HEIGHT); public static final int WIDTH = 300; public static final int HEIGHT = 200;2.定义相对框架通过调用toolkit来得到系统相关信息例:CenteredFrameTest.java例:获得屏幕尺寸Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize();int screenHeight=screenSize.height;int screenWidth = screenSi
7、ze.width;class CenteredFrame extends JFrame public CenteredFrame() / get screen dimensions Toolkit kit = Toolkit.getDefaultToolkit Toolkit kit = Toolkit.getDefaultToolkit();(); Dimension screenSize = kit.getScreenSize(); Dimension screenSize = kit.getScreenSize(); int screenHeight = screenSize.heigh
8、t; int screenHeight = screenSize.height; int screenWidth = screenSize int screenWidth = screenSize.width;.width; / center frame in screen/ center frame in screen setSize(screenWidth / 2, screenHeight / 2); setSize(screenWidth / 2, screenHeight / 2); setLocation(screenWidth / 4, screenHeight setLocat
9、ion(screenWidth / 4, screenHeight / 4) / 4) / set frame icon and title / set frame icon and title Image img = kit.getImage(icon.gif); Image img = kit.getImage(icon.gif); setIconImage(img); setIconImage(img); setTitle(CenteredFrame setTitle(CenteredFrame);); 3.常见类及方法APIjava.awt.Componentboolean isVis
10、ible()检查组件是否可见void setVisible(boolean b) 设置组件可见void setBounds(int x,int y,int width,int height)移动并缩放组件Dimension getSize()得到组件的大小void setSize(int width,int height)void setSize(Dimension d) 把组件缩放到指定调度和宽度 java.awt.windowvoid toFrond()放在其它窗口前面void toBack()放在其它窗口后面java.awt.Framevoid setResizable(boolean
11、b)缩放框架void setTitle(String s)设置标题void setIconImage(Image image) 将Image用作图标java.awt.Toolkit Dimension getScreenSize()得到用户屏幕大小内容窗格是用来添加组件的,获得内容窗格的代码如下:在AWT中可调用add()把组件直接添加到AWT Frame中 ,但在Swing中组件只能添加到内容窗格里六.显示信息前面的例子中 ,信息都显示在控制台窗口,现在我们试着把信息显示到JFrame中 JFrame的结构有点复杂,它由:根窗格、布局窗格、透明窗格和内容窗格 用户也可以创建一个画板,然后在画
12、板上进行绘制,最后将画板添加到内容窗格里,此时需要重载paintComponent()paintComponent(Graphics g)是定义在JComponent中,每当该方法被调用时,系统就自动产生一个Graphics类型的参数,传递给paintComponent方法中的参数gContainer cp=getContentPane(); Component c=; cp.add(c);Graphics类提供绘制图像和输出文本的方法创建一个画板class MyPanel extends JPanel public void paintComponent(Graphics g) super.
13、paintComponent(Graphics g) g.drawString(“Hello!world”) . MyPanel扩展了扩展了JPanel,但面板的背景但面板的背景颜色等工作要由颜色等工作要由Jpanel来完成,来完成,super.paintComponent确保父类也参预绘制确保父类也参预绘制只要窗口重新绘制,paintComponent()就被自动调用(在AWT中上paint()例.在画板上输出信息NotHelloWorld.javaclass NotHelloWorldFrame extends JFrameclass NotHelloWorldFrame extends
14、JFrame public NotHelloWorldFrame public NotHelloWorldFrame()() setTitle(NotHelloWorld setTitle(NotHelloWorld); ); setSize setSize(WIDTH, HEIGHT);(WIDTH, HEIGHT); / add panel to frame / add panel to frame NotHelloWorldPanelNotHelloWorldPanel panel = new panel = new NotHelloWorldPanel NotHelloWorldPan
15、el();(); Container contentPane = getContentPane(); Container contentPane = getContentPane(); contentPane contentPane.add(panel); .add(panel); class NotHelloWorldPanel extends JPanel class NotHelloWorldPanel extends JPanel public void paintComponent public void paintComponent(Graphics g)(Graphics g)
16、super.paintComponent super.paintComponent(g);(g); g.drawString g.drawString(Not a Hello, World program, (Not a Hello, World program, MESSAGE_X, MESSAGE_Y); MESSAGE_X, MESSAGE_Y); public static final int public static final int MESSAGE_X = 75; MESSAGE_X = 75; public public static final intstatic fina
17、l int MESSAGE_Y = 100; MESSAGE_Y = 100;常用APIjavax.swing.JFrameContainer getContentPane() 返回JFrame的内容窗格java.awt.Component void repain() 重新绘制组件void repaint(int x, int y,intwidth,int height) 重新绘制组件的一部分javax.swing.Jcomponentvoid paintComponent(Graphics g)需要重载该方法来说明你的组件应如何绘制5.3图形编程一. 2D图形 1.2D对象 随着SDK2.0
18、版的到来,J2SE了包含一个Java 2D库,该库实现了一个非常强大的图形操作集如何获得Graphics 2D类对象该类是Graphics类的子类,通常可用Graphics对象转换而来.例:public void paintComponent(Graphics g) graphics2D g2=(graphics 2D)g; . 2.坐标 JDK 1.0版中使用整数像素坐标系java 2D形体使用浮点数坐标系,这样可为坐标指定单位。存在的问题:Retangle2D r=.; float f=r.getWidth();/*Error*/getWidth()返回double值,应进行转换: flo
19、at f=(float)r.getWidth();例:DrwaTest.java因此,2D库的形体类有两种版本: Retangle2D.Float Retangle2D.Doubleclass DrawPanel extends JPanel public void paintComponent(Graphics g) super.paintComponent(g); Graphics2D g2 = (Graphics2D)g;/ draw a rectangle double leftX = 100; double topY = 100; double width = 200; double
20、 height = 150; Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height); g2.draw(rect); / draw the enclosed ellipse Ellipse2D ellipse = new Ellipse2D.Double(); ellipse.setFrame(rect); g2.draw(ellipse);/ draw a diagonal line g2.draw(new Line2D.Double(leftX, topY, leftX + width, topY + he
21、ight); / draw a circle with the same center double centerX = rect.getCenterX(); double centerY = rect.getCenterY(); double radius = 150; Ellipse2D circle = new Ellipse2D.Double(); circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius); g2.draw(circle); 3.常用APIjava.awt.geom.R
22、etangle2D.DoubleRetangle2D.Float(float x,float y,float width, float height) Ellipse2D.Double(double x,double y, double width,double height)java.awt.geom.Ellipse2D.DoubleRetangle2D.Double(double x,double y, double width,double height)java.awt.geom.Retangle2D.Floatjava.awt.geom.Line2D.DoubleLine2D.dou
23、ble(Point2D start,Point2D end)Line2D.double(double startx,double starty, double endx,double endy)java.awt.geom.Point2D.DoublePoint2D.Double(double x,double y)fill(Graphics2D rec) 填充颜色drawGraphics2D rec) 绘制图形rec二.颜色Graphics2D类的setPaint方法(Graphics类为setColor方法)用来设置颜色。例: g2.setPaint(Color.red); g2.drawS
24、tring(“Set Color”,100,100)1.标准颜色black、blue、cyan、darkgray、gray、green、lightgray、magenta、orange、pink、red、white、yellow2.复合色通过指定红绿蓝三色比例,用Color对象来复合成一种新的颜色。Color构造器如下:Color(int redness,int greenness,int blueness) 其中参数取值为0-2553.常用APIjava.awt.Colorvoid Color(int r,int g,int b)例:g.setPaint(new Color(0,128,12
25、8); java.awt.Graphicsvoid setcolor(Color c)java.awt.Graphic2Dvoid setPaint(paint p) java.awt.Cmponentvoid setBackground(Color c)void setForeground(Color c)例:填充颜色的例子FillTest.javaclass FillPanel extends JPanelclass FillPanel extends JPanel public void paintComponent public void paintComponent(Graphics
26、 g)(Graphics g) super.paintComponent super.paintComponent(g);(g); Graphics2D g2 = (Graphics2D)g; Graphics2D g2 = (Graphics2D)g; / draw a rectangle / draw a rectangle double leftX double leftX = 100; = 100; double topY double topY = 100; = 100; double width = 200; double width = 200; double height =
27、150; double height = 150; Rectangle2D rect Rectangle2D rect = new Rectangle2D.Double = new Rectangle2D.Double (leftX, topY (leftX, topY,width, height);,width, height); g2. g2.setPaintsetPaint(Color.red)(Color.red); ; g2. g2.fillfill(rect(rect);); / draw the enclosed ellipse / draw the enclosed ellip
28、se Ellipse2D ellipse = new Ellipse2D.Double(); Ellipse2D ellipse = new Ellipse2D.Double(); ellipse.setFrame(rect ellipse.setFrame(rect);); g2. g2.setPaintsetPaint(new Color(0, 128, 128);(new Color(0, 128, 128); / a dull blue-green / a dull blue-green g2. g2.fillfill(ellipse);(ellipse); 三.文本和字体1.五个逻辑
29、字体名SanaSerifSerifMonospacedDialogDialogInput2.字体风格Font.PLAIN Font.BOLDFond.ITALIC Fond.BOLD+Font.ITALIC 3.设置字体Font serif=new Font(“Serif”,Font.BOLD,14);g2.setFont(serif);4.编程控制字体字符输出的效果取决于下面三个因素: 使用的字体 字符串 绘制字体的设备几个基本术语: 上坡度下坡度空行 基线基线高度 调用Graphics2D类中的getFontRenderContext方法,可获得一个FontRenderContext类的对
30、象,再调用Fond类的getStringBounds方法,该方法返回一个包围字符串的矩形.代码如下:String message=“Hello,World!”;Font f=new Foun(“serif”,Font.BOLD,14);FontRenderContext context= g2. getFontRenderContext();Retangle2D bounds= f. getStringBounds(message,context);获得字符串宽度、高度、上坡度、下坡度的方法如下:double stringwidth= bounds.getWidth();double stri
31、ngheigth= bounds.getHeigth();double ascent= - bounds.getY();double descent= bounds.getHeigth() +bounds.getY();基点将字符串显示在面板中央的代码如下:String message=“Hello,World!”;Font f=new Foun(“serif”,Font.BOLD,14);FontRenderContext context= g2. getFontRenderContext();Retangle2D bounds= f. getStringBounds(message,con
32、text);double x=(getWidth()- bounds. getWidth()/2;double y=(getHeigth()- bounds.getWidth()/2;double ascent= - bounds.getY();double basey=y+ascent;g2.drawString(message, (int)x,(int)basey);例:将字符串显示在画板中央的例子 FontTest.javaAPI:java.awt.Font Font(String name,int style,int Size)String getFontName()String ge
33、tFamily()String getName()Retangle2D getStringBounds(String s, FountRenderContext context)java.awt.font.LineMetricsfloat getAscent()float getDecent()float getHeight()float getWeight()java.awt.Graphicsvoid setFont(Font font)void DrawString(String str,int x,int y)四.图象在Java应用程序中须通过使用Toolkit对象,调用getDefau
34、ltToolkit(),完成将一个图象文件加载到程序中,再调用Graphics类提供的DrawImage()显示它。目前只能读取gif和JPEG格式的文件下面一段代码用来在本地机上加载一个名为 msn.jpg的文件:Image img=ToolkitgetDefaultToolkit(). getImage(“msn.jpg”)若从网络上加载,必须提供URL例:URL u=new URL( “http:/ img=ToolkitgetDefaultToolkit(). getImage(u)显示代码: public void paintComponent(Graphics g) . g.drawImage(img,x,y,null); 图象的跟踪加载使用MediaTracker类中的方法addImage()可以将一个图象的加载过程放入媒体跟踪器,从而实现对图象加载过程的跟踪MediaTracker tracker=new MediaTracker(); Image img=ToolkitgetDefaultToolkit(). get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 乡村振兴人才培育体系构建与政策支持研究报告
- 医疗器械临床试验质量管理规范化与临床试验研究设计优化策略
- 提高技巧软件设计师考试试题及答案
- 2025年文化旅游融合发展示范区建设资金申请项目投资收益预测报告
- 西方政治制度与创新政策的互动性研究试题及答案
- 深度解读2025年西方政治试题及答案
- 软件测试团队协作的最佳实践试题及答案
- 2025年电动汽车电池热管理技术标准与认证研究报告
- 精准复习2025年机电工程考试试题及答案
- 软考网络工程师复习攻略试题及答案
- 恒生笔试题及答案
- 找人办事花钱协议书
- 2024-2025学年青岛版(五四学制)小学数学二年级下册(全册)知识点复习要点归纳
- 人工智能训练师(三级)职业技能鉴定理论考试题(附答案)
- 职业技术学院装配式建筑工程技术专业人才培养方案(2024版)
- 学校学生食品安全培训课件
- 设计图学知到智慧树期末考试答案题库2025年华东理工大学
- 空气动力学试题及答案
- 绿色政治经济学-环境治理中的经济选择-全面剖析
- 直播带货股份协议合同
- 2025-2030中国毫米波治疗仪行业市场发展趋势与前景展望战略研究报告
评论
0/150
提交评论