8.5 JApplet類
JApplet類是AWT Applet類的擴(kuò)展。為了在使用Swing組件的applet中能正確的進(jìn)行事件處理,我們applet必須繼承JApplet,而不是Applet。
JApplet的作用與其他的實(shí)現(xiàn)了RootPaneContainer接口的高層窗口相同。JApplet與Applet之間一個(gè)重要的區(qū)別就是默認(rèn)的布局管理器。因?yàn)槲覀兿騄Applet的內(nèi)容面析添加組件,其默認(rèn)的布局管理器為BorderLayout。這與Applet的默認(rèn)布局管理器FlowLayout不同。另外,Swing applet還可以具有一個(gè)工具欄,或者更為特定的JMenuBar,這是applet的JRootPane的另一個(gè)屬性。
如果我們計(jì)劃部署一個(gè)使用Swing組件的applet,最好是使用Sun Microsystems所提供的Java插件,因?yàn)檫@會(huì)隨運(yùn)行時(shí)安裝Swing庫。
如查我們要擴(kuò)展JApplet類,他只有一個(gè)重要的protected方法:
protected
JRootPane createRootPane()
?
8.6 配合桌面使用
Spring提供了對(duì)一個(gè)通常窗口或是桌面內(nèi)的窗體集合進(jìn)行管理。正如我們?cè)诘?章所討論的,這種管理通常被稱之為MDI。窗體可以位于其他的窗體之上,或者是可以被拖動(dòng),而其外觀適當(dāng)當(dāng)前的觀感。這些窗體是JInternalFrame類的實(shí)例,而桌面是一個(gè)稱之為JDesktopPane的特殊JLayeredPane。桌面內(nèi)窗體的管理是DesktopManager的責(zé)任,其中所提供的默認(rèn)實(shí)現(xiàn)是DefaultDesktopManager。桌面上的JInternalFrame的圖標(biāo)形式是通過JDesktopIcon的內(nèi)聯(lián)類JInternalFrame來表示的。同時(shí)有InternalFrmaeListener,InternalFrameAdapter以及InternalFrameEvent用于事件處理。
首先,我們來看一下構(gòu)成桌面的部分,然后我們會(huì)看到使用這些部分的一個(gè)完整示例。
8.6.1 JInternalFrame類
JInternalFrame類與JFrame類類似。他是一個(gè)高層窗口,使用RootPaneContainer接口,但是并不是一個(gè)頂層窗口。我們必須將內(nèi)部窗體放在另一個(gè)頂層窗口中。當(dāng)我們拖動(dòng)時(shí),內(nèi)部窗體會(huì)停留在其窗口的邊界之內(nèi),這通常是一個(gè)JDesktopPane。另外,內(nèi)部窗體是輕量級(jí)的,并且提供了一個(gè)UI委托從而使得內(nèi)部窗體看起來類似當(dāng)前配置的觀感。
創(chuàng)建JInternalFrame
JInternalFrame有六個(gè)構(gòu)造函數(shù):
public JInternalFrame() JInternalFrame frame = new JInternalFrame(); public JInternalFrame(String title) JInternalFrame frame = new JInternalFrame(" The Title "); public JInternalFrame(String title, boolean resizable) JInternalFrame frame = new JInternalFrame(" The Title ", true ); public JInternalFrame(String title, boolean resizable, boolean closable) JInternalFrame frame = new JInternalFrame(" The Title ", false , true ); public JInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable) JInternalFrame frame = new JInternalFrame(" The Title ", true , false , true ); public JInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) JInternalFrame frame = new JInternalFrame(" The Title ", false , true , false , true );
?
這些構(gòu)造函數(shù)以一個(gè)向另一個(gè)添加參數(shù)的方式進(jìn)行級(jí)聯(lián)。無參數(shù)時(shí),所創(chuàng)建的JInternalFrame沒有標(biāo)題,并且不能調(diào)整大小,關(guān)閉,最大化或是圖標(biāo)化。然而,內(nèi)部窗體總是可以拖動(dòng)的。
JInternalFrame屬性
表8-9列出了JInternalFrame類的30個(gè)不同屬性。layer屬性列出了兩次,因?yàn)樗哂袃蓚€(gè)設(shè)置方法,其中一個(gè)用于int,而另一個(gè)用于Integer。
JInternalFrame屬性
? | ||
屬性名 |
數(shù)據(jù)類型 |
訪問性 |
accessibleContext |
AccessibleContext |
只讀 |
closable |
boolean |
讀寫綁定 |
closed |
boolean |
讀寫綁定 |
contentPane |
Container |
讀寫綁定 |
defaultCloseOperation |
int |
讀寫 |
desktopIcon |
JInternalFrame.JDesktopIcon |
讀寫綁定 |
desktopPane |
JDesktopPane |
只讀 |
focusCycleRoot |
boolean |
讀寫 |
focusCycleRootAncester |
Container |
只讀 |
focusOwner |
Component |
只讀 |
frameIcon |
Icon |
讀寫綁定 |
glassPane |
Component |
讀寫綁定 |
icon |
boolean |
讀寫綁定 |
iconifiable |
boolean |
讀寫 |
internalFrameListeners |
InternalFrameListener[] |
只讀 |
jMenuBar |
JMenuBar |
讀寫綁定 |
layer |
int |
讀寫 |
layer |
Integer |
只寫 |
layeredPane |
JLayeredPane |
讀寫綁定 |
layout |
LayoutManager |
只寫 |
maximizable |
boolean |
讀寫綁定 |
maximum |
boolean |
讀寫 |
mostRecentFocusOwner |
Component |
只讀 |
normalBounds |
Rectangle |
讀寫 |
resizable |
boolean |
讀寫綁定 |
rootPane |
JRootPane |
讀寫綁定 |
selected |
boolean |
讀寫綁定 |
title |
String |
讀寫綁定 |
UI |
InternalFrameUI |
讀寫 |
UIClassID |
String |
只讀 |
warningString |
String |
只讀 |
對(duì)于Java 1.3及以后的版本,JInternalFrame的初始defaultCloseOperation屬性設(shè)置為DISPOSE_ON_CLOSE。以前版本的默認(rèn)設(shè)置為HIDE_ON_CLOSE。我們可以將這個(gè)屬性設(shè)置為前面的表8-6中列出的WindowConstants的值。
normalBounds屬性描述了當(dāng)一個(gè)圖標(biāo)化的內(nèi)部窗體取消息圖標(biāo)化時(shí)應(yīng)該在哪里顯示。focusOwner屬性在特定的JInternalFrame被激活時(shí)提供了一個(gè)實(shí)際帶有輸入焦點(diǎn)的Component。
在Swing類中,JInternalFrame只包含四個(gè)限制屬性:closed, icon, maximum以及selected。他們與四個(gè)boolean構(gòu)造函數(shù)參數(shù)直接相關(guān)。每一個(gè)都可以允許我們?cè)诟淖兤湓O(shè)置時(shí)檢測(cè)當(dāng)前的屬性狀態(tài)。然而,因?yàn)閷傩允鞘芟拗频模?dāng)我們要設(shè)置一個(gè)屬性時(shí),我們所做的嘗試必須位于一個(gè)try-catch塊中,捕捉PropertyVetoException:
try { // Try to iconify internal frame internalFrame.setIcon( false ); } catch (PropertyVetoException propertyVetoException) { System.out.println(" Rejected "); }
?
為了有助于我們使用這些綁定屬性,JInternalFrame類定義了一個(gè)11個(gè)常量,如表8-10所示。他們表示在PropertyChangeListener中通過PropertyChangeEvent的getPropertyName()方法返回的字符串。
JInternal屬性常量
屬性名常量 |
關(guān)聯(lián)屬性 |
CONTENT_PANE_PROPERTY
|
contentPane |
FRAME_ICON_PROPERTY
|
frameIcon |
GLASS_PANE_PROPERTY
|
glassPane |
IS_CLOSED_PROPERTY
|
closed |
IS_ICON_PROPERTY
|
icon |
IS_MAXIMUM_PROPERTY
|
maximum |
IS_SELECTED_PROPERTY
|
selected |
LAYERED_PANE_PROPERTY
|
layeredPane |
MENU_BAR_PROPERTY |
jMenuBar |
ROOT_PANE_PROPERTY
|
rootPane |
TITLE_PROPERTY
|
title |
下面的類示例演示了在PropertyChangeListener中常量的使用。
package swingstudy.ch08; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JInternalFrame; public class InternalFramePropertyChangeHandler implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent event) { // TODO Auto-generated method stub String propertyName = event.getPropertyName(); if (propertyName.equals(JInternalFrame.IS_ICON_PROPERTY)) { System.out.println(" Icon property changed. React. "); } } }
?
處理JInternalFrame事件
為了幫助我們像使用JFrame一樣來使用JInternalFrame,有一個(gè)額外的事件監(jiān)聽器來負(fù)責(zé)內(nèi)部窗體的打開與關(guān)閉的相關(guān)事件。這個(gè)接口名為InternalFrameListener,其定義如下。其作用類似于AWT的WindowListener接口,但是所用的JInternalFrame類,而不是AWT的Window類。
public interface InternalFrameListener extends EventListener { public void internalFrameActivated(InternalFrameEvent internalFrameEvent); public void internalFrameClosed(InternalFrameEvent internalFrameEvent); public void internalFrameClosing(InternalFrameEvent internalFrameEvent); public void internalFrameDeactivated(InternalFrameEvent internalFrameEvent); public void internalFrameDeiconified(InternalFrameEvent internalFrameEvent); public void internalFrameIconified(InternalFrameEvent internalFrameEvent); public void internalFrameOpened(InternalFrameEvent internalFrameEvent); }
?
另外,與具有所有WindowListener方法樁的WindowApapter類類似,也有一個(gè)具有所有InternalFrameListener方法樁的InternalFrameAdapter類。如果我們并不是對(duì)JInternalFrame發(fā)生的所有事件感興趣,我們可以繼承InternalFrameAdapter類,并且只重寫我們所感興趣的方法。例如,列表8-5中所示的監(jiān)聽器只對(duì)圖標(biāo)化方法感興趣。無需提供InternalFrameListener的其他五個(gè)方法的樁實(shí)現(xiàn),我們只需要繼承InternalFrameAdapter,并重寫兩個(gè)相關(guān)的方法。
package swingstudy.ch08; import javax.swing.JInternalFrame; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; public class InternalFrameIconifyListener extends InternalFrameAdapter { public void internalFrameIconified(InternalFrameEvent event) { JInternalFrame source = (JInternalFrame)event.getSource(); System.out.println(" Iconified: "+source.getTitle()); } public void internalFrameDeiconified(InternalFrameEvent event) { JInternalFrame source = (JInternalFrame)event.getSource(); System.out.println(" Deiconified: "+source.getTitle()); } }
?
InternalFrameEvent是AWTEvent的子類。為了定義由AWTEvent的public int getID()方法返回的值,InternalFrameEvent每一個(gè)可用的特定事件子類定義了一個(gè)常量。表8-11列出了九個(gè)常量。我們也可以通過事件的getInternalFrame()方法來獲得實(shí)際的JInternalFrame。
InternalFrameEvent事件子類型
事件子類型ID
|
關(guān)聯(lián)的接口方法 |
INTERNAL_FRAME_ACTIVATED
|
internalFrameActivated |
INTERNAL_FRAME_CLOSED
|
internalFrameClosed |
INTERNAL_FRAME_CLOSING
|
internalFrameClosing |
INTERNAL_FRAME_DEACTIVATED
|
internalFrameDeactivated |
INTERNAL_FRAME_DEICONIFIED
|
internalFrameDeiconified |
INTERNAL_FRAME_FIRST
|
N/A |
INTERNAL_FRAME_ICONIFIED
|
internalFrameIconified |
INTERNAL_FRAME_LAST
|
N/A |
INTERNAL_FRAME_OPENED
|
internalFrameOpened |
自定義JInternalFrame觀感
因?yàn)镴InternalFrame是一個(gè)輕量級(jí)組件,他具有可安裝的觀感。每一個(gè)可安裝的Swing觀感提供了一個(gè)不同的JInternalFrame外觀以及默認(rèn)的UIResource值集合。圖8-5預(yù)安裝的觀感類型集合的JWindow窗口外觀。
表8-12中列出了JInternalFrame的可用UIResource相關(guān)屬性的集合。對(duì)于JInternalFrame常量,有60個(gè)不同的屬性,包括內(nèi)部窗體的標(biāo)題面板的屬性。
JInternalFrame UIResource元素
? | |
屬性字符串 |
對(duì)象類型 |
InternalFrame.actionMap |
ActionMap |
InternalFrame.activeBroderColor |
Color |
InternalFrame.activeTitleBackground |
Color |
InternaleFrame.activeTitleForeground |
Color |
InternalFrame.activeTitleGradient |
List |
InternalFrame.border |
Border |
InternalFrame.borderColor |
Color |
InternalFrame.borderDarkShadow |
Color |
InternalFrame.borderHighlight |
Color |
InterenalFrame.borderLight |
Color |
InternaleFrame.borderShadow |
Color |
InternaleFrame.borderWidth |
Integer |
InternalFrame.closeButtonToolTip |
String |
InternalFrame.closeIcon |
Icon |
InternalFrmae.closeSound |
String |
InternalFrame.icon |
Icon |
InternalFrame.iconButtonToolTip |
String |
InternalFrame.iconifyIcon |
Icon |
InternalFrame.inactiveBorderColor |
Color |
InternalFrame.inactiveTitleBackground |
Color |
InternalFrame.inactiveTitleForeground |
Color |
InternalFrame.inactiveTitleGradient |
List |
InternalFrame.layoutTitlePaneAtOrigin |
Boolean |
InternalFrame.maxButtonToolTip |
String |
InternalFrame.maximizeIcon |
Icon |
InternalFrame.maximizeSound |
String |
InternalFrame.minimizeIcon |
Icon |
InternalFrame.minimizeIconBackground |
Color |
InternalFrame.minimizeSound |
String |
InternalFrame.optionDialogBorder |
Border |
InternalFrame.paletteBorder |
Border |
InternalFrame.paletteCloseIcon |
Icon |
InternalFrame.paletteTitleHeight |
Integer |
InternaleFrame.resizeIconHighlight |
Color |
InternalFrame.resizeIconShadow |
Color |
InternalFrame.restoreButtonToolTip |
String |
InternalFrame.restoreDownSound |
String |
InternalFrame.restoreUpSound |
String |
InternalFrame.titlebuttonHeight |
Integer |
InternalFrame.titleButtonWidth |
Integer |
InternalFrame.titleFont |
Font |
InternalFrame.titlePaneHeight |
Integer |
InternalFrame.useTaskBar |
Boolean |
InternalFrame.windowBindings |
Object[] |
InternalFrameTitlePane.closebuttonAccessibleName |
String |
InternalFrameTitlePane.closebuttonText |
String |
InternalFrameTitlePane.closeIcon |
Icon |
InternalFrameTitlePane.iconifyButtonAccessibleName |
String |
InternalFrameTitlePane.iconifyIcon |
Icon |
InternalFrameTitlePane.maximizeButtonAccessiblName |
String |
InternalFrameTitlePane.maximizeButtonText |
String |
InternalFrameTitlePane.minimizeIcon |
Icon |
InternalFrameTitlePane.moveButtonText |
String |
InternalFrameTitlePane.restoreButtonText |
String |
InternalFrameTitlePane.sizeButtonText |
String |
InternalFrameTitlePane.titlePaneLayout |
LayoutManager |
InternalFrameTitlePaneUI |
String |
InternalFrameUI |
String |
除了表8-12中許多可配置屬性以外,對(duì)于Metal觀感,我們還可以通過特殊的客戶端屬性JInternalFrame.isPalette來將內(nèi)部窗體設(shè)計(jì)為一個(gè)palette。當(dāng)設(shè)置為Boolean.TRUE時(shí),內(nèi)部窗體的外觀會(huì)與其他窗體略微不同,并且具有較短的標(biāo)題欄,如圖8-6所示。
如果我們同時(shí)在桌面的PALETTE_LAYER上添加了一個(gè)內(nèi)部窗體,則這個(gè)窗體會(huì)位于其他所有窗體之上(如圖8-6所示):
JInternalFrame palette = new JInternalFrame(" Palette ", true , false , true , false ); palette.setBounds(150, 0, 100, 100); palette.putClientProperty(" JInternalFrame.isPalette ", Boolean.TRUE); desktop.add(palette, JDesktopPane.PALETTE_LAYER);
?
創(chuàng)建圖8-6所示的程序的完整代碼顯示在本章稍后的列表8-6中。
修改JDesktopIcon
JInternalFrame依賴一個(gè)內(nèi)聯(lián)類JDesktopIcon來為JInternalFrame的圖標(biāo)化顯示提供UI委托。這個(gè)類只是用來這種功能的一個(gè)特殊的JComponent,而不是如其名字暗示的一個(gè)特殊的Icon實(shí)現(xiàn)。事實(shí)上,JDesktopIcon類的注釋表明這個(gè)類是臨時(shí)的,所以我們不應(yīng)直接對(duì)其進(jìn)行自定義。(當(dāng)然,這個(gè)類會(huì)存在一段時(shí)間。)
如果我們需要自定義JDesktopIcon,我們可以修改一些UIResource相關(guān)的屬性。表8-13列出了JDesktopIcon組件的八個(gè)UIResource相關(guān)屬性。
JInternalFrame.JDesktopIcon UIResource元素
屬性字符串
|
對(duì)象類型 |
DesktopIcon.background
|
Color |
DesktopIcon.border
|
Border |
DesktopIcon.font
|
Font |
DesktopIcon.foreground
|
Color |
DesktopIcon.icon
|
Icon |
DesktopIcon.width
|
Integer |
DesktopIcon.windowBindings
|
Object[] |
DesktopIconUI
|
String |
8.6.2 JDesktopPane類
與內(nèi)部窗體組合配合使用的另一個(gè)類就是JDesktopPane類。桌面面板的目的就是包含內(nèi)部窗體集合。當(dāng)內(nèi)部窗體被包含在一個(gè)桌面面板中時(shí),他們將其行為的大部分委托給桌面面板的桌面管理器。我們將會(huì)在本章稍后詳細(xì)了解DesktopManager接口。
創(chuàng)建JDesktopPane
JDesktopPane只有一個(gè)無參數(shù)的構(gòu)造函數(shù)。一旦創(chuàng)建,我們通常將其放在由BorderLayout管理的容器的中部。這可以保證桌面占據(jù)容器的所有空間。
將內(nèi)部窗體添加到JDesktopPane
JDesktopPane并沒有實(shí)現(xiàn)RootPaneContainer。我們并不能直接將組件添加到JRootPane內(nèi)的不同面板中,而是直接將其添加到JDesktopPane:
desktop.add(anInternalFrame);
JDesktopPane屬性
如表8-14所示,JDesktopPane有八個(gè)屬性。位于allFrames屬性數(shù)組索引0外的JInternalFrame是位于桌面前面的內(nèi)部窗體(JInternalFrame f = desktop.getAllFrames()[0])。除了獲取JDesktopPane中的所有窗體以外,我們還可以僅獲取特定層的窗體:public JInternalFrame[] getAllFramesInLayer(int layer)。
可用的dragMode屬性設(shè)置可以為類的LIVE_DRAG_MODE與OUTLINE_DRAG_MODE常量。
JDesktopPane屬性
屬性名
|
數(shù)據(jù)類型
|
訪問性 |
accessibleContext
|
AccessibleContext
|
只讀 |
allFrames
|
JInternalFrame[]
|
只讀 |
desktopManager
|
DesktopManager
|
讀寫 |
dragMode
|
int
|
讀寫綁定 |
opaque
|
boolean
|
只讀 |
selectedFrame
|
JInternalFrame
|
讀寫 |
UI
|
DesktopPaneUI
|
讀寫 |
UIClassID
|
String
|
只讀 |
自定義JDesktopPane觀感
回到圖8-5,我們可以看到JDesktopPane中的JInternalFrame對(duì)象。JDesktopPane的基本觀感與每一個(gè)觀感相同。如表8-15所示,對(duì)JDesktopPane并沒有太多可以配置的UIResource相關(guān)屬性。
JDesktopPane UIResource元素
屬性字符串
|
對(duì)象類型 |
desktop
|
Color |
Desktop.ancestorInputMap
|
InputMap |
Desktop.background
|
Color |
Desktop.windowBindings
|
Object[] |
DesktopPane.actionMap
|
ActionMap |
DesktopPaneUI
|
String |
完整的桌面示例
現(xiàn)在我們已經(jīng)了解了主要的桌面相關(guān)類,現(xiàn)在我們來看一下完整的示例。基本的過程包括創(chuàng)建一組JInternalFrame對(duì)象,然后將放在一個(gè)JDesktopPane中。如果需要,可以對(duì)每一個(gè)內(nèi)部窗體的單個(gè)組件進(jìn)行事件處理,也可以對(duì)單個(gè)窗體進(jìn)行事件處理。在這個(gè)示例中簡(jiǎn)單的使用了前面的列表8-5中所給出的InternalFrameIconifyListener類來監(jiān)聽正在圖標(biāo)化和取消圖標(biāo)化的內(nèi)容窗體。
圖8-6顯示了程序啟動(dòng)時(shí)的樣子。一個(gè)特定的內(nèi)部窗體被設(shè)計(jì)為palette,并且允許了拖放模式。
列表8-6顯示了這個(gè)示例的完整代碼。
package swingstudy.ch08; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.event.InternalFrameListener; public class DesktopSample { /** * @param args */ public static void main( final String[] args) { // TODO Auto-generated method stub Runnable runner = new Runnable() { public void run() { String title = (args.length==0 ? " Desktop Sample " : args[0]); JFrame frame = new JFrame(title); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JDesktopPane desktop = new JDesktopPane(); JInternalFrame internalFrames[] = { new JInternalFrame(" Can Do All ", true , true , true , true ), new JInternalFrame(" Not Resizable ", false , true , true , true ), new JInternalFrame(" Not Closable ", true , false , true , true ), new JInternalFrame(" Not Maximizable ", true , true , false , true ), new JInternalFrame(" Not Iconifiable ", true , true , true , false ) }; InternalFrameListener internalFrameListener = new InternalFrameIconifyListener(); int pos = 0; for (JInternalFrame internalFrame: internalFrames) { // Add to desktop desktop.add(internalFrame); // Position and size internalFrame.setBounds(pos*25, pos*25, 200, 100); pos++; // Add listener for iconification events internalFrame.addInternalFrameListener(internalFrameListener); JLabel label = new JLabel(internalFrame.getTitle(), JLabel.CENTER); internalFrame.add(label, BorderLayout.CENTER); // Make visible internalFrame.setVisible( true ); } JInternalFrame palette = new JInternalFrame(" Palette ", true , false , true , false ); palette.setBounds(350, 150, 100, 100); palette.putClientProperty(" JInternalFrame.isPalette ", Boolean.TRUE); desktop.add(palette, JDesktopPane.PALETTE_LAYER); palette.setVisible( true ); desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); frame.add(desktop, BorderLayout.CENTER); frame.setSize(500, 300); frame.setVisible( true ); } }; EventQueue.invokeLater(runner); } }
?
DesktopManager接口
使用桌面的最后一部分就是桌面管理器了,他是DesktopManager接口的實(shí)現(xiàn),其定義如下:
?
當(dāng)JInternalFrame位于JDe
public interface DesktopManager { public void activateFrame(JInternalFrame frame); public void beginDraggingFrame(JComponent frame); public void beginResizingFrame(JComponent frame, int direction); public void closeFrame(JInternalFrame frame); public void deactivateFrame(JInternalFrame frame); public void deiconifyFrame(JInternalFrame frame); public void dragFrame(JComponent frame, int newX, int newY); public void endDraggingFrame(JComponent frame); public void endResizingFrame(JComponent frame); public void iconifyFrame(JInternalFrame frame); public void maximizeFrame(JInternalFrame frame); public void minimizeFrame(JInternalFrame frame); public void openFrame(JInternalFrame frame); public void resizeFrame(JComponent frame, int newX, int newY, int newWidth, int newHeight); public void setBoundsForFrame(JComponent frame, int newX, int newY, int newWidth, int newHeight); }
?
sktopPane中時(shí),他們不應(yīng)嘗試?yán)鐖D標(biāo)化或是最大化的操作。相反,他們應(yīng)該請(qǐng)求他們所安裝在的桌面面板的桌面管理器來執(zhí)行這些操作:
getDesktopPane().getDesktopManager().iconifyFrame(anInternalFrame);
?
DefaultDesktopManager類提供了DesktopManager的一個(gè)實(shí)現(xiàn)。如果默認(rèn)實(shí)現(xiàn)還足夠,觀感會(huì)提供他們自己的DesktopManager實(shí)現(xiàn)類,例如Windows觀感的WindowsDesktopManager。我們也可以定義自己的管理器,但是通常并不需要這樣。
8.7 小結(jié)
在本章中,我們探討了JRootPane類,以及如何實(shí)現(xiàn)依據(jù)JRootPane對(duì)內(nèi)部組件進(jìn)行管理的RootPaneContainer接口。我們同時(shí)了解了在Swing中我們?nèi)绾问褂肑Frame, JDialog, JWindow, JApplet或是JInternalFrame類的JRootPane。根面板可以借助JLayeredPane來布局組件,其方式是工具提示文本以及彈出菜單總是顯示在相關(guān)聯(lián)組件的上面。
JInternalFrame同時(shí)也可以存在于桌面環(huán)境中,在這種情況下,JDesktopPane以及DesktopManager管理如何以及在哪里放置并顯示內(nèi)部窗體。我們還可以通過將InternalFrameListener實(shí)現(xiàn)也JInternalFrame關(guān)聯(lián)來響應(yīng)內(nèi)部窗體事件。
在第9章中,我們將會(huì)探討Swing庫中的特定彈出組件:JColorChooser, JFileChooser, JOptionPane以及ProgressMonitor
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
