輕松學之圖形界面編程_第1頁
輕松學之圖形界面編程_第2頁
輕松學之圖形界面編程_第3頁
輕松學之圖形界面編程_第4頁
輕松學之圖形界面編程_第5頁
已閱讀5頁,還剩55頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

輕松學之圖形界面編程第1頁,課件共60頁,創作于2023年2月16.1AWT簡介Java1.0的出現帶來了抽象窗口工具箱(AWT)。設計目標是希望構建一個通用的GUI,使得利用它編寫的程序能夠運行在所有的平臺上,以實現Sun公司提出的口號“一次編寫,隨處運行”。JavaAWT中包含了許多類來支持GUI設計。AWT由Java的java.awt包提供,該包中有許多用來設計GUI的組件類,如按鈕、菜單、列表、文本框等組件類;同時還包含窗口、面板等容器類。AWT的具體層次結構如圖16.1所示。第2頁,課件共60頁,創作于2023年2月16.1AWT簡介Java提供了一系列AWT軟件包,其中主要的包及包的描述如圖16.2所示。第3頁,課件共60頁,創作于2023年2月16.1AWT簡介java.awt包提供了基本的Java程序的GUI設計工具。主要包括組件、容器和布局管理器三個概念,其具體描述如圖16.3所示。第4頁,課件共60頁,創作于2023年2月16.2Swing簡介Swing是Java基礎類庫(JavaFoundationClasses)中有關圖形界面的類庫。Swing擴展自AWT。例如JFrame擴展自Frame,JButton擴展自Component等。基本上AWT中的每種控件都能在Swing中找到替代品,比如AWT中的Button對應于Swing中的JButton,AWT中的TextField對應于Swing中的JTextField等。第5頁,課件共60頁,創作于2023年2月16.2Swing簡介Swing包是JFC(JavaFoundationClasses)的一部分,它由許多包組成,這些包的名稱及描述如表16.1所示。包名包的描述Com.sum.swing.plaf.motif實現Motif界面樣式代表類Com.sum.java.swing.plaf.windows實現Windows界面樣式的代表類javax.swingSwing組件和使用工具javax.swing.borderSwing輕量組件的邊框javax.swing.colorchooserJcolorChooser的支持類/接口javax.swing.event事件和偵聽器類javax.swing.filechooserJFileChooser的支持類/接口javax.swing.pending未完全實現的Swing組件javax.swing.plaf抽象類,定義UI代表的行為javax.swing.plaf.basic實現所有標準界面樣式公共基類javax.swing.plaf.metal它們實現Metal界面樣式代表類javax.swing.tableJtable組件javax.swing.text支持文檔的顯示和編輯javax.swing.text.html支持顯示和編輯HTML文檔javax.swing.text.html.parserHtml文檔的分析器javax.swing.text.rtf支持顯示和編輯RTF文件javax.swing.treeJtree組件的支持類javax.swing.undo支持取消操作第6頁,課件共60頁,創作于2023年2月16.3容器類窗口(JFrame)、面板(JPanel)和對話框(J)是Swing中提供用來創建表示圖形用戶界面的類。該類的對象將被當作容器使用,所有的Swing組件都必須被添加到容器中,才能被顯示出來。第7頁,課件共60頁,創作于2023年2月16.3.1JFrame類JFrame是一個窗口容器組件,可以被顯示在用戶桌面上,同時也是一個框架,在其中,可以添加需要的其他的Swing組件。JFrame是少數幾個不是通過繪制的方式顯示的Swing組件。JFrame類的構造方法如圖16.5所示。第8頁,課件共60頁,創作于2023年2月16.3.1JFrame類JFrame類中還提供了一些與窗口有關的方法。其主要方法與方法描述如表16.2所示。方法方法描述publicvoidsetVisible(booleanb)判斷窗體是否可見。如果參數b為true則表示顯示該窗體,否則表示不可見publicvoidsetBackground(Colorc)設置窗體背景顏色publicvoidsetTitle(Strings)設置標題。其中參數s表示要顯示在窗體邊界中的標題publicStringgetTitle()獲取窗體邊界的標題。如果沒有標題則返回空字符串publicvoidpack()調整適合其子組件的大小和布局窗口的大小publicvoidsetResizable(booleanresizable)設置窗口大小是否可以調整publicContainergetContentPane()返回此窗體的contentPane對象publicvoidsetLayout(LayoutManagermanager)設置布局管理器publicvoidvalidate()驗證容器及其容器中的組件第9頁,課件共60頁,創作于2023年2月16.3.2JDialog類JDialog是一個用來創建對話框的類,是Dialog類的子類。創建的JDialog對象可以用來向用戶返回信息,接收用戶的輸入,實現與用戶的交互。JDialog與JFrame的區別在于:JDialog對象需要依賴于其他的對話框(比如Jframe)而存在,當它所依賴的對話框關閉或最小化的時候,該對話框也隨之關閉或最小化。第10頁,課件共60頁,創作于2023年2月16.3.2JDialog類JDialog類創建對話框對象的構造方法如圖16.7所示。JDialog類中的主要方法及方法描述如表16.3所示。方法方法描述StringgetTitle()用于獲取對話框的名字voidsetTitle(Strings)用于設置對話框的名字voidsetModal(booleanb)用于設置對話框的模式setSize(intwidth,intheight)用于設置對話框的大小voidsetVisible(booleanb)用于設置對話框是否可見第11頁,課件共60頁,創作于2023年2月16.3.3

JPanel類在得到了JFrame的內容面板后我們就可以直接將其他的Swing組件放在其中,或者直接在上面描繪圖畫或文字,但是習慣上一般不會這么做。通常會將這些圖畫或文字信息描繪在名為JPanel的容器上,然后再將JPanel實例放在內容面板上。這樣可以使得面板上的布局更合理。JPanel通常只作為純粹的容器來使用,它不能像框架、窗口或者對話框那樣獨立存在。JPanel的構造方法如圖16.9所示。第12頁,課件共60頁,創作于2023年2月16.4Swing常用基本組件創建圖形用戶界面GUI,就是為了讓計算機程序更好的和用戶交互。JavaSwing提供了二十多種不同的用戶界面組件。所有的Swing組件都是從javax.swing.Jcomponent類中派生而來的,從而繼承了組件所特有的屬性和方法。第13頁,課件共60頁,創作于2023年2月16.4.1常用組件的共性操作Swing類庫中的組件都繼承自javax.swing.JComponent,因此都具有JComponent的操作,包括設置背景色、設置前景色、設置字體以及設置是否禁用等。表16.4中是JComponent中常用的方法及方法描述。方法方法描述intgetHeight()返回組件高度intgetWidth()返回組件寬度StringgetToolTipText()返回工具提示voidsetToolTipText(Stringtext)設置工具提示DimensiongetSize(Dimensionrv)返回尺寸intgetX()返回位置xvoidsetBackground(Colorbg)設置背景色voidsetOpaque(booleanisOpaque)設置是否透明voidsetVisible(booleanaFlag)設置是否可見voidsetFont(Fontfont)設置字體voidsetBorder(Borderborder)設置邊框第14頁,課件共60頁,創作于2023年2月16.4.2按鈕(JButton)按鈕是用戶界面中常用的組件。用戶使用Swing按鈕可以顯示圖像,將整個按鈕設置為窗口默認圖標,來處理鼠標在按鈕上的事件。java.swing包中提供了標準的按壓式按鈕(JButton)。同時提供了選擇式按鈕:多選擇(JCheckBox)、單選擇(JRadioButton)等。我們在這里先來講解JButton的知識。JButton的構造方法如圖16.11所示。第15頁,課件共60頁,創作于2023年2月16.4.3文本框(JTextField)與密碼輸入框(JPasswordField)文本框(JTextField)也是一種常見的組件,用于處理一行文本(中間沒有回車符)。JTextField是JTextComponent的子類。密碼輸入框是JTextField的一個子類。JTextField和JPasswordField的構造函數形式和常用方法完全一樣。這里只列出JTextField的構造函數,如圖16.13所示。第16頁,課件共60頁,創作于2023年2月16.4.4文本域(JTextArea)文本域(JTextArea)也是一種常用組件,用于處理多行文本。JTextArea同JTextField一樣,都是JTextComponent的子類,因此它們的很多操作都類似,我們不再贅述。JTextArea的構造函數如圖16.15所示。第17頁,課件共60頁,創作于2023年2月16.4.5標簽(JLabel)標簽(JLabel)用來顯示一段文本,常用在JTextField或者JTextArea前面,提示用戶要填寫什么樣的信息。JLabel用于顯示文字,也可以同時顯示文字和圖標,一般不用于接收鼠標鍵盤的動作。JLabel的構造方法如圖16.17所示。第18頁,課件共60頁,創作于2023年2月16.4.6單選按鈕(JRadioButton)JRadioButton用來實現單選按鈕組件,按鈕有選中和沒被選中兩種狀態。多個單選按鈕中,一次只能有一個按鈕處于被選中狀態。JRadioButton的構造方法如圖16.19所示。第19頁,課件共60頁,創作于2023年2月16.4.7復選框(JCheckBox)JCheckBox是用來實現JCheckBox的組件。復選框是一個可以被選定和取消選定的項,它將其狀態顯示給用戶。一次可以選中多個復選框。JCheckBox類的構造方法如圖16.21所示。第20頁,課件共60頁,創作于2023年2月16.4.8下拉列表(JComboBox)下拉列表(JComboBox)是一種常見的組件。用戶可以從下列的菜單列表中選擇所需要的數據。一個下拉列表只能選擇一個選項。JComboBox的構造方法如圖16.23所示。可以將需要在下拉列表中顯示的各項放入一個數組中,然后利用其相應的構造方法將數組元素的各項顯示出來。第21頁,課件共60頁,創作于2023年2月16.4.9列表(JList)JList是用來表示列表的組件。該組件與下拉列表不同,它可以顯示多個項目的內容,并且允許用戶從列表中選擇一個或多個對象。JList的主要構造方法如圖16.25所示。與下拉列表相同,可以將需要顯示的內容先放入一個數組中,然后使用帶有Object類型數組為參數的的構造方法創建一個JList對象,將列表中各項顯示出來。第22頁,課件共60頁,創作于2023年2月16.4.10滾動條(JScrollPane)JscrollPane類的對象可以創建一個垂直或者水平方向的滾動條。在實際使用中,它需要和某個容器相關聯。例如,表格、窗體等。JScrollPane類的構造方法如圖16.27所示。第23頁,課件共60頁,創作于2023年2月16.5Swing高級組件16.4小節中我們介紹了Swing基本組件,但在實際應用中,對于一些比較復雜的界面,除了使用這些基本組件之外,還需要使用諸如表格、菜單、工具欄等這些組件。本節我們就來介紹Swing中的一些高級組件的創建和使用,包括表格、樹、菜單,以及對話框等組件。第24頁,課件共60頁,創作于2023年2月16.5.1表格(JTable)表格(JTable)是Swing新增加的組件,主要是為了將數據以表格的形式顯示。JTable是一個用來顯示和編輯二維單元表格的組件。可以通過創建一個二維數組對象,并將二維數組中定義并初始化的值放入到表中。Jtable創建表格的主要構造方法如圖16.29所示。第25頁,課件共60頁,創作于2023年2月16.5.2樹(JTree)樹是非常重要也是常用的一種數據結構。在計算機中也有著廣泛的應用,計算機中的目錄和文件的存儲結構都是樹形的。在Swing中,可以使用JTree來構建一個樹形結構模型。首先我們可以先舉一個樹形結構的例子,例如在“我的電腦”的C盤下的目錄結構,如圖16.31所示。第26頁,課件共60頁,創作于2023年2月16.5.2樹(JTree)在這個圖中我們要注意以下幾點:一顆樹中只有一個根結點。其余結點都是從該結點引出。除根結點外。其余結點要么是沒有子結點的結點要么是帶有子結點的結點。沒有子結點的結點稱為葉子結點。在圖16.31的樹結構中,“計算機”是根結點,“Intel”文件是一個葉子結點,“NVIDIA”文件是一個帶有子結點的結點。然后我們看JTree的主要的構造方法,如圖16.32所示。第27頁,課件共60頁,創作于2023年2月16.5.3菜單(JMenu)菜單(JMenu)是標題欄下面的一行文字部分。菜單是應用程序中最常用的組件。菜單的組織方式為:一個菜單條JMenuBar包含多個菜單項(JMenuItem)。JMenuItem有兩個子類,分別為JRadioButtonMenuItem及JCheckBoxMenuItem用于表示單選菜單項和復選菜單項。第28頁,課件共60頁,創作于2023年2月16.5.3菜單(JMenu)JMenu組件類的主要構造方法如圖16.34所示。創建菜單項的JMenuItem的主要構造方法如圖16.35所示。第29頁,課件共60頁,創作于2023年2月16.5.4工具欄(JToolBar)工具欄(JToolBar)提供了一種可以快速訪問界面中常用命令的方式。通常工具欄應該放到邊界布局中的一邊。可以水平和垂直放置,也可以拖動工具欄將其放置在想要放置的位置。工具欄一般放到菜單欄的下面,可以把菜單欄中的常用命令放到工具欄中,以方便用戶操作。第30頁,課件共60頁,創作于2023年2月16.5.4工具欄(JToolBar)Java中可以通過創建JToolBar對象來實現工具欄。JToolBar的主要構造方法如圖16.37所示。orientation參數可以是以下兩個值中的任何一個。SwingConstants.HORIZONTAL表示工具欄以水平方向放置。SwingConstants.VERTICAL表示工具欄以垂直方向放置。第31頁,課件共60頁,創作于2023年2月16.5.5進程條(JprogressBar)進程條(JprogressBar)是以圖形化的方式來描述任務進度的組件。在任務完成過程中,進度條顯示該任務完成的百分比,百分比通常用可視化的矩形表示,該矩形開始為空,隨著任務的執行,組件被填滿。JprogressBar的主要構造方法如圖16.39所示。第32頁,課件共60頁,創作于2023年2月16.5.6對話框(JDialog)對話框是一種大小不能變化、不能有菜單的容器窗口,對話框不能作為一個應用程序的主框架,而必須包含在其他的容器中。Java語言提供多種對話框類來支持多種形式的對話框。我們這里只為大家介紹一下簡單的標準對話框——JOptionPane。第33頁,課件共60頁,創作于2023年2月16.5.6對話框(JDialog)JOptionPane提供的對話框是模式對話框。使用JOptionPane,可以創建和自定義問多種類型的對話框。JOptionPane類的構造方法如圖16.41所示。第34頁,課件共60頁,創作于2023年2月16.6布局管理器在Java語言中,把創建的組件放置到對話框中,需要設置對話框界面的格式,這時候就必須使用布局管理器(layoutmanager),來排列界面上的組件。當組件被加入到容器中時,將如何排列,都由布局管理器來進行管理。Java中的布局管理器包括:FlowLayout、GridLayout、BorderLayout、CardLayout和GridBagLayout。當創建好需要的布局管理器后,就可以調用容器的setLayout()方法,來設定該容器的布局方式。下面我們為大家具體介紹幾種主要的布局管理器。第35頁,課件共60頁,創作于2023年2月16.6.1BorderLayout管理器BorderLayout布局管理器將容器劃分為東(East)、西(West)、南(South)、北(North)、中(Center)五個區域。它是Frame類的默認布局管理器。采用BorderLayout布局時,向容器中添加組件需要指定組件所在的區域。其大致所分區域如圖16.43所示。第36頁,課件共60頁,創作于2023年2月16.6.1BorderLayout管理器BorderLayout類的主要構造方法如圖16.44所示。圖中參數align指定了布局的位置,如表16.5所示。參數參數描述BorderLayout.CENTER中間BorderLayout.EAST東邊BorderLayout.WEST西邊BorderLayout.SOUTH南邊BorderLayout.NORTH北邊第37頁,課件共60頁,創作于2023年2月16.6.2FlowLayout管理器流動布局是使用FlowLayout類來創建的。該布局方式是最簡單的一種布局管理器,其排列組件的方式是按照:從左到右排列,當組件排列到容器行尾時,會自動換行并繼續排列剩下的組件。它是Panel類的默認布局管理器。我們可以調用相關方法設置不同的組件間距、行距以及對齊方式。FlowLayout管理器的布局示意圖如圖16.46所示。第38頁,課件共60頁,創作于2023年2月16.6.2FlowLayout管理器FlowLayout類的主要構造方法如圖16.47所示。第39頁,課件共60頁,創作于2023年2月16.6.2FlowLayout管理器圖中參數align指定一種對齊方式。其具體描述如表16.6所示。如果對窗體的大小進行調整,組件在流布局中會根據窗體調整的大小重新調整其位置。如圖16.49所示。參數參數描述FlowLayout.LEFT靠左排列FlowLayout.CENTER置中排列FlowLayout.RIGHT靠右排列FlowLayout.LEADING對齊左邊界FlowLayout.TRAILING對齊右邊界第40頁,課件共60頁,創作于2023年2月16.6.3CardLayout管理器網格布局GridLayout管理器,可以將容器劃分為若干行與若干列的網格區域,并將組件放置在由行和列組成的網格中。采用GridLayout布局時,在容器中按照從左到右、從上到下的順序往網格中逐個添加組件。GridLayout管理器的布局示意圖如圖16.50所示。第41頁,課件共60頁,創作于2023年2月16.6.3CardLayout管理器GridLayout類的主要構造方法如圖16.51所示。GridLayout類提供的對網格布局中的行、列,以及水平和垂直間距進行設置的方法如表16.7所示。方法名稱方法描述publicvoidsetRows(introws)設置布局中的行數publicvoidsetColumns(intcols)設置布局中的列數publicvoidsetHgap(inthgap)設置布局中組件之間的水平距離publicvoidsetVgap(intvgap)設置布局中組件之間的垂直距離第42頁,課件共60頁,創作于2023年2月16.6.4GridBagLayout管理器GridBagLayout布局管理器在GridLayout布局管理器的基礎上提供了更加復雜的功能。采用GridBagLayout布局時,一個組件可以跨越多個行列放在多個網格內。另外,可以通過設定填充方式、間距等任意調整組件的大小和位置。GridBagLayout管理器的布局示意圖如圖16.53所示。第43頁,課件共60頁,創作于2023年2月16.6.4GridBagLayout管理器GridBagLayout類的構造方法與GridLayout類的構造方法基本相同,只是在GridLayout類基礎上又增加了一些屬性,如表16.8所示。新增屬性屬性描述intanchor指定組件在區域中放置的位置intfill指定組件填充方式intgridheight指定組件的高度,單位為網格個數intgridwidth指定組件的寬度,單位為網格個數intgridx指定組件的橫向坐標,單位為網格個數intgridy指定組件的縱向坐標,單位為網格個數Insetsinsets指定組件與區域的間隔大小第44頁,課件共60頁,創作于2023年2月16.6.5CardLayout管理器CardLayout布局管理器用于將組件以卡片的形式進行布局。采用CardLayout布局,每張卡片屬于不同的層次,并且充滿整個容器。它將容器中的每個組件看作一張卡片。任何情況下,一次只能看到一張卡片,即一次只有一個組件可見。組件的順序由組件對象本身在容器內部的順序決定。CardLayout管理器的布局示意圖如圖16.55所示。第45頁,課件共60頁,創作于2023年2月16.6.5CardLayout管理器CardLayout類的主要構造方法如圖16.56所示。CardLayout類提供了一些方法用來翻轉該布局中的組件。具體方法及其描述如表16.9所示。方法方法描述publicvoidfirst(Containerparent)翻轉到容器的第一張卡片publicvoidlast(Containerparent)翻轉到容器的最后一張卡片publicvoidnext(Containerparent)翻轉到指定容器的下一張卡片publicvoidprevious(Containerparent)翻轉到指定容器的前一張卡片publicvoidsetHgap(inthgap)設置組件之間,以及組件與Container的邊之間水平間隙publicvoidsetVgap(intvgap)設置組件之間,以及組件與Container的邊之間垂直間隙publicintgetHgap()獲得組件之間,以及組件與Container的邊之間的水平間隙publicintgetVgap()獲得組件之間,以及組件與Container的邊之間的垂直間隙第46頁,課件共60頁,創作于2023年2月16.6.5CardLayout管理器我們可以單擊“前一張卡片”按鈕和“后一張卡片按鈕”,發現實際顯示在窗體的只能是一個按鈕。且它們是按順序排列的,如圖16.58所示。第47頁,課件共60頁,創作于2023年2月16.6.6不使用布局管理器定位組件不同的布局管理器會將組件定位在不同的位置。但是,有些時候并不想使用指定的某個布局管理器對組件進行定位。而是想按照自己的設計對組件進行定位,這時我們可以使用setBounds()方法來完成這一任務。setBounds()方法的語法格式如圖16.59所示。第48頁,課件共60頁,創作于2023年2月16.7Swing的事件處理前面幾小節的主要內容是討論組件的使用以及容器的布局,這些內容使Java圖形用戶界面的程序設計變得靈活方便,與圖形界面程序密切相關的還有一個比較重要的內容——事件處理機制。第49頁,課件共60頁,創作于2023年2月16.7.1事件處理機制概述事件處理是圖形界面與用戶進行交互的重要內容。Java語言的事件處理機制包括事件源、事件、事件處理器三個主要的概念。首先需要為事件源注冊相應的事件處理器,事件源產生指定事件后,事件處理器捕獲后進行相應事件處理。其大致處理機制如圖16.61所示。第50頁,課件共60頁,創作于2023年2月16.7.1事件處理機制概述以下是對三個概念的說明:事件源:產生事件的各種組件,如窗口、按鈕、復選框等。事件:用戶對事件源的各種操作動作。事件處理器:用于接收并處理事件的方法。在圖形用戶界面的程序中,用戶的不同操作,如單擊鼠標、移動鼠標、鍵盤輸入等,會引發不同的事件類型,而不同的事件,需要相對應的事件監聽器來監聽并處理事件。在本節中就來講解Java中有什么類型的事件,不同類型時間需要哪些特定類型事件監聽器來處理。第51頁,課件共60頁,創作于2023年2月16.7.2事件監聽器實現事件處理,首先要實現監聽器接口,然后調用事件源對象中的方法來一個添加監聽器對象。當事件發生后,事件源會調用監聽器接口中的方法,通過將事件對象傳遞給相應的監聽器方法來實現對事件的處理。第52頁,課件共60頁,創作于2023年2月16.7.2事件監聽器每種事件類都有對應的事件監聽器,它是事件監聽器類的接口。各種事件類的接口描述如表16.10所示。事件類別描述信息接口名方法ActionEvent激活組件ActionListeneractionPerformed(ActionEvent)ItemEvent選擇了某些項目ItemListeneritemStateChanged(ItemEvent)MouseEvent鼠標移動MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠標單擊等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)KeyEvent鍵盤輸入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)FocusEvent組件收到或失去焦點FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)WindowEvent窗口收到窗口級事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)第53頁,課件共60頁,創作于2023年2月16.7.3焦點事件焦點事件類(FocusEvent)是指用戶程序界面的組件焦點發

溫馨提示

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

評論

0/150

提交評論