SUN-JAVA-培训专用教材c.doc

上传人:wux****ua 文档编号:8998022 上传时间:2020-04-02 格式:DOC 页数:98 大小:1,014KB
返回 下载 相关 举报
SUN-JAVA-培训专用教材c.doc_第1页
第1页 / 共98页
SUN-JAVA-培训专用教材c.doc_第2页
第2页 / 共98页
SUN-JAVA-培训专用教材c.doc_第3页
第3页 / 共98页
点击查看更多>>
资源描述
Java基础类 JDK1.2提供了Java基础类,其中的一部分就是Swing。Swing是构筑在AWT上层的一些组件的集合(为了保证平台独立性,它是用100%的纯Java编写)。本模块介绍了JFC和Swing图形用户界面的实现。第一节 相关问题 讨论以下为与本模块内容有关的问题:l AWT本身是非常有用的,它是一个新的类集合的一部分。这个新的类集合称为Java基础类(JFC),它作为一个整体,将GUI提升到了一个新的水平层次。JFC究竟是什么,特别地,什么是Swing?什么事Swing可以做但AWT不能?第二节 目 标 在完成了本模块的学习后,你应当能够:l 认识Java基础类的关键特性l 描述com.sun.java.swing包的关键特性l 认识Swing组件l 定义容器和组件,并解释如何联合使用它们来构造一个Swing GUIl 编写,编译并运行一个基本的Swing应用程序l 高效地使用诸如Jframe和Japplet等顶层容器参考文献 以下参考文献可提供有关本模块论题的其他细节内容:l The Java Tutorial,这是Sun Microsystems的一本在线教材,可以从http:/java.sun.com/docs/books/tutorial得到。第三节 介 绍介绍l Java基础类包含5个APIl AWTl Java2Dl Accessibilityl Drag & Dropl Swing Java基础类是关于GUI组件和服务的完整集合,它大大简化了健壮Java应用程序的开发和实现。 JFC,作为JDK1.2的一个有机部分,主要包含5个API:AWT,Java2D,Accessibility,Drag & Drop,Swing。它提供了帮助开发人员设计复杂应用程序的一整套应用程序开发包。 正如前面那些模块中所讨论的那样,AWT组件为各类Java应用程序提供了多种GUI工具。 Java2D是一图形API,它为Java应用程序提供了一套高级的有关二维(2D)图形图像处理的类。Java2D API扩展了java.awt和java.awt. image类,并提供了丰富的绘图风格,定义复杂图形的机制和精心调节绘制过程的方法和类。这些API使得独立于平台的图形应用程序的开发更加简便。 Accessibility API提供了一套高级工具,用以辅助开发使用非传统输入和输出的应用程序。它提供了一个辅助的技术接口,如:屏幕阅读器,屏幕放大器,听觉文本阅读器(语音处理)等等。 Drag & Drop技术提供了Java和本地应用程序之间的互操作性,用来在Java应用程序和不支持Java技术的应用程序之间交换数据。 JFC模块的重点在Swing。Swing用来进行基于窗口的应用程序开发,它提供了一套丰富的组件和工作框架,以指定GUI如何独立于平台地展现其视觉效果。11.3.1 Swing介绍Swing介绍l 可插的外观和感觉l 应用程序看上去是与平台有关的l 有客户化的Swing组件l Swing的体系结构l 它是围绕着实现AWT各个部分的API构筑的l 大多数组件不象AWT那样使用与平台相关的实现 Swing提供了一整套GUI组件,为了保证可移植性,它是完全用Java语言编写的。可插的外观和感觉 可插的外观和感觉使得开发人员可以构建这样的应用程序:它们可以在任何平台上执行,而且看上去就象是专门为那个特定的平台而开发的。一个在Windows环境中执行的程序,似乎是专为这个环境而开发的;而同样的程序在Unix平台上执行,它的行为又似乎是专为Unix环境开发的。 开发人员可以创建自己的客户化Swing组件,带有他们想设计出的任何外观和感觉。这增加了用于跨平台应用程序和Applet的可靠性和一致性。一个完整应用程序的GUI可以在运行时刻从一种外观和感觉切换到另一种。Swing的体系结构 与AWT比较,Swing提供了更完整的组件,引入了许多新的特性和能力。Swing API是围绕着实现AWT各个部分的API构筑的。这保证了所有早期的AWT组件仍然可以使用。AWT采用了与特定平台相关的实现,而绝大多数Swing组件却不是这样做的,因此Swing的外观和感觉是可客户化和可插的。 上图显示了JFC各个部分之间的相互关系。Java2D,Accessibility,Drag & Drop,和Accessibility API是AWT和JFC的一部分,但它们不属于Swing。这是因为,这些组件使用了一些本地代码,而Swing却不是这样的。 Swing是围绕着一个称为JComponent的新组件构建的,而JComponent则由AWT的容器类扩展而来。Swing的层次结构下图说明了Swing组件的层次结构: Swing GUI使用两种类型的类,即GUI类和非GUI支持类。GUI类是可视的,它从JComponent继承而来,因此称为“J”类。非GUI类为GUI类提供服务,并执行关键功能;因此它们不产生任何可视的输出。注Swing的事件处理类是非GUI类的一例。Swing组件 Swing组件主要为文本处理、按钮、标签、列表、pane、组合框、滚动条、滚动pane、菜单、表格和树提供了组件。其中一些组件如下所示: JApplet JButton JComboBox JOptionPane JList JLabelSwing组件(续) JScrollPaneJTable JScrollBar JSlider JTooltipJTree第四节 基本的Swing应用程序HelloSwing应用程序的输出产生下图所示的窗口: 每次用户点击按钮时,标签就会更新。11.5.1 HelloSwing 1.import java.awt.*; 2.import java.awt.event.*; 3.import com.sun.java.swing.*; 4.import java.awt.accessibility.*; 5. 6.public class HelloSwing implements ActionListener 7.private JFrame jFrame; 8.private JLabel jLabel; 9.private JPanel jPanel; 10.private JButton jButton; 11.private AccessibleContext accContext; 12. 13.private String labelPrefix = 14.Number of button clicks: ; 15.private int numClicks = 0; 16. 17.public void go() 18. 19./ Here is how you can set up a particular 20./ lookAndFeel. Not necessary for default. 21./ 22./ try 23./ UIManager.setLookAndFeel( 24./ UIManager.getLookAndFeel(); 25./ catch (UnsupportedLookAndFeelException e) 26./ System.err.println(Couldnt use the + 27./ default look and feel + e); 28./ 29. 30.jFrame = new JFrame(HelloSwing); 31.jLabel = new JLabel(labelPrefix + 0); 32. 33.jButton = new JButton(I am a Swing button!); 34. 35./ Create a shortcut: make ALT-A be equivalent 36./ to pressing mouse over button. 37.jButton.setMnemonic(i); 38. 39.jButton.addActionListener(this); 40.HelloSwing(续) 1./ Add support for accessibility. 2.accContext = jButton.getAccessibleContext(); 3.accContext.setAccessibleDescription( 4.Pressing this button increments + 5.the number of button clicks); 6. 7./ Set up pane. 8./ Give it a border around the edges. 9.jPanel = new JPanel(); 10.jPanel.setBorder( 11.BorderFactory.createEmptyBorder( 12.30,30,10,30); 13. 14./ Arrange for compts to be in a single column. 15.jPanel.setLayout(new GridLayout(0, 1); 16. 17./ Put compts in pane, not in JFrame directly. 18.jPanel.add(jButton); 19.jPanel.add(jLabel); 20.jFrame.setContentPane(jPanel); 21. 22./ Set up a WindowListener inner class to handle 23./ windows quit button. 24.WindowListener wl = new WindowAdapter() 25.public void windowClosing(WindowEvent e) 26.System.exit(0); 27. 28.; 29.jFrame.addWindowListener(wl); 30. 31.jFrame.pack(); 32.jFrame.setVisible(true); 33. 34.HelloSwing(续) 1./ Button handling. 2.public void actionPerformed(ActionEvent e) 3.numClicks+; 4.jLabel.setText(labelPrefix + numClicks); 5. 6. 7.public static void main(String args) 8. 9.HelloSwing helloSwing = new HelloSwing(); 10.helloSwing.go(); 11. 12.11.4.2 导入Swing包l 导入Swing包l 选择外观和感觉l getLookAndFeel()l 设置窗口容器l JFrame与Frame相似l 你不能直接将组件加入到JFrame中l 一个content pane包含了除菜单条外所有Frame的可视组件 语句行import com.sun.java.swing.*装入整个Swing包,它包括了标准Swing组件和功能。选择外观和感觉 Hello Swing的第2228行给定了应用程序外观和感觉的格式。getLookAndFeel()方法返回在Windows环境中的外观和感觉。在运行Solaris操作系统的机器上,这个方法则返回一个公共桌面环境(CDE)/Motif的外观和感觉。因为都是缺省值,所以对本例来说,这些行都不是必需的。11.4.3 建立窗口 Swing程序用JFrame对象实现了它们的窗口。JFrame类是AWT Frame类的一个子类。它还加入了一些Swing所独有的特性。Hello Swing中,处理JFrame的代码如下:public HelloSwing() JFrame jFrame;JPanel jPanel; .jFrame = new JFrame(HelloSwing); jPanel = new JPanel(); . jFrame.setContentPane(jPanel); 这段代码与使用Frame的代码十分相似。唯一的区别在于,你不能将组件加入到JFrame中。你可以或者将组件加入到JFrame的content pane中,或者提供一个新的content pane。 一个content pane是一个包含除菜单条(如果有的话)外所有框架的可视组件的容器。要获得一个JFrame的content pane,可使用getContentPane()方法。要设置它的content pane(如前面本例所示),则可使用set ContentPane()方法。11.4.4 建立Swing组件Swing应用程序基础l 建立Swing组件l Hello Swing.java示例实例化了4个Swing组件,这4个组件是:JFrame,JButton,JLabel和JPanell 支持辅助技术l Hello Swing.java示例代码支持辅助技术accContext = jButton.getAccessibleContext(); accContext.setAccessibleDescription(Pressing this button increments + the number of button clicks.); Hello Swing程序显式地实例化了4个组件:JFrame,JButton,JLabel和JPanel。Hello Swing用第3345行中的代码来初始化JButton。 第33行创建了按钮。第37行将ACTI键组合设置为快捷键,用来模拟按钮的点击。第39行为点击注册了一个事件处理器。第4145行描述了一个按钮,使得辅助技术可以提供有关按钮功能的信息。 第4959行初始化了JPanel。这些代码创建了JPanel对象,设置它的边框,并将它的布局管理器设置为单列地放置panel的内容。最后,将一个按钮和一个标签加入到Panel中。Hello Swing中的Panel使用了一个不可见的边框,用来在它周围放入额外的填充。11.4.5 支持辅助技术 Hello Swing.java中唯一支持辅助技术的代码是:accContext = jButton.getAccessibleContext();accContext.setAccessibleDescription(Pressing this button increments + the number of button clicks.); 下列信息集也可由辅助技术使用:jButton = new JButton(Im a Swing button!);jLabel = new JLabel(labelPrefix + 0); jLabel.setText(labelPrefix + numClicks); 在JFrame,JButton,JLabel和其他所有组件中,都有内建的Accessibility支持。辅助技术可以很容易地获得文本,甚至与一组件某特定部分相关的文本。第五节 构造一个Swing GUI构造一个Swing GUIl 顶层容器(JFrame,JApplet,JDialog,和JWindow)l 轻质组件(如JButton,JPanel和JMenu)l 将Swing组件加入到与顶层容器相关联的content pane中。 Swing包定义了两种类型的组件:l 顶层容器(JFrame,JApplet,JWindow,和JDialog)l 轻质组件(其他的J,如JButton,JPanel和JMenu) 顶层容器定义了可以包含轻质组件的框架。特别地,一个顶层Swing容器提供了一个区域,轻质组件可在这个区域中绘制自身。顶层容器是它们对应的重质AWT组件的Swing子类。这些Swing容器依靠它们的AWT超类的本地方法与硬件进行适当的交互。 通常,每个Swing组件在其容器层次结构中都应当有一个位于组件上面的顶层Swing容器。例如,每个包含Swing组件的Applet都应作为JApplet(而它自身又是java.applet.Applet的一个子类)的子类来实现。相似地,每个包含Swing组件的主窗口都应用JFrame来实现。典型地,如果你在使用Swing组件,你将只能使用Swing组件和Swing容器。 Swing组件可以加入到一个与顶层容器关联的content pane中,但绝不能直接加入到顶层容器中。content pane是一个轻质Swing组件,如JPanel。 下面是一个典型Swing程序的GUI容器层次结构图,这个程序实现了一个包含2个按钮,一个文本域和一个列表:Jframe ( a top-level Swing container)x xcontent pane x+-+-+x xxJButton JButton JPanelx+-+x xJTextField JList 下面是关于同样的GUI的另一个容器层次结构,只是在这里,GUI是在浏览器中运行的一个Applet。 x x JApplet ( a top-level Swing container) xcontent pane x+-+-+x xxJButton JButton JPanelx+-+x xJTextField JList 下面是构造如上图所示的GUI层次结构的代码: 1.import com.sun.java.swing.*; 2.import java.awt.*; 3. 4.public class SwingGUI 5. 6.JFrame topLevel; 7.JPanel jPanel; 8.JTextField jTextField; 9.JList jList; 10. 11.JButton b1; 12.JButton b2; 13.Container contentPane; 14. 15.Object listData = 16.new String(First selection), 17.new String(Second selection), 18.new String(Third selection) 19.; 20. 21.public static void main (String args) 22.SwingGUI swingGUI = new SwingGUI(); 23.swingGUI.go(); 24. 25. 26.public void go() 27.topLevel = new JFrame(Swing GUI); 28. 29./ Set up the JPanel, which contains the text field 30./ and list. 31.jPanel = new JPanel(); 32.jTextField = new JTextField(20); 33.jList = new JList(listData); 34. 35.contentPane = topLevel.getContentPane(); 36.contentPane.setLayout(new BorderLayout(); 37. 38.b1 = new JButton(1); 39.b2 = new JButton(2); 40.contentPane.add(b1, BorderLayout.NORTH); 41.contentPane.add(b2, BorderLayout.SOUTH); 42. 43.jPanel.setLayout(new FlowLayout(); 44.jPanel.add(jTextField); 45.jPanel.add(jList); 46.contentPane.add(jPanel, BorderLayout.CENTER); 47. 48.topLevel.pack(); 49.topLevel.setVisible(true); 50. 51.第六节 JComponent类JComponent类l Swing组件是JComponent的子类l 边框l 双缓冲l 提示框l 键盘导航l 应用程序范围的可插式外观和感觉 所有Swing都作为JComponent的子类来实现,而JComponent类又是从Container类继承而来。Swing组件从JComponent继承了如下功能:l 边框你可以用setBorder()方法来指定在组件周围显示的边框。还可用一个EmptyBorder的实例来指定一个组件在其周围留有一定的额外空间。l 双缓冲双缓冲可以改善一个频繁被改变的组件的外观。现在你不需要编写双缓冲代码Swing已为你提供了。缺省情况下,Swing组件是双缓冲的。l 提示框通过用setToolTipText()方法来指定一个字符串,你可以提供给用户有关某个组件的帮助信息。当光标暂停在组件上时,所指定的字符串就会在组件附近的一个小窗口中显示出来。l 键盘导航使用registerKeyboardAction()方法,你可以让用户以键盘代替鼠标来操作GUI。用户为启动一个动作所必须按下的修饰键与字符的组合,由一个KeyStroke对象来表示。l 应用程序范围的可插式外观和感觉每个Java应用程序在运行时刻有一个GUIManager对象,它用于确定运行时刻Swing组件的外观和感觉。由于安全性的限制,你可以通过调用UIManager.setLookAndFeel()方法选择所有Swing组件的外观和感觉。在你所看见的东西背后,每个JComponent对象都有一个对应的ComponentGUI对象,它用来执行所有关于该JComponent的绘制、事件处理、大小判定等任务。练习:熟悉Swing 练习目标在本实验中,你将编写、编译和执行两个在GUI中使用Swing组件的程序。一、准备 为了更好地完成这个练习,你必须理解Swing组件和AWT组件的关系。二、任务水平1:创建一个基本的Swing应用程序1. 使用文本编辑器,创建一个与前面所讨论的HelloSwing类似的应用程序。2. 将一个图标与按钮相关联。(提示你可能需要使用ImageIcon类。)3. 将一个提示框与按钮相关联,这样当鼠标移动到按钮之上时,会显示一个“JFC Button”的提示框。水平2:用Swing组件创建一个文本编辑器1. 创建一个初始的JFrame,它包含一个JToolBar,TextArea和JLabel。2. 将一个JMenuBar与JFrame关联起来。3. 创建JMenuBar上的第一个菜单。创建一个标记为JMenu,其JMenuItems包括New,Open,Save和Close。4. 为每个条目增加一个加速键。使用标签的第一个字母。5. 为每个JMenuItem创建一个匿名的ActionListener,用来处理事件并调用与每个事件对应的方法。6. 将带有About JMenuItem的HelpJMenu加入到JMenuBar。分别为H和A增加快捷键。7. 在与About JMenuItem相关联的事件处理器中创建一个模式对话框。8. 在工具条上创建4个JButton,标为New,Open,Save和About。9. 为工具条上的每个按钮增加一个带有适当消息的提示框。此外,创建一个匿名ActionListener来处理适当的事件。10. 保存并编译程序。三、练习小结讨论 花几分钟时间讨论一下,在本实验练习过程中你都经历、提出和发现了什么。l 经验l 解释l 总结l 应用四、检查你的进度在进入下一个模块的学习之前,请确认你能够:l 认识Java基础类的关键特性l 描述com.sun.java.swing包的关键特性l 认识Swing组件l 定义容器和组件,并解释如何联合使用它们来构造一个Swing GUIl 编写,编译并运行一个基本的Swing应用程序l 高效地使用诸如JFrame和JApplet等顶层容器五、思考题你现在已经知道了如何编写GUI应用程序。假设你想在一个Web浏览器中运行一个GUI应用程序,如何做到这点?第11章 Jvav小程序介绍本模块讨论了JDK对Applet的支持,以及Applet在编程方式、操作上下文和如何开始等方面与应用程序的区别。第一节 相关问题讨论 以下为与本模块内容有关的问题:l Applet有那些优点?第二节 目 标在完成了本模块的学习后,你应当能够:l 区分独立应用程序和Appletl 编写一个HTML标记来调用Java Appletl 描述Applet和AWT的类层次l 创建HelloWorld.Java Appletl 列出Applet的主要方法l 描述和使用AWT的绘图模型l 使用Applet方法从URL读取图像和文件l 使用标记配置Applet第三节 什么是Applet?什么是Applet?l 能嵌入到一个HTML页面中且可通过Web浏览器下载和执行的一种Java类l 可以以下方式装载:l 浏览器装载URLl 浏览器装载HTML文档l 浏览器装载Applet类l 浏览器运行AppletApplet是能够嵌入到一个HTML页面中,且可通过Web浏览器下载和执行的一种Java类。它是Java技术容器(container)的一种特定类型,其执行方式不同于应用程序。一个应用程序是从它的main()方法被调用开始的,而一个Applet的生命周期在一定程度上则要复杂得多。本模块分析了Applet如何运行,如何被装载到浏览器中,以及它是如何编写的。12.3.1 装入Applet由于Applet在Web浏览器环境中运行,所以它并不直接由键入的一个命令启动。你必须要创建一个HTML文件来告诉浏览器需装载什么以及如何运行它。1. 浏览器装入URL2. 浏览器装入HTML文档3. 浏览器装入Applet类4. 浏览器运行Applet12.3.2 Applet的安全限制Applet的安全限制l 多数浏览器禁止以下操作:l 运行时执行另一程序l 任何文件的输入/输出l 调用任何本地方法l 尝试打开除提供Applet的主机之外的任何系统的Socket由于通过网络装载,Applet的代码具有一种内在的危险性。如果有人编写了一个恶意的类来读取你的密码文件,并把它通过Internet传送,会产生怎样的后果呢?所能够控制的安全程度是在浏览器层次上实现的。大多数浏览器(包括Netscape Nevigator)缺省地禁止以下操作:l 运行时执行另一程序l 任何文件的输入/输出l 调用任何本地方法l 尝试打开除提供Applet的主机之外的任何系统的Socket这些限制的关键在于,通过限制Applet对系统文件的存取来阻止它侵犯一个远程系统的隐私或破坏该系统。禁止执行另一程序和不允许调用本地方法限制了Applet启动未经JVM检查的代码。对Socket的限制则禁止了与另一个可能有危害性的程序的通信。JDK1.2提供了一种方式,它指定了一个特殊的“保护域”或一个特殊Applet运行的安全性环境。远程系统检查原始的URL以及它下载的Applet的签名,和一个含有从特殊的Applet到特殊保护域的映射入口的本地文件进行比较。因此,来自特别位置的特殊Applet具有一些运行特权。第四节 编写一个Applet要编写一个Applet,必须首先用以下方式创建一个类:import java.applet.*;public class HelloWorld extends Applet Applet的类必须为public,且它的名称必须与它所在的文件名匹配;在这里,就是HelloWorld.java。而且,该类必须为java.applet.Applet的子类。Applet类的层次Java.applet.Applet类实际上是java.awt.Panel的子类。Applet和AWT类的层次如下: 这种层次关系显示,一个Applet可直接用作一个AWT布局的起始点。因为Applet为一Panel,所以它有一个缺省的流(flow)布局管理器。Component,Container和Panel类的方法被Applet类继承了下来。12.4.1 主要的Applet方法主要的Applet方法l init()l start()l stop()l destroy()l paint()在一个应用程序中,程序由main()方法处进入,而在一个Applet中却不是这样。在构造函数完成了它的任务后,浏览器调用init()对Applet进行基本的初始化操作。init()结束后,浏览器调用另一个称为start()的方法。本模块稍后将对start()做更细致的剖析;start()通常在Applet成为可见时被调用。方法init()和start()都是在Applet成为“活动的”之前运行完成的,正因为这样,它们都不能用来编写Applet中继续下去的动作。实际上,与一个简单应用程序中的方法main()不同的是,没有什么方法的执行是贯穿于Applet的整个生命过程中的。你在后面将看到如何使用线程来实现这一特色。此外,你在编写Applet子类时可用的方法还有:stop(),destroy()和paint()。12.4.2 Applet显示Applet显示l Applet在本质上是图形方式的l 方法paint()由浏览器环境调用Applet本质上是图形方式的,所以尽管你可以提出System.out.println()的调用请求,通常也不能这样做,而是应该在图形环境中创建你的显示。你可以通过创建一个paint()方法在Applet的panel上绘图。只要Applet的显示需要刷新,paint()方法就会被浏览器环境调用。例如,当浏览器窗口被最小化或被要求以图标方式显示时,这种调用就会发生。你应该编写自己的paint()方法,以使它在任何时候被调用时都能正常地工作。对它的调用是异步产生的,且由环境而不是程序来驱动。12.4.3 paint()方法和图形对象paint()方法带有一个参数,它是java.awt.Graphics类的一个实例。这个参数总是建立该Applet的panel的图形上下文。你能用这个上下文在你的Applet中绘图或写入文本。下面是使用paint()方法写出文字的一例。 1.import java.awt.*; 2.import java.applet.*; 3. 4.public class HelloWorld extends Applet 5. 6.public void paint(Graphics g) 7.g.drawString(Hello World!, 25, 25); 8. 9.注drawString方法的数字型参数为文本起始处的x和y的象素坐标。(0,0)表示左上角。这些坐标是针对字体的基线来讲的,所以在y坐标为0处写的结果是:文字的大部分在显示器顶部的上方,只有象字母y尾部那样的下面部分是可见的。第五节Applet的方法和Applet的生命周期Applet的方法和Applet的生命周期l init()l 在Applet创建时被调用l 可用于初始化数据值l start()l 当Applet成为可见时运行l stop()l 当Applet成为不可见时运行Applet的生命周期比所讨论的要稍微复杂一些。与其生命周期相关的有三个主要方法:init(),start()和stop()。12.5.1 init()本成员函数在Applet被创建并装入一个能支持Java技术的浏览器(如appletviewer)时被调用。Applet可用这个方法来初始化数据的值。本方法只在Applet首次装入时被调用,并且在调用start()之前执行完成。12.5.2 start()init()方法一完成,start()就开始执行。它的执行使得Applet成为“活动”的。无论Applet何时成为可见的,它同样要执行一次,如:当浏览器在被图标化后又恢复时,或者当浏览器在链接到另一个URL后又返回含有这个Applet的页面时。这一方法的典型用法是启动动画和播放声音。 1.public void start() 2.musicClip.play(); 3.12.5.3 stop()stop()方法是在Applet成为不可见时被调用的,这种情况一般在浏览器被图标化或链接到另一个URL时会出现。Applet用该方法使动画停止。 1.public void stop() 2.musicClip.stop(); 3. start()和stop()形成一对动作:典型地,start()激活Applet中的某一行为,而stop()则可将它禁止。第六节 AWT绘图AWT绘图l paint (Graphics g)l repaint()l update(Graphics g)除了基本的生命周期外,Applet还有与其显示有关的一些重要的方法。这些方法的声明和文档在AWT组件类中。使用AWT做显示处理时遵循正确的模型是非常重要的。更新显示由一种被称为AWT线程的独立的线程来完成。这个线程可用来处理与显示更新相关的两种情况。第一种情况是显露(exposure),它或在首次显示时,或在部分显示已被破坏而必须刷新时出现。显示的破坏可能发生在任何时刻,因此,你的程序必须能在任意时刻更新显示。第二种情况是在程序重画带有新内容的画面时。这种重画可能会要求首先擦除原来的图像。12.6.1 Paint(Graphics g)方法显露处理自动地发生,且导致对paint()方法的一次调用。一种Graphics类的被称为裁剪矩形的设备常用于对paint()方法进行优化。除非必要,更新不会完全覆盖整个图形区域,而是严格限制在被破坏的范围内。12.6.2 repaint()方法对repaint()的调用可通知系统:你想改变显示,于是系统将调用paint()。12.6.3 update(Graphics g)方法repaint()实际上产生了一个调用另一方法update()的AWT线程。update方法通常清除当前的显示并调用paint()。update()方法可以被修改,如:为了减少闪烁可不清除显示而直接调用paint()。12.6.4 方法的交互下面的框图描述了paint(),update()和repaint()方法间的内在关系。 12.6.5 Applet的显示策略Applet的显示策略l 维护一个显示模型l 使paint()提供仅仅基于这个模型的显示l 更新这个模型并调用repaint()来改变显示Applet模型要求你采取一种特定的策略来维护你的显示:l 维护一个显示模型。这个模型是对为再次提供显示而所需做的事情的一个定义。关于如何去做的指令在paint()方法中被具体化;这些指令所用的数据通常是全局成员变量。l 使paint()提供仅仅基于该模型的显示。这使得无论paint()何时被调用,它都能以一致的方法再生该显示,并正确地处理显露问题。l 使得程序对显示的改变,通过更新该模型而调用repaint()方法来进行,以使update()方法(最终是paint()方法)被AWT线程调用。注一个单一AWT线程处理所有的绘图组件和输入事件的分发。应保持paint()和update()的简单性,以避免它们使AWT线程发生故障的可能性更大;在极端情况下,你将需要其他线程的帮助以达到这一目的。有关线程的编程是模块14的主题。第七节 什么是appletviewer?什么是appletviewer?l 使你不需Web浏览器就能运行Applet的一个Java应用程序l 它把HTML文件作为一个参数来装载appletViewer HelloWorld.htmll 它至少需要以下HTML代码: Applet通常运行于一个Web浏览器中,如HotJava TM或Netscape Navigator,它们有支持Java软件程序运行的能力。为了简化和加速开发过程,JDK应运而生,它附带有一个专为查看Applet而设计但不支持HTML页面查看的工具。这个工具就是appletviewer。appletviewer是使你不必使用Web浏览器即可运行Applet的一个Java应用程序。它犹如一个“最小化的浏览器”。appletviewer读取命令行中URL所指定的HTML文件。这个文件必须包含装入及执行一个或多个Applet的指令。appletviewer忽略了所有其他的HTML代码。它不能显示普通的HTML或嵌人在一个文本页中的Applet。12.7.1 用appletviewer启动Appletappletviewer将一个框架样式的区域粘贴在屏幕上,然后实例化该Applet并将这个Applet实例贴在已有的框架中。appletviewer带有一个命令行参数形式的URL,它指向一个含有Applet引用的HTML文件。这个Applet引用是一个指定了appletviewer要装载的代码的HTML标记。注意,这个标记的通用格式与任何其他的HTML相同,即,用两个符号来分隔指令。上例中显示的所有部分都是必需的,你必须使用和。部分指明了代码的入口,以及宽度和高度。注通常,你应该把Applet当作是固定大小的,并且使用标记中所指定的大小。12.7.2 使用appletviewer提要appletviewer带有一个指向包含标记的HTML文件的URL,这个URL被作为命令行参数。 appletviewer -debug URLs . appletviewer仅有的合法选项是 debug,它使得Applet在Java调试器jdb中启动。若用带 g选项的方式编译你的Java代码,则可在调试器中看到源代码。范例以如下所示的appletviewer命令启动appletviewer: c:jdk1.2source appletviewer HelloWorld.html 于是它创建并显示出如下的小窗口:第八节 Applet标记12.8.1 句法以下为Applet标记的完整句法:. . .alternateHTML其中l archive = archiveList 这一可选属性描述了一个或多个含有将被“预装”的类和其他资源的archives。类的装载由带有给定codebase的AppletClassLoader的一个实例来完成。ArchiveList中的archives以逗号(,)分隔。l code = appletFile.class 这是一个必需的属性,它给定了含有已编译好的Applet子类的文件名。也可用package.appletFile.class的格式来表示。注这个文件与你要装入的HTML文件的基URL有关,它不能含有路径名。要改变Applet的基URL,可使用。l width = pixels height = pixels 这些必需的属性给出了Applet显示区域的初始宽度和高度(以象素为单位),不包括Applet所产生的任何窗口或对话框。12.8.2 描述l codebase = codebaseURL 这一可选属性指定了Applet的基URL包含有Applet代码的目录。如果这一属性未指定,则采用文档的URL。l alt = alternateText 这一可选属性指定了当浏览器能读取Applet标记但不能执行Java Applet时要显示的文本。l name = appletInstanceName 这个可选属性为Applet实例指定有关名称,从而使得在同一页面上的Applet可找到彼此(以及互相通信)。l align = alignment 这个可选属性指定了Applet的对齐方式。它的可取值与基本的HTML中IMG标记的相应属性相同,为:left,right,top,texttop,middle,absmiddle,baseline,bottom和absbottom。l vspace = pixels hspace = pixels 这些可选属性指定了在Applet上下(vspace)及左右(hspace)的象素数目。其用法与IMG标记的vspace和hspace属性相同。l 这个标记提供了一
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!