📄 s02.htm
字号:
}</p> <p> 其思想是实现一个小应用程序,这个小应用程序包含一个main方法。这个main方法把JFrame实例化,而且还创建这个小应用程序的一个实例。在调用小应用程序的init方法后,窗体用该小应用程序的内容窗格来替代该窗体的内容窗格。这个窗体接着设置其边界和标题。并把它的可见性设置为true。<br> 从本质上讲,这种技术会产生共享一个内容窗格的应用程序和小应用程序。当例2-3中的代码被编译后,它可以既作为小应用程序运行又可以作为应用程序运行。<br> 应该注意的是,作为应用程序/小应用程序组合实现的应用程序,在使用main方法创建的小应用程序实例时必须非常小心。因为浏览器或小应用程序阅读器不能把这种小应用程序实例化,所以这种小应用程序是不完善的(从技术上说,它没有小应用程序的相关内容)。因此,这种小应用程序不能使用,例如,用Applet.getImage方法来获取一幅图像。实际应用中,也没有那么多限制,因为应用程序除借用小应用程序的内容窗格外不需要使用小应用程序。例如,应用程序通常使用AWT工具包来获取图像,因此,不需要使用Applet.getImage方法。</p> <p><b>Swing提示</b></p> <p><b>不要直接把组件添加到Swing小应用程序或应用程序中,也不要显式地设置其布局管理器</b><br> Swing小应用程序和应用程序都有一个JRootPane实例,该实例又含有一个称作内容窗格的容器。小应用程序或应用程序的内容(即组件)必须添加到内容窗格中。如果把组件直接添加到JApplet或JFrame的实例中,则会弹出一个异常信息,指出只能把组件添加到内容窗格中。</p> <p> Swing小应用程序和应用程序都使用BorderLayout布局管理器来布局它们的JRootPane实例,并且不允许显式地设置它们的布局管理器。如果试图显式地设置JApplet或JFrame的布局管理器,则会弹出一个异常信息,指出不可以显式地设置其布局管理器。</p> <p> <b><a name="2.2"></a>2.2 GJApp</b></p> <p> 本书介绍的应用程序都是在GJApp类的帮助下实现的,该类提供了一个状态区,并能从属性文件中读取资源。<a href="s02_t04.jar" target="_blank">图2-4</a>所示的应用程序是一个JFrame扩展,这个扩展用GJApp类来访问一个状态区,这个状态区显示从GJApp.properties文件中获取一个字符串。<br> GJApp.properties文件定义了一个属性:<br> # Simple properties file<br> statusAreaText=text in the status area<br> 例2-4列出了图2-4所示的应用程序的代码。</p> <p align="center"><b>例2-4 使用GJApp类</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;<br> import java.util.*;</p> <p> public class Test extends JFrame {<br> public Test() {<br> Container contentPane = getContentPane();<br> JPanel panel = new JPanel();</p> <p> panel.setBorder(BorderFactory.createEtchedBorder());<br> contentPane.add(panel,BorderLayout.CENTER);<br> contentPane.add(GJApp.getStatusArea(),BorderLayout.SOUTH);</p> <p> GJApp.showStatus(GJApp.getResource("statusAreaText"));<br> }<br> public static void main(String args[]) {<br> GJApp.launch(new Test(),"Status Area",300,300,450,300);<br> }<br> }</p> <p> 这个应用程序创建JPanel的一个实例,指定该实例为内容窗格的中心组件。用面板来突出状态区上面的空间,并且这个面板还有一个蚀该边框。<br> 应用程序通过调用static GJApp.getStatusAreas方法来获取对GJApp状态区的引用。状态区指定为内容窗格南边的组件。<br> static GJApp.showStatus方法以statusAreaText资源的字符串为参数把这个状态区初始化。资源的字符串用static GJApp.getResource方法来获得。<br> GJApp类有三个功能:<br> ·初始化并显示传送给static launch方法的窗体。<br> ·提供对小应用程序状态区面板的访问<br> ·从GJApp.properties文件中查找资源字符串。<br> 例2-5列出了GJApp类。 <br> </p> <p align="center"><b>例2-5 GJApp类</b><br> </p> <p> class GJApp {<br> static private JPanel statusArea = new JPanel();<br> static private JLabel status = new JLabel("");<br> static private ResourceBundle resources;</p> <p> static {<br> resources = ResourceBundle.getBundle(<br> "GJApp", Locale.getDefault());<br> };</p> <p> private GJApp() {} // defeat instantiation <br> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h) {<br> f.setTitle(title);<br> f.setBounds(x,y,w,h);<br> f.setVisible(true);</p> <p> statusArea.setBorder(BorderFactory.createEtchedBorder());<br> statusArea.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));<br> statusArea.add(status);<br> status.setHorizontalAlignment(JLabel.LEFT);</p> <p> f.setDefaultCloseOperation(indowConstants.DISPOSE_ON_CLOSE);</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br> static public JPanel getStatusArea() {<br> return statusArea;<br> }<br> static public void showStatus(String s) {<br> status.setText(s);<br> }<br> static String getResource(String key) {<br> return (resources == null) ? null : <br> resources.getString(key);<br> }<br> }</p> <p> 严格地说,GJApp是一个帮助类,它实现独有的static方法。GJApp的实例不能实例化,这是GJApp private构造方法强加的规定。<br> 一个static代码块(它在main()方法之前执行)试图获得对GJApp.properties文件资源包的一个引用。在GJApp.getResource方法中使用这个资源包可以获得一个与一个给定资源关键字相关的字符串。<br> GJApp.launch方法为传送给它的窗体设置边界和标题,把这个窗休的可见性设置为true,并打开这个窗体。这个launch方法还配置状态区并把窗体的缺省关闭操作设置为WindowConstants.DISPOSE_ON_CLOSE。添加到这个窗体中的窗口监听器在窗口关闭时会退出该应用程序。<br> GJApp类用getStatusArea方法访问其状态区面板。与小应用程序一样,GJApp类用showStatus方法来更新状态区。<br> 注意:本书以后介绍的应用程序都是在GJApp类帮助下实现的。但是,为了简短些,例2-5是本书中唯一列出了GJApp类的地方。 </p> <p><b><a name="2.3"></a>2.3 混合使用Swing组件和AWT组件</b></p> <p> 原来的AWT只是为重量组件设计的;在AWT1.1版本发布前,还没有轻量组件。结果,AWT不得不重做AWT,以提供轻量组件。<br> 任何软件开发人员都可证实,把一个复杂的系统和以前未预见的设计组合起来不是一个简单的任务,把轻量组件合并到AWT中也不例外。直到现在,在一个小应用程序或应用程序中混用轻量组件和重量组件还是有许多问题,尤其是把重量组件嵌入轻量容器中时更是如此。</p> <p> <b><a name="2.3.1"></a>2.3.1 层序</b></p> <p> 组件的层序是同一容器中组件之间显示的层次关系。<br> 如果容器是同类的(即它包含的组件都是轻量组件或都是重量组件),则按组件被添加到容器中的顺序来确定其层序。第一个被添加到容器中的组件有最高的层序,即它在同一容器中所有其他组件的上面显示。最后添加到容顺中的组件的层序最低,即它在同一个容器中的所有其他组件的下面显示。<br> 如果容器是异类的(即它既有轻量组件又有重量组件),则事情要稍微复杂些。从第1.2节“轻量组件与重量组件的比较”中,我们知道,轻量组件不是显示在它们自己的窗口中,而是显示在它们的重量容器的窗口中。所以,轻量组件的层序与重量容器的层序相同。如果多个轻量组件被添加到一个容器中,则这些轻量组件的层序是由组件被添加到容器中的顺序来决定的。<br> 如果对此还不太明白,下面的两个小应用程序将会有助于理解。<a href="s02_t05.htm" target="_blank">图2-5</a>所示的小应用程序有七个按钮,其中四个是重量AWT按钮,其他三个是Swing轻量按钮。所有的重量按钮都显示在轻量按钮的上面,因为轻量按钮的层序与它们的容器的层序相同。<br> 例2-6列出了图2-5所示的少应用程序的代码。</p> <p align="center"><b>例2-6 混合使用重量组件和轻量组件</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;</p> <p> public class Test extends JApplet {<br> Button b1, b2, b3, b4;<br> JButton jb1, jb2, jb3;</p> <p> public void init() {<br> Container contentPane = getContentPane();<br> contentPane.setLayout(null);</p> <p> // create heavyweight AWT buttons<br> b1 = new Button("Heavyweight Button #1");<br> b2 = new Button("Heavyweight Button #2");<br> b3 = new Button("Heavyweight Button #3");<br> b4 = new Button("Heavyweight Button #4");</p> <p> // create lightweight Swing buttons<br> jb1 = new JButton("Swing Button #1");<br> jb2 = new JButton("Swing Button #2");<br> jb3 = new JButton("Swing Button #3");</p> <p> // set bounds for heavyweight buttons<br> b1.setBounds(10, 10, 150, 25);<br> b2.setBounds(110, 25, 150, 25);<br> b3.setBounds(210, 40, 150, 25);<br> b4.setBounds(310, 55, 150, 25);</p> <p> // set bounds for lightweight buttons<br> jb1.setBounds(85, 25, 150, 65);<br> jb2.setBounds(100, 65, 150, 65);<br> jb3.setBounds(115, 105, 150, 65);</p> <p> // add lightweight buttons<br> contentPane.add(jb1);<br> contentPane.add(jb2);<br> contentPane.add(jb3);</p> <p> // add heavyweight buttons<br> contentPane.add(b1);<br> contentPane.add(b2);<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -