第七章 Swing程序設計_第1頁
第七章 Swing程序設計_第2頁
第七章 Swing程序設計_第3頁
第七章 Swing程序設計_第4頁
第七章 Swing程序設計_第5頁
已閱讀5頁,還剩70頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第七章Swing程序設計主講:王芳Java程序設計本章知識點javaSwing概述掌握常用窗體的使用掌握常用組件與布局的使用掌握常用面板掌握按鈕、列表、文本組件掌握常用事件監聽器7.1Swing概述Swing特點java的優勢是網絡應用方面,但java也提供了強大的用于開發桌面程序的API,這些API在javax.swing包中。通過圖形用戶界面(GraphicsUserInterface,GUI),用戶和程序之間可以方便地進行交互。java的java.awt包,即java抽象工具包(AbstractWindowToolkit,AWT)提供了許多用來設計GUI的組件類。

java早期進行用戶界面設計時,主要使用java.awt包提供的類,比如Button、TextField、List等。JDK1.2推出之后,增加了一個新的javax.swing包,該包提供了功能更為強大的設計GUI的類。java.awt和javax.swing包中的一部分類的層次關系的UML圖如圖7.1所示。ComponentContainerJComponentWindowJDialogJFrameDialogFrameJButtonJTextFieldJPanelJTableJTextArea圖7.1component類的部分子類

掌握兩個概念:容器類(Container)和組件類(Component)javax.swing包中Jcomponent類是java.awt包Container類的一個直接子類,是java.awt包中Component類的間接子類,學習GUI編程主要是學習掌握使用Component類的一些重要的子類。以下是GUI編程經常用到的基本知識點。java把Component類的子類或間接子類創建的對象稱為一個組件。java把Container的子類或間接子類創建的對象稱為一個容器。可以向容器中添加組件。Container類提供了一個public方法add(),一個容器可以調用這個方法將組件添加到該容器中。容器調用removeAll()方法可以移調容器中的全部組件,調用remove(Componentc)方法可以移調容器中參數為c指定的組件。容器本身也是一個組件,因此可以把一個容器添加到另一個容器中實現容器的嵌套。每當容器添加新的組件或移調組件時,要調用validate()方法,以保證容器中的組件能正常顯示出來。頂層類介紹Component類包含paint、repaint方法,可以在屏幕上繪制組件大多數GUI組件直接或間接擴展ComponentContainer類容納相關組件包括add方法,用來添加組件包括setLayout方法,這個方法可用來設置布局,以幫助Container對象對其中的組件進行定位和設置組件大小JComponent類——多數Swing組件的超類可抽換的外觀和感覺,即可根據需求定制外觀和感覺。快捷鍵(通過鍵盤直接訪問GUI組件)一般的事件處理功能Swing的組件和容器層次通常將javax.swing包里的Swing組件歸為三個層次最外層容器中間層容器原子組件(最內層)頂層容器Swing提供三個最外層容器的類JFrame實現單個主窗口JDialog實現一個二級窗口(對話框)JApplet在瀏覽器窗口中實現一個applet顯示區域必須和操作系統打交道,所以都是重量級組件。從繼承結構上來看,它們分別是從原來AWT組件的Frame、Dialog和Applet類繼承而來。每個使用Swing組件的Java程序都必須至少有一個頂層容器,別的組件都必須放在這個頂層容器上才能顯現出來。JFrame窗體(常用方法)JFame()創建一個無標題的窗口。JFame(Strings)創建標題為s的窗口。publicvoidserSize(intwidth,intheight)設置窗口的大小。publicvoidsetBounds(inta,intb,intwidth,intheight)設置窗口的初始位置是(a,b),距屏幕左面a個像素,距屏幕上方b個像素,窗口的寬是width,高是height.publicvoidsetVisible(booleanb)設置窗口是否可見,窗口默認是不可見的。7.2常用窗體publicvoidsetDefaultCloseOperation(intoperation)該方法用來設置單擊窗體右上角的關閉圖標后,程序會做出怎樣的處理。其中的參數operation取JFrame類中的下列int型static常量,程序根據參數operation取值做出不同的處理:

DO_NOTHING_ON_CLOSE(什么也不做),HIDE_ON_COLSE(隱藏當前窗口),DISPOSE_ON_COLSE(隱藏當前窗口,并釋放窗體占有的其他資源),EXIT_ON_CLOSE(結束窗口所在的應用程序)。例swing1.java容器的主要作用和特點容器有一定的范圍。一般容器都是矩形的,容器范圍邊界可以用邊框框出來,有些則沒有可見的標記。容器有一定的位置。這個位置可以是屏幕四角的絕對位置,也可以是相對于其他容器邊框的相對位置。容器中可以包含其他的許多界面成份和元素。當容器被打開顯示時,它上面的成份和元素也同時顯示出來;當容器被關閉和隱藏時,它所包含的成份和元素也一起被隱藏。容器可以按一定的規則來安排它所包含的元素,如這些元素的相對位置關系、它們的前后排列關系等。三層容器結構示例

最外層容器(窗口JFram)中間層容器(JPanel)最內層原子組件JFrame類JFrame的繼承結構java.lang.Object└java.awt.Component└java.awt.Container└java.awt.Window└java.awt.Frame└javax.swing.JFrameJFrame類JFrame類是頂層容器。JFrame類的重要方法如下:setTitle()——設置窗口中標題欄的文字。setSize()——設置窗口的大小。dispose()方法——關閉窗口,并回收該窗口的所有資源。setLocation()——設置組件的位置。setResizable()——設置用戶是否可以改變框架大小。setIconImage()設置圖示有關ToolkitToolkitkit=Toolkit.getDefaultToolkit();Imageicon=kit.getImage("icon.gif");JDialog窗體(常用方法)JDialog()創建一個無標題和父窗體的對話框。JDialog(Framef)創建一個指定父窗體的對話框,該窗體沒有標題publicJDialog(Framef,booleanmodel)創建一個指定類型的對話框并指定父窗體,但該窗體沒有指定標題。publicJDialog(Framef,Stringtitle)創建一個指定標題和父窗體的對話框。publicJDialog(Framef,Stringtitle,booleanmodel)創建一個指定標題、窗體和模式的對話框。例MyFrame.java

菜單條、菜單、菜單項是窗口常用的組件,菜單放在菜單條里,菜單項放在菜單里。菜單條

JComponent類的子類JMenubar負責創建菜單條,即JMenuBar的一個實例就是一個菜單條,JFrame類將一個菜單條放在窗口的方法:setJMenuBar(JMenuBarbar);該方法是將菜單條添加到窗口的頂端,需要注意的是,只能向窗口添加一個菜單條。7.2菜單條、菜單、菜單項菜單

JComponent的子類JMenu負責創建菜單,JMenu的一個實例就是一個菜單。菜單項JComponent的子類JMenuItem負責創建的菜單項,JMenuItem的一個實例就是一個菜單項。嵌入式菜單

JMenu是JMenuItem的子類,菜單本身也是一個菜單項,當把一個菜單看作菜單項添加到某個菜單時,成這樣的菜單為子菜單。菜單Menu菜單Menu菜單的幾部分,如上頁ppt所示:JMenuBarJMenuJMenuItem代碼演示增加一個File菜單,并且生成new/open/save/saveas/exit菜單項由學生生成一個新的菜單Help且此菜單下有一個About菜單項帶圖標的菜單菜單上的圖標

為了使菜單項上有一個圖標,可以使用圖標類Icon聲明一個圖標,然后使用子類ImageIcon類創建一個圖標,如:Iconicon=newImageIcon("a.gif");然后菜單項調用setIcon(Iconicon)方法將圖標設置為icon。例WindowMenu.java層級菜單彈出式菜單彈出式菜單彈出式菜單必須綁定到某一JComponent上面Jcomponent.setComponentPopupMenu()方法學習備注中的代碼菜單的響應給菜單項添加ActionListener即可newItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){ System.out.println("Menuitemnew...");}});菜單相關的快捷鍵JMenuItem.setAccelerator()Ctrl+s:KeyEvent.VK_S+InputEvent.CTRL_MASK學習備注中的代碼7.3JPanel類是一種經常使用的輕量級中間容器。在默認狀態下,除了背景色外它并不繪制任何東西。可以很容易的為它設置邊框和繪制特性,我們可以把它設置為頂層容器contentPane。有效地利用JPanel可以使版面管理更為容易。可以使用布局管理器來規劃它所容納的組件的位置和大小可以通過setLayout方法來改變其布局;也可以在創建一個JPanel對象時就為它確定某種布局方式。在默認狀態下panel使用FlowLayout布局,將各組件布局在一行。JPanel類常用方法7.4JButton類JButton是一個按鈕工具。JButton對象除了可以擁有文本標簽之外,還可以擁有一個圖標,這個圖標可以是用戶自己繪制的圖形,也可以是已經存在的.gif圖像。JButton按鈕不但可以擁有一個圖標,而且可以擁有一個以上的圖標,并根據Swing按鈕所處狀態的不同而自動變換不同的Swing按鈕圖標。程序編程步驟及其代碼說明首先創建一個JFrame類最外層容器。然后創建一個JPanel類的中間容器panel然后創建原子組件Jbutton等,并將它們添加到中間容器上。然后將中間容器通過內容面板添加到最外層容器上。代碼示例7.6JTextField/JTextAreaJTextField:文本域,用于文本輸入,但只接受單行輸入JTextArea:文本區,可以輸入多行文本,下面會單獨列出來講一下具有共同的父親,JTextComponent相關方法voidsetText(Stringt)StringgetText()voidsetEditable(booleanb)調用方式:JTextFieldtextField=newJTextField(“defaultinput”,20);//20指可以輸入的最大列數,超過這個列數會滾動,系統并不一定非要遵守這個列規定JTextFieldtextField=newJTextField(20);7.7JLabel標簽,沒有邊框,不能響應用戶的點擊構造方法:請查看API文檔(可以指定文本和圖標)可以在構造方法中指定對齊方式,可以使用SwingContants中的常量(通過登錄界面演示效果)JPasswordField密碼域,用戶輸入的字符以*號顯示常用方法publicJPasswordFiled(Strings,intcolumns),如果不需要初始字符串可以設置s為nullvoidsetEchoChar(charecho)設置回顯字符,0表示默認的回顯字符*char[]getPassword()返回密碼域,返回的不是字符串,因為字符串在堆在存儲,等待垃圾回收器回收,不安全如需要更多的設置請查看API說明文檔7.5布局管理將下級組件有秩序地擺在上一級容器中,可以選擇:在程序中具體指定每個組件的位置。使用布局管理器。布局管理器使用方法是通過調用容器對象的setLayout()方法,并以某種布局管理器對象為參數。使用布局管理器可以更容易地進行布局,而且當改變窗口大小時,它還會自動更新版面來配合窗口的大小,不需要擔心版面會因此混亂。在Java中有很多實現LayoutManager接口的布局管理器類,經常用到的有以下幾個BorderLayoutFlowLayoutGridLayoutGridBagLayout下面分別介紹這幾種布局管理器,其他布局管理器類的使用可以參見JDK幫助文檔。BorderLayoutBorderLayout以將組件放置到五個區域:東、西、南、北、中。是JFrame的默認布局,先放入邊緣組件,剩余空間由中間組件填充,當容器縮放時,邊緣厚度不會改變,而中部組件會發生變化.添加組件時,通過BorderLayout.NORTH/SOUTH/WEST/EAST/CENTER指定位置BorderLayout布局示意圖CenterNorthSouthWestEastFlowLayoutFlowLayout是JPanel默認使用的布局管理器,它只是簡單地把組件放在一行,如果容器不是足夠寬來容納所有組件,就會自動開始新的一行,當容器縮放時各組件會根據空間自動調整位置。通過FlowLayoutDemo.java例中,演示了該布局管理器的使用方法和效果。GridLayout網絡布局像電子數據表一樣,按行列排序所有的組件,不過它的每個單元大小都是一樣的,構造的時候制定行和列,如newGridLayout(5,4)代碼編寫計算器界面GridBagLayout(網格箱布局管理器)網格箱布局管理器以網格為基礎,允許組件使用最適當的大小,既可以占多個網格,也可以只占網格的一部分。1.GridBagLayout的構造方法GridBagLayout()2.創建網格箱布局管理器setConstraints(Componentcomp,GridBagConstrainsconstrians)例GridBagLayout.javaCalculator.java登錄窗口、注冊窗口例子1、應該使用什么布局管理器2、準備如何構造界面3、界面不好看,如何進一步設置對齊方式,設置各組件之間的距離,這需要更高級的布局管理器4、自己用代碼編寫界面確實比較累也比較煩,如果有一種可視化開發工具,拉控件就好了.例Login.javaBoxLayoutTest.java7.8事件處理當一個按鈕被點擊時,就是產生了一個事件,那么事件應該被如何處理看一個例子,點擊按鈕時會改變顏色,代碼見備注事件處理以上過程其實是一個著名的設計模式:觀察者模式舉一個天氣顯示牌例子(或者望風小偷的例子)主題(Subject):JButton觀察者(observer):監聽器推送的內容:Event什么叫注冊、什么叫取消注冊,對于Jbutton如何注冊觀察者是否明白上頁ppt中的原理JButton監聽器Event事件處理常見事件ActionEventFocusEventKeyEvent、MouseEvent、MouseWheelEventWindowEvent對應的監聽器ActionListenerFocusListenerKeyListener、MouseListener、MouseMotionLisener、MouseWheelListenerWindowListener、WindowFoucsListener、WindowStateLisener雖然類很多,但名子很好記7.8.1事件處理模式1.事件源:能夠產生事件的對象都可以成為事件源.2.監視器:事件源通過調用相應的方法將某個對象注冊為自己的監視器。對于文本框,這個方法是:addActionListener(監視器);事件源注冊監視器之后,相應的操作就會導致相應的事件的發生,并通知監視器,監視器就會作出相應的處理。

3.處理事件的接口:

監視器負責處理事件源發生的事件。監視器是一個對象,為了處理事件源發生的事件,監視器這個對象會自動調用一個方法來處理事件。Java規定:為了讓監視器這個對象能對事件源發生的事件進行處理,創建該監視器對象的類必須聲明實現相應的接口,那么當事件源發生事件時,監視器就自動調用被類重寫的某個接口方法(如圖9.7)。7.8.2ActionEvent事件1.ActionEvent事件源:

文本框、按紐、菜單項、密碼框和單選按紐都可以觸發ActionEvent事件,即都可以成為ActionEvent事件的事件源。2.注冊監視器:能觸發ActionEvent事件的組件使用

addActionListener(ActionListenerlisten)

將實現ActionListener接口的類的實例注冊為事件源的監視器。3.ActionListener接口:

ActionListener接口在java.awt.event包中,該接口中只有一個方法:

publicvoidactionPerformed(ActinEvente)

事件源觸發ActionEvent事件后,監視器將發現觸發的ActionEvent事件,然后調用接口中的方法:actionPerformed(ActinEvente)對發生的事件作出處理。ActionEvent類事先創建的事件對象就會傳遞給該方法的參數e。

4.ActionEvent類中的方法:

publicObjectgetSource()

調用該方法可以獲取發生ActionEvent事件的事件源對象的引用。publicStringgetActionCommand()

調用該方法可以獲取發生ActionEvent事件時,和該事件相關的一個命令字符串。

例6(Example9_6.java,WindowActionEvent.java,ReaderListen.java)

處理文本框上觸發的ActionEvent事件。在文本框text中輸入字符串回車,監視器負責計算字符串的長度,并在命令行窗口顯示字符串的長度。例子6程序運行效果如圖9.8和9.9。7.8.3DocumentEvent事件1.DocumentEvent事件源:文本區所維護的文檔能觸發DocumentEvent事件2.注冊監視器:能觸發DocumentEven事件的事件源使用

