版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第三章Swing界面設(shè)計課程目標Swing簡介Swing常用的控件(JButton、JLabel、JTextFiled、JComboBox)對話框(消息、警告、確認、輸入對話框)文件選擇對話框課程定位swing簡介Swing類Swing類是一組類,它提供比AWT標準組件更強大和更靈活的功能。除了我們已經(jīng)熟悉的組件如按鈕、復(fù)選框和標簽外,Swing類還提供了許多新的組件,如選項卡窗格、滾動窗格、樹、表格等。在詳細介紹Swing類之前我們先體會一下Swing類同AWT類的不同,我們先來運行一下JDK中DEMO里的SwingSet2.jar,位于Java的JDK安裝目錄jdk1.5.0\demo\jfc\SwingSet2下。運行后如圖所示:演示Swing類的層次結(jié)構(gòu)在javax.swing包中,定義了兩種類型的組件:頂層容器(JFrame,JApplet,JDialog和JWindow)和輕量級組件。Swing組件都是AWT中Container類的直接子類和間接子類。
java.awt.Component-java.awt.Container-java.awt.Window-java.awt.Frame-javax.swing.JFrame-javax.Dialog-javax.swing.JDialog-javax.swing.JWindow-java.awt.Applet-javax.swing.JApplet-javax.swing.Box-javax.swing.Jcomponet Javax.swing包是Swing提供的最大包,它包含將近100個類和25個接口,幾乎所有的Swing組件都在swing包中。Swing程序結(jié)構(gòu)Swing類的程序設(shè)計一般可按照下列流程來進行:(1)引入Swing包(2)選擇“外觀和感覺”(3)設(shè)置頂層容器(4)設(shè)置按鈕和標簽(5)向容器中添加組件(6)在組件周圍添加邊界(7)進行事件處理流程JFrame與FrameJFrame是在Swing中經(jīng)常使用到的組件,大家可以把它看成是最底層的容器。這個容器里面可以裝載各種Swing的控件類(例如JLabel、JButton等等),也可以裝載其他的容器。至于如何擺放這些控件和容器,Swing的解決辦法和AWT是一樣的,都應(yīng)用了一套相同的版面管理器。由此可以看出Swing生成界面的方法與AWT生成界面的方法是大同小異的。JFrame類繼承了Frame類,所以JFrame的功能要比Frame的功能多得多。常用控件上一節(jié)中我們簡單介紹了Swing的初步知識,下面我們詳細介紹Swing中的組件。 Swing中的常用組件如下表所示:組件類名稱功能JButton按鈕用來進行點擊觸發(fā)事件,實現(xiàn)具體操作JLabel標簽放置提示性的圖片或文字JTextField文本域支持單行文本輸入JTextArea文本區(qū)支持多行文本輸入JRadioButton單選框支持單項選擇JCheckbox復(fù)選框支持多項選擇JList列表框列出所有的選項進行選擇JComboBox選擇框列出所有的選項進行選擇,并且支持自定義選項按鈕(JButton)按鈕在窗體界面程序設(shè)計中是最常用的控件,Swing中提供以下的構(gòu)造函數(shù)來建立一個按鈕對象: JButton() 建立一個按鈕JButton(Iconicon) 建立一個有圖像的按鈕JButton(Stringtext) 建立一個有文字標簽的按鈕JButton(Stringtext,Iconicon) 建立一個有圖像和文字的按鈕JButton常用的方法如下: addActionListener(ActionListenerI) 在按鈕上添加事件監(jiān)聽器 grabFocus() 請求焦點 setEnable(booleanb) 設(shè)置按鈕是否可用 setVisible(booleanb) 設(shè)置按鈕是否可見示例
importjava.awt.*; importjavax.swing.*; publicclassJButtonAppextendsJFrame{ Containercon=this.getContentPane();
JButtonbutton1=newJButton("按鈕一");
JButtonbutton2=newJButton("按鈕二");
JButtonbutton3=newJButton("按鈕三"); publicJButtonApp(){
super("JButton示例");
con.setLayout(new
FlowLayout()); button1.setEnabled(false); button2.setVisible(false); con.add(button1); con.add(button2); con.add(button3);
this.pack();
this.show(); } publicstaticvoidmain(String[]args){ newJButtonApp(); } }標簽(JLabel)這個組件主要用來放置提示性的文本或圖形。以下是JLabel類的構(gòu)造函數(shù)和常用方法。構(gòu)造函數(shù):
JLabel() 建立一個空白的標簽組件。 JLabel(Iconimage) 建立一個含有圖標的標簽組件,默認排列方式為CENTER。 JLabel(Iconimage,inthorizontalAlignment) 建立一個含有圖標的標簽組件,并指定其排列方式。 JLabel(Stringtext) 建立一個含有文字的標簽組件,默認排列方式為LEFT。 JLabel(Stringtext,inthorizontalAlignment) 建立一個含有文字的標簽組件,并指定其排列方式。 JLabel(Stringtext,Iconicon,inthorizontalAlignment) 建立一個含有文字和圖標的標簽組件,并指定其排列方式。Jlabel的常用方法setHorizontalAlignment(intalignment) 設(shè)置標簽內(nèi)文字或圖像的水平位置。setHorizontalTextPosition(inttextPosition) 設(shè)置標簽內(nèi)文字相對于圖像的水平位置。setIcon(Iconicon) 設(shè)置標簽內(nèi)的圖像。setIconTextGap(inticonTextGap) 設(shè)置標簽內(nèi)文字與圖像的間距。setText(Stringtext) 設(shè)置標簽內(nèi)的文字。setVerticalAlignment(intalignment) 設(shè)置標簽內(nèi)文字或圖像的垂直位置。setVerticalTextPosition(inttextPosition) 設(shè)置標簽內(nèi)文字相對于圖像的垂直位置。示例
importjava.awt.*; importjavax.swing.*; publicclassJLabelAppextendsJFrame{ Containercon=this.getContentPane();
JLabellabel1=newJLabel("第一個標簽");
JLabellabel2=newJLabel("第二個標簽");
JLabellabel3=newJLabel("第三個標簽");
publicJLabelApp(){ super("JLabel示例");
con.setLayout(newGridLayout(1,3)); label1.setHorizontalAlignment(JLabel.RIGHT); label2.setVerticalAlignment(JLabel.BOTTOM); con.add(label1); con.add(label2); con.add(label3); this.setSize(300,200);
this.show(); } publicstaticvoidmain(String[]args){ newJLabelApp(); } }文本域(JTextField)JTextField是一種單行文本輸入組件。構(gòu)造函數(shù):JTextField() 建立一個文本域。JTextField(Documentdoc,Stringtext,intcolumns) 使用指定的文件存儲模式建立一個文本域,并且設(shè)置其 初始字符串和字段長度。JTextField(intcolumns) 建立一個文本域,并設(shè)置其初始字段長度。JTextField(Stringtext) 建立一個文本域,并設(shè)置其初始字符串。JTextField(Stringtext,intcolumns) 建立一個文本域,并設(shè)置其初始字符串和字段長度。JTextField的常用方法setColumns(intcolumns) 設(shè)置文本域的字段長度setEditable(booleanb) 設(shè)置文本域是否可編輯setFont(Fontfont) 設(shè)置文本域內(nèi)文本字體setText(Stringtext) 設(shè)置文本域的字符串JTextField示例
importjava.awt.*; importjavax.swing.*; publicclassJTextFieldAppextendsJFrame{ Containercon=this.getContentPane();
JTextFieldtextField1=newJTextField();
JTextFieldtextField2=newJTextField("第二個文本框");
JTextFieldtextField3=newJTextField("第三個文本框",10); publicJTextFieldApp(){
super("JTextField示例");
con.setLayout(new
FlowLayout()); textField1.setColumns(10); textField2.setEditable(false); con.add(textField1); con.add(textField2); con.add(textField3);
this.pack();
this.show(); } publicstaticvoidmain(String[]args){ newJTextFieldApp(); } }選擇框(JComboBox)JComboBox組件一般被稱為下拉式列表框,它可以讓用戶瀏覽一系列的選項并選出或自己輸入想要的值。JComboBox的構(gòu)造方法和常用的使用方法如下:構(gòu)造方法: JComboBox() 建立一個新的JComboBox組件 JComboBox(ComboBoxModelaModel) 利用ComboBoxModel建立一個新的JComboBox組件 JComboBox(Object[]items) 利用Array數(shù)組對象建立一個新的JComboBox組件 JComboBox(Vectoritems) 利用Vector矢量集對象建立一個新的JComboBox組件JComboBox常用的方法: voidaddItem(Objectobj) 將對象obj添加到下拉列表框顯示的項目中。intgetItemCount() 返回下拉列表框的項目的總數(shù)。ObjectgetSelectedItem() 返回當前選中的項目。voidremoveAllItems() 移除下拉列表框中所有的項目。voidremoveItemAt(intindex) 移除項目索引值為index的項目。voidsetEditable(booleanb) 設(shè)置下拉列表框是否可編輯。voidsetSelectedIndex(intindex) 設(shè)置索引值為index的項目的狀態(tài)為已選中。示例
importjava.awt.*; importjavax.swing.*; publicclassJComboBoxAppextendsJFrame{
JComboBoxyearBox1=newJComboBox();
JComboBoxyearBox2=newJComboBox();
JComboBoxmonthBox1=newJComboBox();
JComboBoxmonthBox2=newJComboBox();
JPanelpanel=newJPanel();
JLabel
startDate=newJLabel("開始日期");
JLabel
endDate=newJLabel("終止日期");
publicJComboBoxApp(){
super("JComboBox示例");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.add(startDate);
for(inti=2000;i<=2008;i++) yearBox1.addItem(i+"");
for(inti=1;i<31;i++) monthBox1.addItem(i+""); panel.add(yearBox1); panel.add(monthBox1);
panel.add(endDate);
for(inti=2000;i<=2008;i++) yearBox2.addItem(i+"");
for(inti=1;i<31;i++) monthBox2.addItem(i+""); panel.add(yearBox2); panel.add(monthBox2); this.setSize(180,110);
this.setContentPane(panel);
this.show(); } publicstaticvoidmain(String
args[]){ newJComboBoxApp(); } }對話框在Windows平臺下用MessageBox來實現(xiàn)和用戶的交互功能,在JAVA中也有同樣的類來實現(xiàn)這樣的功能,利用Swing中提供的JOptionPane類。四個標準對話框如下:MessageDialog(消息對話框) 用來顯示信息給用戶。ConfirmDialog(確認對話框) 提出問題,然后由用戶自己來 確認(按"Yes"或"No"按鈕)InputDialog(輸入對話框) 提示輸入文本。OptionDialog(選項對話框) 組合其它三個對話框類型。消息對話框消息對話框是一個簡單的顯示消息的窗口,只是給用戶提供提示信息。如圖所示消息對話框:消息對話框可以通過調(diào)用JOptionPane類的showMessageDialog(Compont,Object)方法來創(chuàng)建,參數(shù)是父組件和字符串(或者組件、顯示的圖標)。如以下語句創(chuàng)建一個顯示簡單字符的消息對話框: JOptionPane.showMessagDialog(null,”WelcomeToQinghuaIT…”);還可以使用showMessageDialog(Component,Object,String,int)方法來創(chuàng)建一個顯示警告消息的對話框,可以自己設(shè)置想要顯示的消息對話框的標題。用法同showInputDialog()方法,參數(shù)相同但無返回值。如以下語句創(chuàng)建一個消息輸入對話框: JOptionPane.showMessagDialog(null,”文件被刪除”,”刪除警告”,JOptionPane.WARNING_MESSAGE);確認對話框創(chuàng)建確認對話框的最簡單方法就是調(diào)用showConfirmDialog(Component,Object)方法,參數(shù)意義同消息對話框中的參數(shù)相同。 不同的是該方法返回一個整數(shù),JOptionPane的三個屬性:YES_OPTIONNO_OPTIONCANCEL_OPTION示例
importjava.awt.*; importjavax.swing.*; importjava.awt.event.*; importjava.util.EventListener; publicclassMessageDialogAppextendsJFrameimplementsActionListener{ JButtonbutton1=newJButton("顯示消息對話框一"); JButtonbutton2=newJButton("顯示消息對話框二"); publicMessageDialogApp(){ super("MessageDialog示例"); this.setLayout(newFlowLayout()); button1.addActionListener(this);
button2.addActionListener(this); this.add(button1); this.add(button2); this.setSize(180,160);
this.show(); } publicstaticvoidmain(String
args[]){ newMessageDialogApp(); } publicvoidactionPerformed(ActionEvente){
if(e.getSource()==button1){
JOptionPane.showMessageDialog(null,"WelcomeToQinghuaIT..."); }
if(e.getSource()==button2){
JOptionPane.showMessageDialog(null,"出現(xiàn)錯誤", "錯誤警告",JOptionPane.WARNING_MESSAGE); } } }輸入對話框輸入對話框提出一個問題,并使用文本域來存儲響應(yīng)。創(chuàng)建輸入對話框的最簡單方法就是調(diào)用showInoutDialog(ComponertObject)方法,參數(shù)和消息對話框中的參數(shù)相同。調(diào)用輸入對話框方法返回一個表示用戶響應(yīng)的字符串。如以下語句創(chuàng)建了一個簡單的輸入對話框:
StringinputText=IOptionPane.showInputDialog(null,“請輸入你的姓名:”);示例
importjava.awt.*; importjavax.swing.*; importjava.awt.event.*; importjava.awt.event.ActionListener; importjava.util.EventListener; publicclassInputDialogAppextendsJFrameimplementsActionListener{
JButtonbutton1=newJButton("輸入你的姓名");
JLabellabel=newJLabel("你的姓名是:"); publicInputDialogApp(){
super("InputDialog示例");
this.setLayout(new
FlowLayout()); button1.addActionListener(this); this.add(button1);
this.add(label); this.setSize(200,120);
this.show(); } publicstaticvoidmain(String
args[]){ newInputDialogApp(); } publicvoidactionPerformed(ActionEvente){
if(e.getSource()==button1){ StringinputText=JOptionPane.showInputDialog(this,"你的姓名是:");
this.label.setText("你的姓名是:"+inputText); } } }對話框的應(yīng)用對話框就是用來和用戶進行交互的,不同的對話框,代表著與用戶交互的不同方式。添加代碼片段就可以實現(xiàn)和用戶交互,從而大大的豐富了程序的適用性。比如做個類似的備忘程序,在某一時間提醒用戶進行某一操作,就可以用上面講到的對話框來實現(xiàn)。文件選擇對話框文件選擇對話框“JFileChooser”用來引用文件到程序中進行查看、修改等其他操作,“JFileChooser”內(nèi)建有“打開”,“存儲”兩種對話框,也可以自己定義其他種類的對話框。 JFileChooser有六個構(gòu)造函數(shù)來生成JFilerChooser對象,常用的有兩個: JFileChooser() 構(gòu)造一個指向用戶默認目錄的JFileChooser。JFileChooser(FilecurrentDirectory) 使用給定的File作為路徑來構(gòu)造一個JFileChooser。JFileChooser常用的方法showOpenDialog(Componentparent)彈出一個"OpenFile"文件選擇器對話框。showSaveDialog(Componentparent)彈出一個"SaveFile"文件選擇器對話框。getCurrentDirectory() 返回當前目錄。getName(Filef) 返回文件名。getSelectedFile() 返回選中的文件。setFileFilter(FileFilterfilter) 設(shè)置當前文件過濾器。setFileSelectionMode(intmode) 設(shè)置JFileChooser,以允許用戶只選擇文件、 只選擇目錄,或者可選擇文件和目錄isMultiSelectionEnabled() 如果可以選擇多個文件,則返回true。isTraversable(Filef) 如果可以返回該文件(目錄),則返回true。setDialogType(intdialogType) 設(shè)置此對話框的類型。setDialogTitle(Stringtitle)設(shè)置顯示在JFileChooser窗口標題欄的字符串。JFileChooser常用的字段OPEN_DIALOG:指示JFileChooser支持“Open”文件操作的類型值SAVE_DIALOG:指示JFileChooser支持“Save”文件操作的類型值FILES_ONLY: 指示僅顯示文件DIRECTORIES_ONLY: 指示僅顯示目錄FILES_AND_DIRECTORIES: 指示顯示文件和目錄下面的語句可以彈出一個針對用戶主目錄的打開文件選擇器,并設(shè)置文件過濾器使只顯示目錄中的.jpg格式和.gjf格式的圖像文件。
示例
JFileChooserchooser=newJFileChooser();
ExampleFileFilterfilter=newExampleFileFilter();
filter.addExtension("jpg");
filter.addExtension("gif");
filter.setDescription("JPG&GIFImages");
chooser.setFileFilter(filter);
chooser.setDialogType(JFileChooser.OPEN_DIALOG);
int
returnVal=chooser.showOpenDialog(parent);
if(returnVal==JFileChooser.APPROVE_OPTION) {
System.out.println("Youchosetoopenthisfile:"+
chooser.getSelectedFile().getName()); }//ExampleFileFilter類是JDK內(nèi)的例子,在demo/jfc目錄下,請自己參考。本章總結(jié)SwingSwing常用的控件(JButton、JLabel、JTextFiled、JComboBox)對話框(消息、警告、確認、輸入對話框)文件選擇對話框動手實踐:圖片瀏覽器圖形處理的應(yīng)用圖片瀏覽器目標使用FileChooser文件選擇對話框選擇圖片目錄,將目錄下的圖片文件名在選擇框中顯示當選擇不同的文件名時,窗體中將顯示出對應(yīng)的圖片,以實現(xiàn)圖片瀏覽的功能。本程序啟動后,出現(xiàn)圖片瀏覽器的窗體界面,運行效果如所示:目標點擊“請選擇目錄”按鈕,彈出“打開”文件對話框此處我們選擇一個有圖片的目錄,點擊“打開”按鈕。如果此目錄下存在“jpg”或者“gif”格式的圖片,則窗體正中會出現(xiàn)一幅圖片。運行效果如圖所示:選擇下拉框中此時會出現(xiàn)所有此目錄下的jpg和gif格式的圖片名字,再選擇不同的文件名字就可以瀏覽該目錄下的圖片了。方法(1)用戶可以選擇或輸入圖片目錄,目錄中的圖片名加入到JComboBox里。(2)用戶選擇下拉框里的文件名后,可以在窗體的面板上顯示該圖片。(1)建立面板類顯示圖片(1)首先我們要做一個繼承JPanel的面板類,用來在該面板居中繪制顯示圖片。參考代碼如下:
importjavax.swing.*; importjava.awt.*; classPicPanelextendsJPanel{
ImageIconimage;
int
startX; //圖片在該JPanel中繪制的起始點
int
startY;
int
imageH; //圖像寬和高
int
imageW; publicPicPanel(){ image=null; } publicvoidsetImg(ImageIcon
img){
this.image=img; }
publicvoidpaint(Graphicsg){
super.paint(g);//這句會防止繪圖面板出現(xiàn)當前圖形
if(this.image!=null){
imageH=this.image.getIconHeight();
imageW=this.image.getIconWidth();
startX=this.getWidth()/2-imageW/2;
startY=this.getHeight()/2-imageH/2;
g.drawImage(this.image.getImage(),startX,startY,this);//使得圖片居中顯示
} } }(2)總體界面設(shè)計(2)有了繪圖面板之后,下面我們設(shè)計窗體,在窗體中添加一個JPanel存放JButton、JLabel以及JComboBox、我們設(shè)計的繪圖面板PicPanel、還有一個JFileChooser(文件選擇對話框)。自定義兩個全局變量filePath和fileName用來存放文件的目錄和名字,設(shè)置布局及窗體的大小,并添加按鈕事件和ComboBox的Item事件。代碼importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;importjava.awt.event.ActionListener;importjava.util.EventListener;importjava.awt.event.ItemListener;publicclassImageViewerextendsJFrameimplementsActionListener,ItemListener{
JFileChooserchooser=newJFileChooser();
JButton
chooseButton=newJButton("請選擇目錄");
JComboBox
chooseComboBox=newJComboBox();
JLabellabel=newJLabel("選擇目錄中的文件:");
JLabel
picLabel=newJLabel();
PicPanel
picPanel=newPicPanel();
JPanel
choosePanel=newJPanel();//放按鈕,標簽,下拉框面板
StringfilePath; //選擇的文件所在的目錄
StringfileName; //選擇的文件名字
publicImageViewer(){ super("圖片瀏覽器");
this.setLayout(new
BorderLayout());
this.add(picPanel,BorderLayout.CENTER); //設(shè)置只允許選擇目錄
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
choosePanel.setLayout(new
FlowLayout());
chooseButton.addActionListener(this); //注冊按鈕事件
choosePanel.add(chooseButton);
choosePanel.add(label); chooseComboBox.setSize(16,10);
chooseComboBox.addItemListener(this); //注冊Item事件
choosePanel.add(chooseComboBox);
this.add(choosePanel,BorderLayout.SOUTH); this.setSize(400,300);
this.show(); }
publicvoidactionPerformed(ActionEvente){ //……按鈕事件,彈出文件選擇對話框,并記錄選擇的目錄路徑
}publicvoiditemStateChanged(ItemEvente){ //……Item事件,修改繪圖面板PicPanel中的ImageIcon并重繪該面板
} publicstaticvoidmain(String
args[]){ newImageViewer(); }}(3)建立文件列表(3)在實現(xiàn)事件方法之前我們要用到一個方法,即:用來根據(jù)文件路徑來讀取該目錄下的所有文件名,并循環(huán)作為Item添加到我們的JComboBox中去。實現(xiàn)根據(jù)文件后綴名來對文件進行篩選。參考代碼如下:
publicvoidreadFileDirs(String
file
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 壽司餐館服務(wù)行業(yè)營銷策略方案
- 碳素材料細分市場深度研究報告
- 彈花齒條產(chǎn)業(yè)鏈招商引資的調(diào)研報告
- 危機管理培訓行業(yè)相關(guān)項目經(jīng)營管理報告
- 發(fā)行有價證券行業(yè)營銷策略方案
- PET塑料瓶的回收利用行業(yè)營銷策略方案
- 刻度機產(chǎn)品供應(yīng)鏈分析
- 塑料加工機器產(chǎn)品供應(yīng)鏈分析
- 聲音和影像的數(shù)字化行業(yè)營銷策略方案
- 裝釣魚假餌用盒商業(yè)機會挖掘與戰(zhàn)略布局策略研究報告
- 2024年巴黎奧運會
- 人教版(2024)七年級全一冊體育與健康第6課《識別界限 拒絕性騷擾》教學設(shè)計
- MOOC 創(chuàng)業(yè)基礎(chǔ)-暨南大學 中國大學慕課答案
- 施工現(xiàn)場臨時用電安全檢查表(共3頁)
- 勇者斗惡龍9圖文攻略
- 醫(yī)院年度財務(wù)報表和部門決算報表審計工作規(guī)程
- 陽離子纖維素總結(jié)資料
- 學校(紙盤畫)社團活動課程簡案
- 下肢動脈置管溶栓的護理要點
- 現(xiàn)代自然科學大事年表(1894 1985)
- 轉(zhuǎn)體梁施工技術(shù)總結(jié)(寶蘭-陳明濤)
評論
0/150
提交評論