Java語言程序設計-v3-10_第1頁
Java語言程序設計-v3-10_第2頁
Java語言程序設計-v3-10_第3頁
Java語言程序設計-v3-10_第4頁
Java語言程序設計-v3-10_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十章事件處理遼寧機電職業(yè)技術學院信息工程系軟件教研室遲勇回顧簡述下面UI界面使用容器嵌套構建的過程本章學習任務學習一個簡單的按鈕事件處理示例理解基于委托的事件處理機制了解Java中的各種事件處理類使用事件適配器類實現(xiàn)事件處理本章技能目標了解事件處理類型及層次學習各種事件監(jiān)聽器理解事件適配器的使用意義預習檢查(1)--預習新單詞單詞釋義單詞釋義DelegationEventHandleActionAdapterItem預習檢查(2)從下面代碼中找出:事件監(jiān)聽器接口事件源監(jiān)聽器注冊監(jiān)聽器監(jiān)聽器接口中的方法事件類事件類的方法publicclassTextEventDemoextendsFrameimplementsTextListener{ TextFieldt1=newTextField(30); publicTextEventDemo(Stringtitle) { super(title); this.add(t1,"North"); t1.addTextListener(this);//為文本框t1注冊文本監(jiān)聽器

}publicvoidtextValueChanged(TextEvente){ if(e.getSource()==t1)//判斷是否在文本框上產(chǎn)生了文本事件

{ str=t1.getText(); }}}事件監(jiān)聽器接口事件源監(jiān)聽器注冊監(jiān)聽器監(jiān)聽器接口中的方法事件類事件類的方法事件處理-內容目錄事件處理概述事件處理示例事件適配器10.1事件處理(EventHandle)概述10.1.1Java基于委托的事件處理模型10.1.2事件處理及相關概念10.1.3Java的事件處理類10.1.4Java的事件及其監(jiān)聽器接口10.1事件處理(EventHandle)概述10.1事件處理(EventHandle)概述如果想要實現(xiàn)用戶與組件的交互,就必須使用事件處理。例如,我們用鼠標點擊按鈕,希望界面會得到一定的反應。在這個過程中,用戶在按鈕上單擊鼠標,按鈕組件接收鼠標動作并對用戶的動作做出響應,觸發(fā)組件的鼠標單擊事件。事件在對象間的傳遞是則是以消息(Message)進行傳輸。10.1.1Java基于委托的事件處理模型Java在事件處理的過程中,是圍繞著一個稱為“監(jiān)聽器”(Listener)的對象來進行的,事件的接收、判斷和處理都是委托“監(jiān)聽器”來全權完成,這稱為“基于委托的事件處理模型”(DelegationEventModel)。

Java的事件處理過程是這樣的:程序中使用“監(jiān)聽器”對想要接收事件的組件進行監(jiān)視,當用戶動作觸發(fā)事件時,“監(jiān)聽器”會接收到它所監(jiān)聽組件上的事件,然后根據(jù)事件類型,自行決定該使用什么方法來處理。在整個事件處理過程中,“監(jiān)聽器”都是關鍵的核心。事件處理的相關概念

事件處理及相關概念大致有:事件、事件接口、監(jiān)聽器、注冊(添加)監(jiān)聽器、事件類、事件接口中的方法、事件類的方法。

事件是組件對用戶的動作的響應。而響應用戶動作并產(chǎn)生事件的組件就是事件源。如果組件有監(jiān)聽器監(jiān)聽,組件產(chǎn)生的事件就會以消息的形式傳遞給監(jiān)聽器。監(jiān)聽器根據(jù)監(jiān)聽到的事件類型,調用相應的方法去執(zhí)行用戶的需求。而事件類和事件類的方法的應用則在事件接口方法中體現(xiàn)。第9章示例9-9就是一個事件處理的例子。例10-1:簡單的事件處理示例importjava.awt.*;importjava.awt.event.*;//導入事件處理類所在的類包//類EventHandle實現(xiàn)了事件監(jiān)聽器接口publicclassEventHandleextendsFrameimplementsActionListener{ TextFieldt1=newTextField(20); Buttonb1=newButton("登錄");publicEventHandle(Stringtitle){ super(title); this.setLayout(newFlowLayout()); this.add(t1); this.add(b1); b1.addActionListener(this);//為按鈕b1注冊監(jiān)聽器this this.setSize(200,90); this.setVisible(true);}publicvoidactionPerformed(ActionEvente)//實現(xiàn)接口里的方法

{ if(e.getSource()==b1)//判斷事件源是否是按鈕b1 { t1.setText("大家好!"); }}publicstaticvoidmain(String[]args){ newEventHandle("事件處理簡單示例");}}【運行結果】(顯示如圖所示的窗口,當單擊“登錄”按鈕時,文本框顯示字符串“大家好!”。)圖10-1Java基于委托的事件處理模型流程下面我們把例10-1涉及的相關概念再對比列出,參照圖10-1徹底掌握這些概念相關概念再對比概念相應代碼段事件監(jiān)聽器接口ActionListener事件源b1監(jiān)聽器this注冊監(jiān)聽器addActionListener(this);監(jiān)聽器接口中的方法actionPerformed()事件類ActionEvent事件類的方法getSource()表10-1事件相關概念對照那么什么樣的對象有資格做“監(jiān)聽器”呢?;“監(jiān)聽器”對象的類需要實現(xiàn)指定的事件監(jiān)聽接口。一個監(jiān)聽器可以監(jiān)聽多個事件源,一個事件源也可以注冊多個監(jiān)聽器注冊監(jiān)聽器時使用addXXXlistener()方法,刪除時則使用removeXXXlistener()方法(例如刪除動作事件監(jiān)聽器可以使用removeActionlistener方法);10.1.3

Java的事件處理類Java的事件一般包括兩種類型:用戶事件和系統(tǒng)事件。用戶事件:由用戶動作引發(fā)的事件。例如,用戶操作鼠標,按下鍵盤鍵等;系統(tǒng)事件:由操作系統(tǒng)發(fā)出的事件。例如,窗口狀態(tài)變化時自動刷新窗口內容等。這里我們只探討用戶事件。圖10-2AWT包的事件處理類層次AWT組件事件都是由java.awt.AWTEvent類派生得到,它也是EventObject類的子類。AWT事件共有12種類型,如圖10-2所示10.1.4Java的事件及其監(jiān)聽器接口事件類別功能描述接口名接口中方法ActionEvent動作事件ActionListeneractionPerformed(ActionEvnete)TextEvent文本事件TextListenertextValueChanged(TextEvente)AdjustementEvent調整事件AdjustmentListeneradjustmentValueChanged(AdjustmentEvente)ItemEvent項目事件ItemListeneritemStateChanged(ItemEvente)FocusEvent焦點事件FocusListenerfocusGained(FocusEvente)focusLost(FocusEvente)ContainerEvent容器事件ContainerListenercomponentAdded(ContainerEvente)componentRemoved(ContainerEvente)ComponentEvent組件事件ComponentListenercomponentHidden(ComponentEvente)componentMoved(ComponentEvente)componentResized(ComponentEvente)componentShown(ComponentEvente)AWT事件類共有10類,相應監(jiān)聽器接口共有11個。它們的對應關系及功能如表10-2。事件類別功能描述接口名接口中方法WindowEvent窗口事件WindowListenerwindowActived(WindowEvente)windowClosed(WindowEvente)windowClosing(WindowEvente)windowDectivated(WindowEvente)windowDeiconified(WindowEvente)windowIconfied(WindowEvente)windowOpened(WindwEvente)MouseEvent鼠標事件MouseListenermouseClicked(MouseEvente)mouseEntered(MouseEvente)mouseExited(MouseEvente)mousePressed(MouseEvente)mouseReleased(MouseEvente)鼠標移動事件MouseMotionListenermouseDragged(MouseMotionEvente)mouseMoved(MouseMotionEvente)KeyEvent鍵盤事件KeyListenerkeyPressed(KeyEvente)keyReleased(KeyEvente)keyTyped(KeyEvente)表10-3部分事件類的常用方法事件類可產(chǎn)生事件的組件事件類的方法方法功能描述ActionEventButton,List,MenuItem,TextField等getActionCommand()返回與此動作相關的命令字符串。TextEventTextArea,TextFieldparamString()返回標識此文本事件的參數(shù)字符串。AdjustmentEventScrollbargetValue()getAdjustmentType()返回調整事件中的當前值。返回導致值更改的調整類型。ItemEventList,Choice,Checkbox,CheckboxMenuItemgetItem()getStateChange()返回受事件影響的項。返回狀態(tài)更改的類型(選中或取消)。MouseEvent大部分組件getClickCount()getPoint()getX()getY()返回鼠標單擊次數(shù)。返回鼠標事件相對于源組件的x、y位置。返回鼠標事件相對于源組件的水平x坐標。返回鼠標事件相對于源組件的垂直y坐標。KeyEvent大部分組件getKeyChar()getKeyCode()返回與按鍵相關聯(lián)的字符。返回與按鍵相關聯(lián)的鍵整數(shù)值。事件類的方法:包括從父類AWTEvent類中繼承的方法和事件類本身特有的方法。事件類的靜態(tài)整形成員屬性每種事件類都有一些從父類AWTEvent類中繼承下來的或是本身特有的靜態(tài)整形成員屬性,主要是一些描述當前組件的狀態(tài)的值。如KeyEvent.VK_LEFT屬性代表鍵盤“左箭頭鍵”。部分成員屬性會在后面的“事件處理示例”一節(jié)中提及。事件處理-內容目錄事件處理概述事件處理示例事件適配器10.2事件處理示例10.2.1動作事件與項目事件10.2.2文本事件10.2.3鍵盤事件10.2.4鼠標事件10.2.5窗口事件10.2事件處理示例10.2.1動作事件與項目事件動作事件(ActionEvent)是由用戶動作造成組件的動作(比如按下按鈕)產(chǎn)生的,(注意:要使鍵盤在Button組件上觸發(fā)ActionEvent,需使用空格鍵)。項目事件(ItemEvent)是由用戶在具備項目選擇能力的組件(比如列表框,選擇框等)上觸發(fā)。例10-2:ActionEvent與ItemEvent示例(要求:從列表框中選擇項目,單擊按鈕時,選中的項目顯示在文本框中)其中ActionEvent由ActionListener接口的actionPerformed()方法處理;ItemEvent由ItemListener接口的itemStateChanged()方法處理。MultiListener.java程序代碼importjava.awt.*;importjava.awt.event.*;//類MultiListener實現(xiàn)了兩個接口publicclassMultiListenerextendsFrameimplementsActionListener,ItemListener{Listlist=newList(4,true);TextFieldt1=newTextField(20);Buttonb1=newButton("顯示");Panelp=newPanel();Strings[]={“籃球”,“足球”,“乒乓球”,“羽毛球”};//初始化愛好內容

intnum=0;//選擇愛好的個數(shù)publicMultiListener(Stringtitle){ super(title); for(inti=0;i<4;i++)//向列表框中添加愛好 list.add(s[i]); p.add(newLabel("您選擇的愛好是:")); p.add(t1); p.add(b1); this.add(list,"Center"); this.add(p,"South"); b1.addActionListener(this);//為按鈕b1注冊動作監(jiān)聽器 list.addItemListener(this);//為列表框list注冊項目監(jiān)聽器 pack();//緊湊窗體 this.setVisible(true);}publicvoidactionPerformed(ActionEvente){ if(e.getSource()==b1)//判斷是否單擊了按鈕b1 { Stringstr[]=list.getSelectedItems();//獲取列表框中所有選擇的項目,存入字符串數(shù)組str中 Stringstr_show="";//將要顯示在文本框中的字符串 for(inti=0;i<str.length;i++) str_show=str_show+str[i]+",";//將所有愛好字符串連接到str_show字符串 t1.setText(str_show);//在文本框t1中顯示愛好字符串

} }publicvoiditemStateChanged(ItemEvente){ if(e.getStateChange()==1)//判斷列表框中是否有項目被選擇 { num++;//愛好數(shù)加1 t1.setText("您選中了"+num+"個愛好!"); } if(e.getStateChange()==ItemEvent.DESELECTED)//判斷列表框中是否有項目被取消選擇 { num--;//愛好數(shù)減1 t1.setText("您取消了一個愛好!"); }}publicstaticvoidmain(String[]args){ newMultiListener("多接口示例!");}}運行結果【運行結果】(顯示如圖1所示的窗口,當選擇列表框中的愛好時,文本框顯示你選擇的愛好的個數(shù)。)(圖1)(當單擊“顯示”按鈕時,顯示如圖2所示的窗口,文本框顯示你選擇的愛好。)(圖2)10.2.2文本事件文本組件(如TextField,TextArea)在文本內容發(fā)生改變時(如鍵入,刪除字符時),會產(chǎn)生TextEvent類型事件。處理TextEvent的接口是TextListener,接口中的方法textValueChanged(TextEvente)importjava.awt.*;importjava.awt.event.*;importjava.util.StringTokenizer;//StringTokenizer類在util包中publicclassTextEventDemoextendsFrameimplementsTextListener{ TextFieldt1=newTextField(30); Labellab=newLabel(""); Stringstr=""; StringTokenizerst; publicTextEventDemo(Stringtitle) {super(title); this.add(t1,"North"); this.add(lab,"South"); t1.addTextListener(this);//為文本框t1注冊文本監(jiān)聽器

this.pack();//緊湊窗口

this.setVisible(true); }publicvoidtextValueChanged(TextEvente){ if(e.getSource()==t1)//判斷是否在文本框上產(chǎn)生了文本事件

{ str=t1.getText(); st=newStringTokenizer(str,"'.?");//以空格、單引號、句號、問號做為分隔符分析str字符串有多少字符串子段

intnum=st.countTokens();//計算句子中單詞的個數(shù)

lab.setText("現(xiàn)在單詞個數(shù):"+num+"個"); this.add(lab,"South"); }}publicstaticvoidmain(String[]args){ newTextEventDemo("實時單詞計算");}}運行結果】(顯示如圖所示的窗口,當在文本框中輸入句子時,標簽中會顯示句子中單詞的個數(shù)。)10.2.3鍵盤事件當在事件源組件上按下鍵盤鍵時會發(fā)生KeyEvent。在KeyListener接口中有三個方法:keyPressed()、keyTyped()、keyReleased()。keyPressed()方法處理鍵盤鍵按下,keyReleased()方法處理鍵盤鍵釋放,keyTyped()方法是keyPressed()方法與keyReleased()方法的組合,當鍵盤鍵按下后又釋放就會調用keyTyped()方法。Java如何判斷是那個鍵被按下呢?表10-4列舉了部分KeyEvent類中定義的靜態(tài)常量(注意:表中常量都是publicstaticfinalint型)。表10-4KeyEvent類中的靜態(tài)常量鍵碼常量對應功能鍵對應整形常量VK_F1~VK_F12功能鍵F1-F12112~123VK_LEFT向左箭頭鍵37VK_UP向上箭頭鍵38VK_RIGHT向右箭頭鍵39VK_DOWN向下箭頭鍵40VK_KP_LEFT數(shù)字鍵盤向左方向鍵226VK_HOMEHOME鍵36VK_ENTER回車鍵10VK_TAB制表位鍵9VK_BACK_SPACE退格鍵8VK_SHIFTShift鍵16VK_CONTROLCtrl鍵17VK_ALTAlt鍵18VK_SPACE空格鍵32VK_0~VK_9數(shù)字0~9鍵48~57VK_A~VK_Z字母a~z鍵65~90表10-5KeyEvent類中的方法方法功能描述getKeyChar()返回與此事件中的鍵相關聯(lián)的字符。getKeyCode()返回與此事件中的鍵相關聯(lián)的整數(shù)keyCode。getKeyModifiersText(intmodifiers)返回描述組合鍵的String,如“Shift”或“Ctrl+Shift”。getKeyText(intkeyCode)返回描述keyCode的String,如“F1”或“A”。例10-4:KeyEvent中的按鍵示例(要求在窗體中按下鍵盤鍵時,文本框中會顯示響應的鍵名)importjava.awt.*;importjava.awt.event.*;publicclassKeyEventDemoextendsFrameimplementsKeyListener{ TextFieldt1=newTextField(25); Labellab=newLabel("在窗口中按下鍵盤鍵,會顯示相應鍵碼"); Panelp=newPanel();publicvoidkeyPressed(KeyEvente){ t1.setText(""); t1.setText(e.getKeyText(e.getKeyCode()));//獲取并顯示按鍵信息}publicvoidkeyTyped(KeyEvente){}//必須重寫publicvoidkeyReleased(KeyEvente){}//必須重寫publicKeyEventDemo(Stringtitle){ super(title); t1.setEditable(false);//設置文本框t1為不可編輯 p.add(lab); p.add(t1); add(p); this.addKeyListener(this);//為窗體注冊監(jiān)聽器 setSize(220,100); setVisible(true); this.requestFocus(true);//將焦點設置在窗體上,此句為必須}publicstaticvoidmain(String[]args){ newKeyEventDemo("KeyEvent中的按鍵示例");}}運行結果【運行結果】(顯示如圖所示的窗口,當焦點在當前窗口上,并按下鍵盤鍵Alt時,文本框顯示你按鍵的鍵名字符串“Alt”。)10.2.4鼠標事件當鼠標按下、釋放、進入、離開組件,或在組件上方移過、拖曳時都會發(fā)生鼠標事件。鼠標事件大致分為兩類:普通鼠標事件(鼠標按下、釋放、進入、離開)和鼠標拖動事件(鼠標移過、拖曳)。分別由兩個接口處理,其中MouseListener接口處理普通鼠標事件(接口中包含5個方法),MouseMotionListener接口處理鼠標拖動事件(接口中包含2個方法),參考表10-2。例10-6:MouseListener接口示例(要求:可以記錄窗口上鼠標按下、釋放、進入、離開和單、雙擊的位置)importjava.awt.*;importjava.awt.event.*;publicclassMouseListenerDemoextendsFrameimplementsMouseListener{ Labelmessage=newLabel("這里顯示鼠標動作");publicMouseListenerDemo(Stringtitle){ super(title); this.add(message,"North"); this.addMouseListener(this); this.setSize(200,150); this.setVisible(true);}例10-6:MouseListener接口示例publicvoidmousePressed(MouseEvente){//重寫接口的方法

message.setText("鼠標被按下,位置在:"+e.getX()+","+e.getY()); }publicvoidmouseReleased(MouseEvente){ message.setText("鼠標被釋放,位置在:"+e.getX()+","+e.getY()); }publicvoidmouseEntered(MouseEvente){ message.setText("鼠標已進入,位置在:"+e.getX()+","+e.getY()); }publicvoidmouseExited(MouseEvente){ message.setText("鼠標已退出,位置在:"+e.getX()+","+e.getY()); }publicvoidmouseClicked(MouseEvente){ if(e.getClickCount()==1){//判斷鼠標擊鍵的次數(shù)是否為單擊

message.setText("鼠標單擊,位置在:"+e.getX()+","+e.getY()); } if(e.getClickCount()==2){//判斷鼠標擊鍵的次數(shù)是否為雙擊

message.setText("鼠標雙擊,位置在:"+e.getX()+","+e.getY()); } }publicstaticvoidmain(String[]args){ newMouseListenerDemo("鼠標MouseListener接口示例"); }}運行結果【運行結果】(顯示窗口如圖所示,當在窗體中鼠標鍵按下、釋放、進入、離開和單、雙擊時,會顯示鼠標動作的發(fā)生位置。)例10-7:MouseMotionListener接口示例importjava.awt.*;importjava.awt.event.*;publicclassMouseMotionListenerDemoextendsFrameimplementsMouseMotionListener{Buttonb1=newButton("Movehere!");publicMouseMotionListenerDemo(Stringtitle){ super(title); this.setLayout(newFlowLayout()); this.add(b1); b1.addMouseMotionListener(this);//為按鈕注冊監(jiān)聽器 this.addMouseMotionListener(this);//為窗體注冊監(jiān)聽器 this.setSize(200,100); this.setVisible(true);}publicvoidmouseMoved(MouseEvente){//重寫接口方法 /*為按鈕b1設置手型鼠標光標*/ b1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));}publicvoidmouseDragged(MouseEvente){//重寫接口方法 /*為當前窗體設置等待型鼠標光標*/ this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));}publicstaticvoidmain(String[]args){ newMouseMotionListenerDemo("鼠標MouseMotionListener接口示例");}}運行結果【運行結果】(當鼠標經(jīng)過窗體中的按鈕上方時,顯示窗口如下圖所示)(當鼠標在窗體中拖曳時,顯示窗口如下圖所示)10.2.5窗口事件窗體做為GUI界面的頂級容器,可以產(chǎn)生打開、關閉、激活、圖標化等事件,在WindowListener接口中包含7個方法,見表10-2表10-5詳細介紹了這7個方法的功能。方法功能描述windowOpened(WindwEvente)窗體首次打開時調用windowClosed(WindowEvente)窗體調用dispose而關閉時調用windowActived(WindowEvente)將窗體設置為活動窗體(焦點在此窗體)時調用windowDectivated(WindowEvente)將窗體設置為非活動窗體(焦點不在此窗體)時調用windowIconfied(WindowEvente)窗體從正常狀態(tài)變?yōu)樽钚』瘓D標狀態(tài)時調用windowDeiconified(WindowEvente)窗體從正常狀態(tài)變?yōu)樽钚』瘓D標狀態(tài)時調用windowClosing(WindowEvente)試圖從窗體的系統(tǒng)菜單中關閉窗口時調用例10-8:WindowListener接口示例importjava.awt.*;importjava.awt.event.*;publicclassWindowListenerDemoextendsFrameimplementsWindowListener,ActionListener{TextAreatxtMsg=newTextArea(6,30);ButtonbtnClose=newButton("關閉窗口");WindowListenerDemo(Stringtitle){super(title);add(txtMsg,"Center");add(btnClose,"South");btnClose.addActionListener(this);//注冊Action事件監(jiān)聽器addWindowListener(this);//注冊Window事件監(jiān)聽器pack();setVisible(true);}publicvoidactionPerformed(ActionEvente)//按鈕事件處理方法{System.exit(0);//終止JVMthis.dispose();//釋放窗體占用的資源}//以下7個方法為處理WindowListener中的方法publicvoidwindowOpened(WindowEvente)//窗口打開時執(zhí)行{txtMsg.append("您已經(jīng)打開了窗體!"+"\n");}publicvoidwindowClosed(WindowEvente){}//未使用publicvoidwindowIconified(WindowEvente){...}//窗口圖標化時執(zhí)行

publicvoidwindowDeiconified(WindowEvente){...}//窗口恢復常規(guī)顯示時執(zhí)行publicvoidwindowActivated(WindowEvente){...}//窗口激活時執(zhí)行publicvoidwindowDeactivated(WindowEvente){...}//窗口處于非活動狀態(tài)執(zhí)行

publicvoidwindowClosing(WindowEvente)//關閉窗口時執(zhí)行{System.exit(0);dispose();}publicstaticvoidmain(String[]args){newWindowListenerDemo("窗口事件應用");}}運行結果【運行結果】(如下圖所示的窗口經(jīng)過了打開、失去焦點、圖標化等操作)事件處理-內容目錄事件處理概述事件處理示例事件適配器10.3事件適配器(EventAdapter)在很多應用中,并不是事件接口中所有的方法都會被用戶使用,但是還要全

溫馨提示

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

評論

0/150

提交評論