addDucumentListener(DocumentListenerlisten)將實現DocumentListener接口的類的實例注冊為事件源的監視器。

3.DocumentListener接口:

DocumentListener接口在javax.swing.event包中,該接口中有三個方法:

publicvoidchangedUpdate(DocumentEvente)publicvoidremoveUpdate(DocumentEvente)publicvoidinsertUpdate(DocumentEvente)事件源觸發DucumentEvent事件后,監視器將發現觸發的DocumentEvent事件,然后調用接口中的相應方法對發生的事件作出處理。例子9(Example9_9.java

,

WindowDocument.java

,

TextListener.java

,

HandleListener.java

)將用戶在一個文本區輸入的單詞按字典序排序后放入另一個文本區.7.8.4ItemEvent事件1.ItemEvent事件源:選擇框、下拉列表都可以觸發ItemEvent事件。2.注冊監視器:能觸發ItemEvent事件的組件使用

addItemListener(ItemListenerlisten)將實現ItemListener接口的類的實例注冊為事件源的監視器。3.ItemListener接口:

ItemListener接口在java.awt.event包中,該接口中只有一個方法:publicvoiditemStateChanged(ItemEvente)事件源觸發ItemEvent事件后,監視器將發現觸發的ItemEvent事件,然后調用接口中的itemStateChanged(ItemEvente)方法對發生的事件作出處理。ItemEvent類事先創建的事件對象就會傳遞給該方法的參數e。4.ItemEvent類中的方法:

getSource()方法返回發生Itemevent事件的事件源外

getItemSelectable()方法返回發生Itemevent事件的事件源。7.8.5MouseEvent事件_1

任何組件上都可以發生鼠標事件,如:鼠標進入組件、退出組件、在組件上方單擊鼠標、拖動鼠標等都觸發鼠標事件,即導致MouseEvent類自動創建一個事件對象。

1.使用MouseListener接口可以處理以下5種操作觸發的鼠標事件在事件源上按下鼠標鍵、在事件源上釋放鼠標鍵、在事件源上擊鼠標鍵、鼠標進入事件源、鼠標退出事件源。?MouseEvent中有下列幾個重要的方法:getX()

獲取鼠標指針在事件源坐標系中的x-坐標。getY()

獲取鼠標指針在事件源坐標系中的y-坐標。getModifiers()

獲取鼠標的左鍵或右鍵。getClickCount()

獲取鼠標被單擊的次數。getSource()

獲取發生鼠標事件的事件源。

?事件源注冊監視器的方法是addMouseListener(MouseListenerlistener)。

?MouseListener接口中有如下方法:

mousePressed(MouseEvent)

負責處理在組件上按下鼠標鍵觸發的鼠標事件mouseReleased(MouseEvent)

負責處理在組件上釋放鼠標鍵觸發的鼠標事件mouseEntered(MouseEvent)

負責處理鼠標進入組件觸發的鼠標事件mouseExited(MouseEvent)

負責處理鼠標離開組件觸發的鼠標事件mouseClicked(MouseEvent)

負責處理在組件上單擊鼠標鍵觸發的鼠標事件7.8.5MouseEvent事件_1

例子10Example9_10WindowMouse.javaMousePolice.java分別監視按鈕、文本框和窗口上的鼠標事件,當發生鼠標事件時,獲取鼠標指針的坐標值,注意,事件源的坐標系的左上角是原點。

7.8.5MouseEvent事件_32.使用MouseMotionListener接口可以處理以下兩種操作觸發的鼠標事件,在事件源上拖動鼠標、在事件源上移動鼠標。?事件源注冊監視器的方法是

addMouseMotionListener(MouseMotionListenerlistener)?

MouseMotionListener接口中有如下方法:mouseDragged(MouseEvent)

負責處理拖動鼠標觸發的鼠標事件。mouseMoved(MouseEvent)

負責處理移動鼠標觸發的鼠標事件。例子11

Example9_11.java

,WindowMove.java,LP.java

使用坐標變換來實現組件的拖動

7.8.6焦點事件

1.焦點事件源:組件可以觸發焦點事件。

2.注冊監視器:組件可以使用addFocusListener(FocusListenerlistener)注冊焦點事件監視器。

3.FocusListener接口:創建監視器的類必須要實現FocusListener接口,該接口有兩個方法:publicvoidfocusGained(FocusEvente)publicvoidfocusLost(FocusEvente)

當發生FocusEvent事件時,監視器調用類實現的接口中的相應方法。4.組件也可調用

publicbooleanrequestFocusInWindow()

方法可以獲得輸入焦點。

7.8.7鍵盤事件當一個組件處于激活狀態時,敲擊鍵盤上一個鍵就導致這個組件觸發鍵盤事件。1.某個組件使用addKeyListener方法注冊監視器。2.接口KeyListener中有如下方法:

publicvoidkeyPressed(KeyEvente)publicvoidkeyTyped(KeyEvente)publicvoidKeyReleased(KeyEvente)

3.相關方法:

publicintgetKeyCode()判斷哪個鍵被按下、敲擊或釋放,返回一個鍵碼值。

getKeyChar()判斷哪個鍵被按下、敲擊或釋放,返回鍵上的字符。例子12

Example9_12.java

Win.java

Police.java通過處理鍵盤事件來實現軟件序列號的輸入。7.8.8窗口事件

JFrame及子類創建的窗口可以調用

setDefaultCloseOperation(intoperation);方法設置窗口的關閉方式(如前面各個例子所示).但是setDefaultCloseOperation方式可能不能滿足程序的需要,比如,用戶單擊窗口上的關閉圖標時,可能程序需要提示用戶是否需要保存窗口中的有關數據到磁盤等.WindowListener接口.

(1)publicvoidwindowActivated(WindowEvente)當窗口從非激活狀態到激活時,窗口的監視器調用該方法。(2)publicvoidwindowDeactivated(WindowEvente)當窗口激活狀態到非激活狀態時,窗口的監視器調用該方法。(3)publicvoidwindowClosing(WindowEvente)當窗口正在被關閉時,窗口的監視器調用該方法。(4)publicvoidwindowClosed(WindowEvente)當窗口關閉后,窗口的監視器調用該方法。(5)publicvoidwindowIconified(WindowEvente)當窗口圖標化時,窗口的監視器調用該方法。(6)publicvoidwindowDeiconified(WindowEvente)當窗口撤消圖標化時,窗口的監視器調用該方法。(7)publicvoidwindowOpened(WindowEvente)當窗口打開時,窗口的監視器調用該方法。練習在登錄界面,如果用戶密碼錯誤,你應該如何提示?如何安裝監聽器??事件監聽器內部類的不同使用方式Jbutton.addActionListener(newActionListener(){});形式classMyPanelimplementsAcionListener形式適配器的概念(adapter)用WindowListener來說明常見適配器FocusAdapter/KeyAdpater/MouseAdpater/MouseMotionAdapter/WindowAdapterJTextArea輸入多行文本構造方法newJTextArea(8,40)//8行40列設置自動換行setLineWrap(true)如果行數太多增加滾動功能 textArea=newJTextArea(8,40); JScrollPanescrollPane=newJScrollPane(textArea);通過備注中的代碼學習JTextArea復選框JCheckBox重要方法bold=newJCheckBox(“Bold”);bold.setSelected(true)isSelected()通過備注中程序學習單選按鈕JRadioButtonJRadioButtonsmall=newJRadioButton(“small”,false);必須要放在一個RadioGroup里(見代碼)備注中的代碼描述了JRadioButton用法邊界Border凸斜面/凹斜面/蝕刻/直線等通過BorderFactory中的靜態方法生成上述BorderJcomponent.setBorder()方法給組件添加border下拉列表JComboBox通過備注中代碼學習對話框模式和無模式:模式對話框在關閉之前不允許用戶操作本程序的其它界面簡單對話框介紹JOptionPane的四個方法:showMessageDialog(提示一個消息)showConfirmDialog(OK/No/Cancel)showOptionDialog(有幾個選項讓你選擇)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論