📄 s02.htm
字号:
<p> <b><a name="2.1.3"></a>2.1.3 应用程序</b></p> <p> 例2-2所示的应用程序与例2-1所示的小应用程序在功能上是完成相同的。它们都把JLabel的一个实例添加到它们的根窗格的内容窗格中。<br> 例2-3列出了<a href="s02_t03.jar" target="_blank">图2-3</a>所用的应用程序的代码。</p> <p align="center"><b>例2-3 一个Swing应用程序</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;</p> <p> public class Test extends JFrame {<br> public Test() {<br> super("An Application");</p> <p> Container contentPane = getContentPane();<br> /*原文:<br> Icon icon = new ImageIcon("swing.gif", <br> "An animated GIF of Duke on a swing");</p> <p> JLabel label = new JLabel("Swing!", icon,<br> SwingConstants.CENTER);<br> ----*/ </p> <p> //修改成:<br> java.net.URL codebase=getClass().getResource("swing.gif");<br> JLabel label = new JLabel("Swing!",new ImageIcon(codebase), SwingConstants.CENTER); <br> //---<br> contentPane.add(label, BorderLayout.CENTER);<br> }<br> public static void main(String args[]) {<br> final JFrame f = new Test();</p> <p> f.setBounds(100,100,300,250);<br> f.setVisible(true);<br> f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br> }</p> <p> 应用程序比小应用程序要稍微复杂些,这是因为它们不是在浏览器内部运行的,即浏览器不启动它们也不设置它们的大小。应用程序必须提供main方法,必须把一个窗体实例化,随后确定该窗体的大小(注:可使用JFrame.pack()显式地给出窗体的大小)并使该窗体可见。<br> 例2-2中的应用程序还设置窗体的缺省关闭操作并添加一个窗口监听器,该监听器在窗体被关闭后会退出这个应用程序。有关Swing窗体的缺省关闭操作的更多信息,请参见2.1.4节“JFrame类”。<br> Swing小应用程序和应用程序有许多共同点。它们都含有一个JRootPane实例,都必须把组件添加到根窗格的内容窗格中。而且,不能显式地设置Swing小应用程序或Swing应用程序的布局管理器。 </p> <p> <b><a name="2.1.4"></a>2.1.4 JFrame类</b></p> <p> JFrame类扩展java.awt.Frame,与JApplet类似,它也实现Accessible接口和RootPaneCotainer接口。JFrame还实现Swing.WindowsConstants接口,该接口定义缺省关闭操作的常量。有关Swing常量的更多信息,请参见6.4节“Swing常量”。<br> JFrame实惠许多在JApplet中能找到的、相同的方法。与JApplet类似,为了不显式地设置其布局管理器或不把组件直接添加到窗体中,JFrame重载setLayout和addImpl方法。JRame实现了所有在RootPaneContainer接口中定义的方法,还实现了通话和禁止根窗格检查的方法。JFrame还实惠了确定当前是束启用了根窗格检查的方法。<br> 类总结2-2总结了JFrame类。</p> <p><br> <b>类总结2-2 JFrame</b></p> <p> 扩展:java.applet.Frame<br> 实现:javax.accessibility.Accessible、RootPaneContainer<br> 1.构造方法<br> public JFrame()<br> public JFrame(String title)<br> JFrame有两个构造方法,一个构造方法不带参数,一个构造方法以一个字符串为参数,该字符串代表窗体的标题。<br> 浏览器或小应用程序的阅读器会调用Swing小应用程序的构造方法,因此,通常不需要开发人员编写代码来调用它的构造方法,但是,应用程序必须负责构造窗体并负责设置窗体的大小。通常为JFrame的实例选择带一个字符串的构造方法,不带参数的构造方法将产生没有标题的窗体。 <br> (1)与JApplet交叠的方法<br> protected void addImpl(Component,Object,int)<br> prrotected JRootPane createRootPane()<br> public AccessibleContext getAccessibleContext()<br> public Container getContentPane()<br> public Component getGlassPane()<br> public JMenuBar getMenuBar()<br> public JLayeredPane getLayeredPane()<br> public JRootPane getRootPane()<br> protected boolean isRootPaneCheckingEnabled()<br> protected void processKeyEvent(KeyEvent)<br> public void setContentPane(Container)<br> public void setGlassPane(Component)<br> public void setMenuBar(JMenu Bar)<br> public void setLayeredPanec(JlayeredPane)<br> public void setLayout(LayoutManager)<br> protected void setRootPane(JRootPane)<br> protected void setRootPaneCheckingEnabled(boolean)<br> public void update(Graphics)<br> 上面列出的JFrame方法与JApplet中定义的方法交叠。其中的大部分方法与JApplet中相应方法的实现方式是相同的。例如,如果允许根窗格检查,则JFrame.setLayout和JFrame.addImpl都将弹出一个异常信息。<br> 有关上述方法的更多信息,请参见“类总结2-1JApplet”。<br> (2)窗体初始化/缺省的关闭操作/窗口事件 <br> protected void frameInit()<br> public int getDefaultCloseOperation()<br> protected void setDefaultCloseOperation(int)<br> protected void processWindowEvent(WindowEvent)<br> JFrame构造方法调用frameInit方法来初始化窗体。JFrame的frameInit()方法允许窗体的键盘事件和窗口事件,设置窗体的根窗格和背景色,并允许根窗格检查。如果缺省的设置不令人满意的话,也可扩展JFrame以重载frameInit()。</p> <p> 使用AWT窗体时,开发人要负责处理窗口关闭事件。通常,这需要重载事件处理方法,需要简单地隐藏窗口或隐藏窗口并清除其本地资源。而Swing通过把一个缺省关闭操作与每一个JFrame实例相关联来使窗口的关闭事件较容易处理。可以用setDefaultCloseOperation方法来设置缺省的关闭操作,而且可以用getDefaultCloseOperation()来获取缺省的关闭操作。可以传送给setDefaultCloseOperation()的integer值在WindowConstants类中定义,表2-1,表2-1列出了integer值。</p> <p> <b>表2-1 WindowContants public常数</b><br> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br> <b>方法名 实现 </b><br> ─────────────────────────────────<br> DO_NOTHNG_ON_CLOSE 关闭窗口时什么也不做<br> HIDE_ON_CLOSE 关闭窗口隐藏该窗口<br> DISPOSE_ON_CLOSE 关闭窗口时隐藏该窗口并清除其本地资源 <br> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p> <p> 如果没有显式地设置JFrame的缺省关闭操作,则缺省值是DO_NOTHING_ON_CLOSE。<br> DISPOSE_ON_CLOSE隐藏窗体并清除与这个窗体有关的系统资源。如果该窗体是应用程序窗体,则在该窗体清除后,应用程序将继续运行。例如,例2-2所列的应用程序把应用程序窗体的缺省关闭操作设置为DISPOSE_ON_CLOSE,但是,应用程序仍然负责处理窗体关闭事件。到应用程序得到窗体已关闭(当调用windowClosed方法时)窗体已隐藏并清除通知时,应用程序仍在运行;结果,应用程序在windowClosed方法中调用System.exit()。</p> <p> <b><a name="2.1.5"></a>2.1.5 小应用程序/应用程序的组合</b></p> <p> 有时需要实现这样一个源文件,它既可作为应用程序运行又可作为小应用程序运行。例2-3示出了一种实现小应用程序/应用程序组合的方法。</p> <p align="center"><b>例2-3 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> /*原文<br> Icon icon = new ImageIcon("swing.gif");<br> JLabel label = new JLabel(icon);<br> */<br> //原文如不修改,不能正常显示图标 </p> <p> //修改后--------<br> java.net.URL codebase=getClass().getResource("swing.gif");<br> JLabel label = new JLabel(new ImageIcon(codebase));<br> //----------修改后的程序有个毛病,既作为applet使用时,不能刷新,一旦刷新图就没了。</p> <p> contentPane.setLayout(new FlowLayout()); <br> contentPane.add(label);</p> <p> //contentPane.add(label);<br> }<br> public static void main(String args[]) {<br> final JFrame f = new JFrame();<br> JApplet applet = new Test();</p> <p> applet.init();</p> <p> f.setContentPane(applet.getContentPane());<br> f.setBounds(100,100,308,199);<br> f.setTitle("An Application");<br> f.setVisible(true);</p> <p> f.setDefaultCloseOperation(<br> WindowConstants.DISPOSE_ON_CLOSE);</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -