8.5 JApplet類
JApplet類是AWT Applet類的擴展。為了在使用Swing組件的applet中能正確的進行事件處理,我們applet必須繼承JApplet,而不是Applet。
JApplet的作用與其他的實現(xiàn)了RootPaneContainer接口的高層窗口相同。JApplet與Applet之間一個重要的區(qū)別就是默認的布局管理器。因為我們向JApplet的內(nèi)容面析添加組件,其默認的布局管理器為BorderLayout。這與Applet的默認布局管理器FlowLayout不同。另外,Swing applet還可以具有一個工具欄,或者更為特定的JMenuBar,這是applet的JRootPane的另一個屬性。
如果我們計劃部署一個使用Swing組件的applet,最好是使用Sun Microsystems所提供的Java插件,因為這會隨運行時安裝Swing庫。
如查我們要擴展JApplet類,他只有一個重要的protected方法:
protected
JRootPane createRootPane()
?
8.6 配合桌面使用
Spring提供了對一個通常窗口或是桌面內(nèi)的窗體集合進行管理。正如我們在第1章所討論的,這種管理通常被稱之為MDI。窗體可以位于其他的窗體之上,或者是可以被拖動,而其外觀適當當前的觀感。這些窗體是JInternalFrame類的實例,而桌面是一個稱之為JDesktopPane的特殊JLayeredPane。桌面內(nèi)窗體的管理是DesktopManager的責任,其中所提供的默認實現(xiàn)是DefaultDesktopManager。桌面上的JInternalFrame的圖標形式是通過JDesktopIcon的內(nèi)聯(lián)類JInternalFrame來表示的。同時有InternalFrmaeListener,InternalFrameAdapter以及InternalFrameEvent用于事件處理。
首先,我們來看一下構成桌面的部分,然后我們會看到使用這些部分的一個完整示例。
8.6.1 JInternalFrame類
JInternalFrame類與JFrame類類似。他是一個高層窗口,使用RootPaneContainer接口,但是并不是一個頂層窗口。我們必須將內(nèi)部窗體放在另一個頂層窗口中。當我們拖動時,內(nèi)部窗體會停留在其窗口的邊界之內(nèi),這通常是一個JDesktopPane。另外,內(nèi)部窗體是輕量級的,并且提供了一個UI委托從而使得內(nèi)部窗體看起來類似當前配置的觀感。
創(chuàng)建JInternalFrame
JInternalFrame有六個構造函數(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 );
?
這些構造函數(shù)以一個向另一個添加參數(shù)的方式進行級聯(lián)。無參數(shù)時,所創(chuàng)建的JInternalFrame沒有標題,并且不能調(diào)整大小,關閉,最大化或是圖標化。然而,內(nèi)部窗體總是可以拖動的。
JInternalFrame屬性
表8-9列出了JInternalFrame類的30個不同屬性。layer屬性列出了兩次,因為他具有兩個設置方法,其中一個用于int,而另一個用于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 |
只讀 |
對于Java 1.3及以后的版本,JInternalFrame的初始defaultCloseOperation屬性設置為DISPOSE_ON_CLOSE。以前版本的默認設置為HIDE_ON_CLOSE。我們可以將這個屬性設置為前面的表8-6中列出的WindowConstants的值。
normalBounds屬性描述了當一個圖標化的內(nèi)部窗體取消息圖標化時應該在哪里顯示。focusOwner屬性在特定的JInternalFrame被激活時提供了一個實際帶有輸入焦點的Component。
在Swing類中,JInternalFrame只包含四個限制屬性:closed, icon, maximum以及selected。他們與四個boolean構造函數(shù)參數(shù)直接相關。每一個都可以允許我們在改變其設置時檢測當前的屬性狀態(tài)。然而,因為屬性是受限制的,當我們要設置一個屬性時,我們所做的嘗試必須位于一個try-catch塊中,捕捉PropertyVetoException:
try { // Try to iconify internal frame internalFrame.setIcon( false ); } catch (PropertyVetoException propertyVetoException) { System.out.println(" Rejected "); }
?
為了有助于我們使用這些綁定屬性,JInternalFrame類定義了一個11個常量,如表8-10所示。他們表示在PropertyChangeListener中通過PropertyChangeEvent的getPropertyName()方法返回的字符串。
JInternal屬性常量
屬性名常量 |
關聯(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,有一個額外的事件監(jiān)聽器來負責內(nèi)部窗體的打開與關閉的相關事件。這個接口名為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類類似,也有一個具有所有InternalFrameListener方法樁的InternalFrameAdapter類。如果我們并不是對JInternalFrame發(fā)生的所有事件感興趣,我們可以繼承InternalFrameAdapter類,并且只重寫我們所感興趣的方法。例如,列表8-5中所示的監(jiān)聽器只對圖標化方法感興趣。無需提供InternalFrameListener的其他五個方法的樁實現(xiàn),我們只需要繼承InternalFrameAdapter,并重寫兩個相關的方法。
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每一個可用的特定事件子類定義了一個常量。表8-11列出了九個常量。我們也可以通過事件的getInternalFrame()方法來獲得實際的JInternalFrame。
InternalFrameEvent事件子類型
事件子類型ID
|
關聯(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觀感
因為JInternalFrame是一個輕量級組件,他具有可安裝的觀感。每一個可安裝的Swing觀感提供了一個不同的JInternalFrame外觀以及默認的UIResource值集合。圖8-5預安裝的觀感類型集合的JWindow窗口外觀。
表8-12中列出了JInternalFrame的可用UIResource相關屬性的集合。對于JInternalFrame常量,有60個不同的屬性,包括內(nèi)部窗體的標題面板的屬性。
JInternalFrame UIResource元素
? | |
屬性字符串 |
對象類型 |
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中許多可配置屬性以外,對于Metal觀感,我們還可以通過特殊的客戶端屬性JInternalFrame.isPalette來將內(nèi)部窗體設計為一個palette。當設置為Boolean.TRUE時,內(nèi)部窗體的外觀會與其他窗體略微不同,并且具有較短的標題欄,如圖8-6所示。
如果我們同時在桌面的PALETTE_LAYER上添加了一個內(nèi)部窗體,則這個窗體會位于其他所有窗體之上(如圖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依賴一個內(nèi)聯(lián)類JDesktopIcon來為JInternalFrame的圖標化顯示提供UI委托。這個類只是用來這種功能的一個特殊的JComponent,而不是如其名字暗示的一個特殊的Icon實現(xiàn)。事實上,JDesktopIcon類的注釋表明這個類是臨時的,所以我們不應直接對其進行自定義。(當然,這個類會存在一段時間。)
如果我們需要自定義JDesktopIcon,我們可以修改一些UIResource相關的屬性。表8-13列出了JDesktopIcon組件的八個UIResource相關屬性。
JInternalFrame.JDesktopIcon UIResource元素
屬性字符串
|
對象類型 |
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)部窗體組合配合使用的另一個類就是JDesktopPane類。桌面面板的目的就是包含內(nèi)部窗體集合。當內(nèi)部窗體被包含在一個桌面面板中時,他們將其行為的大部分委托給桌面面板的桌面管理器。我們將會在本章稍后詳細了解DesktopManager接口。
創(chuàng)建JDesktopPane
JDesktopPane只有一個無參數(shù)的構造函數(shù)。一旦創(chuàng)建,我們通常將其放在由BorderLayout管理的容器的中部。這可以保證桌面占據(jù)容器的所有空間。
將內(nèi)部窗體添加到JDesktopPane
JDesktopPane并沒有實現(xiàn)RootPaneContainer。我們并不能直接將組件添加到JRootPane內(nèi)的不同面板中,而是直接將其添加到JDesktopPane:
desktop.add(anInternalFrame);
JDesktopPane屬性
如表8-14所示,JDesktopPane有八個屬性。位于allFrames屬性數(shù)組索引0外的JInternalFrame是位于桌面前面的內(nèi)部窗體(JInternalFrame f = desktop.getAllFrames()[0])。除了獲取JDesktopPane中的所有窗體以外,我們還可以僅獲取特定層的窗體:public JInternalFrame[] getAllFramesInLayer(int layer)。
可用的dragMode屬性設置可以為類的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對象。JDesktopPane的基本觀感與每一個觀感相同。如表8-15所示,對JDesktopPane并沒有太多可以配置的UIResource相關屬性。
JDesktopPane UIResource元素
屬性字符串
|
對象類型 |
desktop
|
Color |
Desktop.ancestorInputMap
|
InputMap |
Desktop.background
|
Color |
Desktop.windowBindings
|
Object[] |
DesktopPane.actionMap
|
ActionMap |
DesktopPaneUI
|
String |
完整的桌面示例
現(xiàn)在我們已經(jīng)了解了主要的桌面相關類,現(xiàn)在我們來看一下完整的示例。基本的過程包括創(chuàng)建一組JInternalFrame對象,然后將放在一個JDesktopPane中。如果需要,可以對每一個內(nèi)部窗體的單個組件進行事件處理,也可以對單個窗體進行事件處理。在這個示例中簡單的使用了前面的列表8-5中所給出的InternalFrameIconifyListener類來監(jiān)聽正在圖標化和取消圖標化的內(nèi)容窗體。
圖8-6顯示了程序啟動時的樣子。一個特定的內(nèi)部窗體被設計為palette,并且允許了拖放模式。
列表8-6顯示了這個示例的完整代碼。
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接口的實現(xiàn),其定義如下:
?
當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中時,他們不應嘗試例如圖標化或是最大化的操作。相反,他們應該請求他們所安裝在的桌面面板的桌面管理器來執(zhí)行這些操作:
getDesktopPane().getDesktopManager().iconifyFrame(anInternalFrame);
?
DefaultDesktopManager類提供了DesktopManager的一個實現(xiàn)。如果默認實現(xiàn)還足夠,觀感會提供他們自己的DesktopManager實現(xiàn)類,例如Windows觀感的WindowsDesktopManager。我們也可以定義自己的管理器,但是通常并不需要這樣。
8.7 小結
在本章中,我們探討了JRootPane類,以及如何實現(xiàn)依據(jù)JRootPane對內(nèi)部組件進行管理的RootPaneContainer接口。我們同時了解了在Swing中我們?nèi)绾问褂肑Frame, JDialog, JWindow, JApplet或是JInternalFrame類的JRootPane。根面板可以借助JLayeredPane來布局組件,其方式是工具提示文本以及彈出菜單總是顯示在相關聯(lián)組件的上面。
JInternalFrame同時也可以存在于桌面環(huán)境中,在這種情況下,JDesktopPane以及DesktopManager管理如何以及在哪里放置并顯示內(nèi)部窗體。我們還可以通過將InternalFrameListener實現(xiàn)也JInternalFrame關聯(lián)來響應內(nèi)部窗體事件。
在第9章中,我們將會探討Swing庫中的特定彈出組件:JColorChooser, JFileChooser, JOptionPane以及ProgressMonitor
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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