?? 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 + -