⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s02.htm

📁 java图形设计卷2 swing
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up.js"></SCRIPT><SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up-all.js"></SCRIPT><html><head><title>易都网--Java 2 图形设计卷Ⅱ:SWING</title><LINK rel="stylesheet" href="../../../_public/javaa.css"><meta http-equiv="Content-Type" content="text/html; charset=GBK"><script language="JavaScript" src="../../../_public/javaa.js"></script><meta name="keywords" content="Java,JSP,ASP,PHP,J2EE,EJB,JavaScript,C/C++,ASM,CSS,HTML,XML,网络安全,MySQL,ACCESS"></head><body bgcolor="#FFFFFF"><table border=0 cellpadding=0 cellspacing=0 width="100%">  <tbody>   <script language="javascript">print2()</script>  <tr>     <td width="100%">       <table bgcolor=#EEEEEE border=0 cellpadding=3 cellspacing=0 width="100%">        <tbody>         <tr>           <td class=f1 id=thetd width="100%">             <p>[<a href="index.html" target="_self">目录</a>][<a href="s01.htm" target="_self">上一页</a>][<a href="s03.htm" target="_self">下一页</a>]</p>            <p align="center"><b>第2章 Swing的基本知识</b></p>            <p>  本章介绍开发Swing小应用程序和应用程序时要用到的Swing的基本知识。<br>                虽然Swing是AWT的扩展,但是两者的基本概念还是有许多不同之处。首先,Swing小应用程序和应用程序的实现方式与AWT小应用程序和应用程序的实现方式有所不同。而且,如果开发人员想要开发同时使用AWT组件和Swing组件的小应用程序或应用程序,则还必须注意混合使用轻量组件和重量组件所带来的许多问题。<br>                Swing是线程不安全的,这就是说,在大多数情况下,只能从事件派发线程中访问Swing组件。本章将介绍采用这种方法的原因及使用这种方法所带来的结果,另外,本章还介绍了Swing提供的一些机制,这些机制使其他线程能从事件派发线程中执行代码。             </p>            <p><b><a name="2.1"></a>2.1 小应用程序与应用程序</b></p>            <p>  使用Swing组件的小应用程序和应用程序应该分别扩展Swing的JApplet(java.applet.Applet的一个扩展)和JFrame(java.awt.Frame的一个扩展)。JApplet和JFrame除具有它们的超类所提供的功能外,还提供对Swing的支持。虽然可以分别使用Applet类和Frame类来实现Swing的小应用程序和应用程序,但是,这样很可能出现事件处理问题和重新绘制问题。因此,应当总是使用JApplet和JFrame来实现Swing的小应用程序和应用程序。<br>                JApplet和JFrame都是只包含一个组件的容器,这个组件是JRootPane的一个实例,JRootPane在12.2节“JRootPane”中介绍。目前,只需知道JRootPane包含一个称作为内容窗格的容器即可。内容窗格包含与特定的小应用程序或应用程序有关的所有内容。这里,内容指包含在小应用程序和或应用程序中的组件。实际上,这就是说小应用程序和应用程序必须把组件添加到内容窗格中而不是把它们直接添加到小应用程序或应用程序(或根窗格)中。而且,我们不应该直接为Swing小应用程序或应用程序设置布局管理器。因为组件添加到内容窗格中,所以应该为内容窗格而不是小应用程序或应用程序设置布局管理器。<br>                包含一个JRootPane实例的Swing容器重载用来添加组件和设置布局管理器的方法。这些方法会弹出提醒人们的异常信息:不能把组件直接添加到包含一个JRootPane实例的Swing容器中,也不能为该容器设置布局管理器。             </p>            <p><a name="2.1.1"></a><b>2.1.1 小应用程序</b></p>            <p>  <a href="s02_t01.htm" target="_blank">图2-1</a>所示的小应用程序包含一个JLabel实例,该实例有一个图标和一些文本。该小应用程序扩展JApplet并通过调用JApplet.getContentPane()方法来获得对其内容窗格的引用。这个标签随后被实例化并被添加到这个内容窗格中。</p>            <p>   <applet code="Test.class" archive="s02_t01.jar" width=300 height=150>              </applet><br>                    图2-1 Swing小应用程序</p>            <p>   例2-1列出了图2-1所示的小应用程序的代码。</p>            <p align="center"><b>例2-1 一个Swing小应用程序</b></p>            <p>  import javax.swing.*;<br>                import java.awt.*;<br>                import java.awt.event.*;</p>            <p>  public class Test extends JApplet {<br>                 public void init() {<br>                  Container contentPane = getContentPane();<br>                  /*原文<br>                  Icon icon = new ImageIcon(&quot;swing.gif&quot;,&quot;An animated               GIF of Duke on a swing&quot;);<br>                  JLabel label = new JLabel(&quot;Swing!&quot;,icon,SwingConstants.CENTER);<br>                  */<br>                  //修改后<br>                  JLabel label = new JLabel(&quot;Swing!&quot;, <br>                  new ImageIcon(getImage(getCodeBase(),&quot;swing.gif&quot;),&quot;An               animated GIF of Duke on a swing&quot;),<br>                   SwingConstants.CENTER);<br>                  contentPane.add(label, BorderLayout.CENTER);<br>                 }<br>                }</p>            <p>  JApplet类使用BorderLayout的一个实例作为其内容窗格的布局管理器。为了强调这一点,例2-1的小应用程序指定其布局约束条件为BorderLayout.CENTER,它使标签在内容窗格中居中显示。用BorderLayout布局组件的缺省约束条件是BorderLayout.CENTER,所以,在该小应用程序中指定这个布局约束条件不是必须的。<br>                <b>注意:</b>当在Internet Explorer中使用例2-1的小应用程序时,必须使用BorderConstraints.CENTER。(我根本就找不到)<br>                JApplet的内容窗格用BorderLayout的一个实例来布局组件。记住这一点是很重要的,因为java.applet.Applet与JApplet不同,它使用FlowLayout的一个实例来布局组件。             </p>            <p><b><a name="2.1.2"></a>2.1.2 JApplet类</b></p>            <p>  Swing的JApplet类扩展java.applet.Applet并实现Accessibility接口和RootPaneContainer接口。Accessibility接口是可访问包的一部分,而RootPaneContainer接口(如其名字所指出的)是一个包含根窗格的容器。RootPaneContainer接口被所有包含一个JRootPane实例的Swing容器所实现。<br>                类总结2-1中列出了JApplet提供的public和protected方法</p>            <p><b>类总结 2-1 JApplet</b></p>            <p>  扩展:java.applet.Applet<br>                实现:javax.accessibility.Accessible、RootPaneContainer<br>                1.构造方法<br>                public JApplet()<br>                JApplet中提供了一个不带参数的构造方法。由于小应用程序是由浏览器(或小应用程序阅读器)进行实例化的,所以,正常情况下,不需要直接把JApplet的一个实例进行实例化。要了解直接实例化一个JApplet实例的情况,请参见2.1.5节“小应用程序/应用程序组合”。<br>                2.方法<br>                (1)从java.awt.Container中重载而获得的方法<br>                protected void addImpl(Component,Object,int)<br>                public void setLayout(LayoutManager)<br>                public void addNotify()<br>                public void removeNotify()<br>                上面列出的四种方法都是重载java.awt.Container类中的方法而得到。<br>                AddImpl()是最终把组件添加到容器中的方法。如果直接把组件添加到小应用程序中,那么JApplet.addImpl()将弹出一个异常信息。这个异常中所显示的消息是定制的(注:消息是通过JApplet的扩展的名字定制的)。例如,如果例2-1小应用程序中的标签直接添加到该小应用程序中,那么异常信息将如下显示:<br>                java.lang.Error:Do not use Test.add()use Test.getContentPane().add)instead<br>                  at javax.swing.JApplet.createRootPaneException(JApplet.java:198)<br>                  at javax.swing.JApplet.addImpl(JApplet.java:220)<br>                  at java.awt.Container.add(Container.java:179)<br>                  at Test.init(Test.java:11)<br>                与JApplet重载addImpl()的原因一样,JApplet也重载setLayout()。如果设置了小应用程序的布局管理器,setLayout()将会弹出一个异常信息。如果修改例2-1的小应用程序,让该小应用程序试图设置它的布局管理器,则将弹出带有下面错误消息的异常信息:<br>                java.lang.Error:Do not use Test.setLayout()use Test.getContentPane().setLayout()instead<br>                  at javax.swing.JApplet.createRootPaneexception(JApplet.java:198)<br>                  at javax.swing.JApplet.setLayout(JApplet.java:244)<br>                  at Test.init(Test.java:10)<br>                  at sun.applet.AppletPanel.run(AppletPanel.java:287)<br>                  at java.lang.Thread.run(Thread.java:474)<br>                当实例化一个组件的对等组件时,将调用addNotify()方法。JApplet重载addNotify()以激发键盘事件并把小应用程序的可见性设置为true。<br>                (2)根窗格/内容窗格/玻璃窗格<br>                protected JRootPane createRootPane()<br>                protected boolean isRootPaneCheckingEnabled()<br>                protected void setRootPaneCheckingEnabled(boolean)<br>                public Container getContentPane()<br>                public Component getGlassPane()<br>                public JLayeredPane getLayeredPane()<br>                public JRootPane getRootPane()<br>                public void setContentPane(Container)<br>                public void setGlassPane(Component)<br>                public void setLayeredPane(JLayeredPane)<br>                public void setRootPane(JRootPane)<br>                Swing小应用程序通过调用protected JApplet.createRootPane方法,接着,这个方法又调用setRootPane()方法来创建根窗格。createRootPane方法可以被JApple的扩展所重载,以便替代JRootPane类的扩展作为该小应用程序的根窗格。<br>                如前所述,把组件直接添加到JApplet的一个实例中或显式地设置其布局管理器都可能会信息弹出一个异常。然而,有时必须把JRootPane的一个实例直接添加到小应用程序中,并且不信息。通过调用以boolean值为为参数的setRootPaneCheckingEnabled()方法来设置一个标志,该标志跟踪是否允许根窗格检查。如果这个boolean值是true,则说明允许根窗格检查,如果这个boolean值是false,则说明禁止根窗格检查。<br>                isRootPaneCheckingEnabled()方法返回最后传送给setRootPaneCheckingEnabled()方法的boolean值。               <br>                注意:setRootPaneCheckingEnabled()和isRootPaneCheckingEnabled()都是protected方法。虽然不可能把组件直接添加到JApplet的一个实例中或显式地设置其布局管理器,但是,实现可以控制是否允许根窗格检查的JApplet的扩展是可能的。这种功能使JAppelt的扩展能够在需要时直接添加组件或设置小应用程序的布局管理器。<br>                实际中,很少重载JApplet.createRootPane(),JApplet的扩展也很少用setRootPaneCheckingEnabled()来直接添加组件或设置小应用程序的布局管理器。<br>                上面列出的第二组方法是由RootPaneContainer接口定义的,这些方法能够获取和设置包含在JRootPane的一个实例中的容器。JRootPane和RootPaneContainer将在第12章和12.2节“JRootPane”               中介绍。<br>                (3)可访问的相关内容/菜单栏/键盘事件/更新<br>                public AccessableContext getAccessableContext()<br>                public JMenuBar getMenuBar()<br>                public void setMenuBar(JMenuBar)<br>                proteted voidprocessKeyEvent(KeyEvent)<br>                public void update(Graphics)<br>                getAccessibleContext()返回AccessibleContext的一个实例,这个实例把小应用程序的可访问信息提供给可访问工具。<br>              -------- <br>                JApplet实例可以有一个菜单栏,它是由setJMenuBar方法指定的。注意,Swing小应用程序能有一个菜单栏,而AWT小应用程序却不能。参见图2-2。<br>                实际上有两种方法把菜单栏添加到Swing小应用程序中的方法。一种方法当然是调用JApplet.setJMenuBar,另一种方法是获得对小应用程序根窗格的引用,然后把菜单栏直接添加到根窗格中。<br>                重载ProcessKeyEvent()来处理键绑定问题。有关Swing组件中键击处理的更多信息,请参见4.8节“键出处理”。<br>                重载JApplet.update方法以便直接调用paint()。缺省时,AWT组件将实现它们的update方法以便擦除背景,然后调用paint()。这种技术在组件反复更新时,会导致许多闪烁。有关绘制和更新AWT组件的更多信息,请参见《Java               2 图形设计,卷Ⅰ:AWT》。</p>            <p><b>Swing提示</b></p>            <p><b>JApplet和JFrame的内容窗格使用一个BorderLayout实例</b><br>                如果你用AWT开发过应用程序,就一定熟悉这样一个事实:java.applet.Applet使用一个FlowLayout实例作为其布局管理器,而java.awt.Frame则使用一个BorderLayout实例作为其布局管理器。<br>                由于AWT小应用程序和应用程序使用不同的布局管理器,所以,当把小应用程序移植为应用程序时或把应用程序移植为小应用程序时,就可造成混乱,这里还没有涉及到实现一个小应用程序和应用程序组合的情况。相比之下,Swing在小应用程序和应用程序的内容窗格中使用相同的布局管理器(即一个BorderLayout实例)。             </p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -