📄 s15.htm
字号:
<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="s14.htm">上一页</a>][<a href="s16.htm">下一页</a>]</p> <p align="center"><b>第15章 内部窗体和桌面窗格</b></p> <p> Swing提供实现多文档界面(MDI)应用程序的一组组件。MDI应用程序(如Microsoft Word和Adobe FrameMaker)是用一个窗口实现的,这个窗口是应用程序中创建的文档的桌面。<br> Swing提供带桌面的MDI功能和内部窗体,其中桌面由JDesktopPane类表示,内部窗体由JInternalFrame类表示。内部窗体在桌面上,并且可以在桌面内打开、关闭、最大化和图标化。Swing提供一个DesktopManager类,用这个类来实现桌面上的内部窗体的特定界面样式行为。 </p> <p> <b>15.1 JInternalFrame</b></p> <p> 由于内部窗体是外部窗体的复制品,所以内部窗体也是窗体。由于它们包含在另一个Swing容器中,所以它们是内部的,而这个容器通常是一个桌面窗格。<br> 内部窗体边框中所包含的控件与界面样式有关。标准Swing界面样式都提供关闭按钮、最大化按钮和最小化按钮,这可以从图15-1的Metal界面样式中看到。另外,Metal界面样式还提供在标题条中的控制条和图标,如图15-1最下面的图片所示。<br> <applet code="Test.class" archive="s15_tu01.jar" width=500 height=500> </applet> <br> 图15-1 运行中的JInternalFrame</p> <p> 单击图15-1所示的小应用程序中的按钮将产生内部窗体。图15-1顶层的窗体被选取,此时,这个窗体的边框是增亮的。<br> 例15-1列出了图15-1所示的小应用程序的代码。</p> <p align="center"> <b>例15-1 运行中的JInternalFrame</b></p> <hr noshade size="1"><pre>import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Test extends JApplet { JButton b = new JButton("make frame"); JDesktopPane desktopPane = new JDesktopPane(); int windowCount = 1; public void init() { Container contentPane = getContentPane(); contentPane.add(b, BorderLayout.NORTH); contentPane.add(desktopPane, BorderLayout.CENTER); desktopPane.setLayout(new FlowLayout()); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { JInternalFrame jif = new JInternalFrame( "Internal Frame " + windowCount++, // title true, // resizable true, // closable true, // maximizable true); // iconifiable jif.setPreferredSize(new Dimension(250, 100)); desktopPane.add(jif); jif.show();//新添加一句,原文没有 desktopPane.revalidate(); } }); }}</pre> <hr size="1" noshade> <p> 15.1.1 JInternalFrame属性</p> <p> </p> <p> 15.1.2 JInternalFrame事件</p> <p align="center"><b>例15-2 处理内部窗体事件</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import java.beans.*;<br> import javax.swing.*;<br> import javax.swing.event.*; <p>public class Test extends JApplet {<br> JDesktopPane desktopPane = new JDesktopPane();</p> <p> public void init() {<br> Container contentPane = getContentPane();</p> <p> contentPane.add(desktopPane, BorderLayout.CENTER);<br> desktopPane.setLayout(new FlowLayout());</p> <p> JInternalFrame jif = new JInternalFrame(<br> "An Internal Frame", // title<br> false, // resizable<br> true, // closable<br> true, // maximizable<br> true); // iconifiable</p> <p> jif.setPreferredSize(new Dimension(300, 250));<br> jif.addInternalFrameListener(new Listener(this));<br> jif.show();//新添加一句,原文没有</p> <p> desktopPane.add(jif);<br> }<br> }<br> class Listener implements InternalFrameListener { <br> private JApplet applet;</p> <p> public Listener(JApplet applet) {<br> this.applet = applet; <br> }<br> public void internalFrameActivated(InternalFrameEvent e) {<br> applet.showStatus("frame activated");<br> }<br> public void internalFrameClosed(InternalFrameEvent e) {<br> applet.showStatus("frame closed");<br> }<br> public void internalFrameClosing(InternalFrameEvent e) {<br> applet.showStatus("frame closing");<br> }<br> public void internalFrameDeactivated(InternalFrameEvent e) {<br> applet.showStatus("frame deactivated");<br> }<br> public void internalFrameDeiconified(InternalFrameEvent e) {<br> applet.showStatus("frame deiconified");<br> }<br> public void internalFrameIconified(InternalFrameEvent e) {<br> applet.showStatus("frame iconified");<br> }<br> public void internalFrameOpened(InternalFrameEvent e) {<br> applet.showStatus("frame opened");<br> }<br> private void sleepForABit() {<br> try {<br> Thread.currentThread().sleep(5000);<br> }<br> catch(InterruptedException e) {<br> e.printStackTrace();<br> }<br> }<br> }</p> <hr size="1" noshade> <p align="center"><b>例15-3 否决关闭内部窗体</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import java.beans.*;<br> import javax.swing.*;<br> import java.util.*; <p>public class Test extends JFrame {<br> JDesktopPane desktopPane = new JDesktopPane();</p> <p> public Test() {<br> Container contentPane = getContentPane();</p> <p> contentPane.add(desktopPane, BorderLayout.CENTER);<br> desktopPane.setLayout(new FlowLayout());</p> <p> JInternalFrame jif = new JInternalFrame(<br> "Some Editor", // title<br> false, // resizable<br> true); // closable</p> <p> jif.setPreferredSize(new Dimension(300, 250));<br> jif.addVetoableChangeListener(new CloseListener());<br> jif.show();//新添加的一句,原文没有<br> desktopPane.add(jif);<br> }<br> public static void main(String args[]) {<br> GJApp.launch(new Test(), <br> "Vetoing Internal Frame Closing",<br> 300,300,450,300);<br> }<br> }<br> class CloseListener implements VetoableChangeListener { <br> private Test applet;</p> <p> public void vetoableChange(PropertyChangeEvent e) <br> throws PropertyVetoException {<br> String name = e.getPropertyName();</p> <p> if(name.equals(JInternalFrame.IS_CLOSED_PROPERTY)) {<br> Component internalFrame = (Component)e.getSource();<br> Boolean oldValue = (Boolean)e.getOldValue(),<br> newValue = (Boolean)e.getNewValue();</p> <p> if(oldValue == Boolean.FALSE && <br> newValue == Boolean.TRUE) {<br> int answer = JOptionPane.showConfirmDialog(<br> internalFrame, // parentComponent<br> "Save Changes?", // message<br> "Unsaved Changes", // title<br> JOptionPane.YES_NO_CANCEL_OPTION); </p> <p> if(answer == JOptionPane.CANCEL_OPTION) {<br> throw new PropertyVetoException(<br> "close cancelled", e);<br> }<br> }<br> }<br> }<br> }<br> class GJApp extends WindowAdapter {<br> static private JPanel statusArea = new JPanel();<br> static private JLabel status = new JLabel(" ");<br> static private ResourceBundle resources;</p> <p> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h) {<br> launch(f,title,x,y,w,h,null); <br> }<br> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h,<br> String propertiesFilename) {<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(<br> WindowConstants.DISPOSE_ON_CLOSE);</p> <p> if(propertiesFilename != null) {<br> resources = ResourceBundle.getBundle(<br> propertiesFilename, Locale.getDefault());<br> }</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 Object getResource(String key) {<br> if(resources != null) {<br> return resources.getString(key);<br> }<br> return null;<br> }<br> }</p> <hr size="1" noshade> <p align="center"><b>例15-4 替换一个内部窗体的图标</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import javax.swing.*; <p>public class Test extends JApplet {<br> JDesktopPane desktopPane = new JDesktopPane();<br> JInternalFrame jif = new JInternalFrame(<br> "Internal Frame", // title<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -