多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > 第12章Swing編程

第12章Swing編程

來源:程序員人生   發(fā)布時間:2016-06-23 14:48:26 閱讀次數(shù):2801次

第12章Swing編程

Swing它采取100%java實現(xiàn) 不在依賴本地平臺,所有平臺都可以保持相同的運行效果,對跨平臺支持比較出色  實現(xiàn)了MVC設(shè)計模式也稱為Model-Delegate(模式-代理)

12.1 Swing概況

獨立于本地平臺的Swing(速度慢點)組件被稱為輕量級組件,而依賴本地平臺的AWT組件被稱為重量級組件

 

12.2 Swing 基本組件的用法

12.2.1 Swing 組件層次

大部份Swing組件都是JComponent抽象類的直接或間接子類,JComponent類繼承了java.atw.Containter類,所以Swing組件類可作為容器使用

Swing中包括了4個組件直接繼承了AWT組件,而不是從JComponent派生,JFrame JWindows

JDialog JApplet 他們其實不是輕量級組件,而是重量級組件(需要拜托給GUI組件的平臺)

 

Swing組件按功能來分,又可以分為幾類

1. 頂層容器 :JFrame JWindows JDialog JApplet

2. 中間容器 :JPanel JScrollPane  JSplitane  JTooLBar

3. 特殊容器 : 在用戶界面上具有特殊作用的中間容器 如 JInternalFrame JRootPane

4. 基本組件 : 實現(xiàn)人機交互的組件 JButton JMenu

5. 不可編輯信息的顯示組件 :向用戶顯示不可以編輯的組件信息 JLable

6. 可編輯信息的顯示組件 : 向用戶顯示被編輯的格式化信息的組件 JTable JTextArea

7. 特殊對話框組件 如JColorChooser JFileChooser

 

12.2.2 AWT組件的Swing實現(xiàn)

相對AWT組件 Swing組件具有以下4個功能

1.可以為Swing組件設(shè)置提示信息

2.很多Swing組件如 按鈕 標簽 菜單等 除使用文字外,還可使用圖標標示自己

3.支持插拔式的外觀風(fēng)格

4.支持設(shè)置邊框

 

AWT菜單對象在創(chuàng)建快捷鍵時,直接傳入KeyShortcut對象為其制定快捷鍵,但Swing菜單項制定快捷鍵必須通過setAccelerator(KeyStroke ks)方法來設(shè)定

SwingUtilities 類的updateComponentTreeUI()方法類跟新制定容器的注意的是跟新的是JFrame對象getContentPanel()方法的返回值,而不是直接跟新JFrame JFrame仍然依賴于本地平臺的圖象組件

JScrollPaneJTable組件特別重要,通常需要把JTable放在JScrollPane容器中才可以顯示出JTable組件的標題欄

 

12.2.3位組件設(shè)置邊框

可以調(diào)用JComponent提供的setBorderBorder b)方法為Swing組件設(shè)置邊框,其中BorderSwing的接口

TitledBorder Component 比較獨特,其中TitleBorder的作用是為其他邊框設(shè)計標題,當創(chuàng)建1個TitledBorder對象時,就需要傳入1個已存在的Border對象,因此每創(chuàng)建1個ComponentBorder對象時都需要傳入兩個Border對象,1個用作組件的內(nèi)邊框,1個用于組件的外邊框

Swing組件添加邊框的步驟以下

1.使用BorderFactorXxxBorder創(chuàng)建XxxBorder實例

2.調(diào)用Swing組件的setBorderBorder b)方法為該組件設(shè)置邊框

 

12.2.4 Swing組件的雙緩存和鍵盤驅(qū)動

Swing 組件還有兩個功能

1. 所有的Swing組件默許啟用雙緩存繪圖技術(shù)(避免頻沉重繪GUI組件時顯示閃爍現(xiàn)象)默許開啟

2. 所有的Swing組件都提供了簡單的鍵盤驅(qū)動 JComponent類提供了getInputMap() 返回1個InputMap對象,該對象用于將KeyStroke對象和名字關(guān)聯(lián);getActionMap()返回1個ActionMap對象 用于將制定名字和Action關(guān)聯(lián),從而可以允許用戶通過鍵盤來操作代替鼠標驅(qū)動GUI上的Swing組件 (相當于提供快捷鍵)

12.2.5 使用JToolBar創(chuàng)建工具條

Swing提供了JToolBar來創(chuàng)建工具條,創(chuàng)建JToolBar對象時可以制定以下兩個參數(shù)

name :該參數(shù)為工具條的名稱

orientation : 該參數(shù)表示工具條的方向

Action接口是ActionListener接口的子接口,處理提供actionPerformed()方法以外,還包括 name icon 不但可以作為事件監(jiān)聽器使用,還可以轉(zhuǎn)換為按鈕或菜單項

 

Action本身不是按鈕也不是菜單項,只有當把Action對象添加當某些組件(也能夠直接使用Action來創(chuàng)建)也就是說 這些容器需要負責完成以下的事

1.創(chuàng)建1個試用與該容器的組件

2.從Action對象的初始化中取得對的屬性來設(shè)置組件

3.檢查Action對象的初始化 肯定它是不是是激活狀態(tài)

4.通過Action對象為對應(yīng)組件注冊事件監(jiān)聽器

 

12.2.6 使用JFileChooser

JFileChooser用于創(chuàng)建色彩的對話框 該方法提供了兩個靜態(tài)方法

showDialog(Componment c ,Stting title ,Color col)大部份時候時用來讓用戶選擇色彩

createDialogComponent c ,String tilte ,boolean modal ,JColorChoose jc ,ActionListener listerner ,ActionListenenr cann

 

JFileChooser的功能與AWT中的FileDialog基本相似,也就是生成“打開文件”,“保存文件”對話框

為了調(diào)用JFileChooser來打開1個文件對話框,必須下創(chuàng)建該對話框的實例,JFileChooser提供了多個構(gòu)造器來創(chuàng)建JFileChooser對象

JFileChooser 調(diào)用showXxxDialog()方法來顯示文件對話框,

 

使用JFileChooser來創(chuàng)建文件對話框運行用戶選擇文件的步驟以下

1. 采取構(gòu)造器創(chuàng)建1個JFileChooser對象,該JFileChooser對象無需指定parent組件,所有可以在多個組件之間共有JFileChooser對象

2. 調(diào)用JFileChooser的1系列可選方法對JFileChooser履行操作

3. 如果讓文件對話框?qū)崿F(xiàn)文件過濾功能,則需要結(jié)合FileFilter類來進行文件過濾

4. 如果需要改變文件對話框的視圖外觀,則可以結(jié)合FileView類來改變對話框中文件的視圖外觀

5. 調(diào)用showXxxDialog 方法可以打開文件對話框

6. JFileChooser提供了兩個方法來獲得用戶選擇文件或文件集

 

12.2.7 使用JOptionPane

通過JOptionPane可以非常方便的創(chuàng)建1些簡單的對話框,Swing已為這些對話框添加了相應(yīng)的組件,無需程序員手動添加組件

JOptionPane提供了4個方法來創(chuàng)建對話框

1. showMessageDialog/showInternalMessageDialog 消息對話框,用戶只能點肯定(類似js alert

2. showConfirmDialog/showInternalComfirmDialog 肯定對話框 想用戶肯定某1個問題 用戶可以選擇yes  no canel 等 (類似JS comfirm

3. showInputDialog/showInternalInputDialog 輸入對話框,提示要求輸入某些信息,類似于JSprompt函數(shù) 改方法返回用戶輸入的字符串

4. showOptionDialog/showInternalOptionDialog自定義對話框,可以替換showConfirmDialog所產(chǎn)生的對話框,只是用起來更復(fù)雜

JOptionPane產(chǎn)生的所有對話框都是模式的,在用戶完成對話框交互前都會1直阻塞當前的線程

12.3 Swing中的特殊容器

Swing提供了1些具有特殊功能的容器,用于創(chuàng)建1些更復(fù)雜的用戶界面

12.3.1 使用JSplitPane

JSplitPane用于創(chuàng)建1個分割面板,它可以將1個組件(通常是容器)分割成兩個部份,并提供1個分割條,用戶可以調(diào)劑兩部份的大小

 

創(chuàng)建分隔板時可以制定1個newContinuousLayout參數(shù),該參數(shù)指定分割面板是不是支持連續(xù)散布(分割線兩邊組件將不斷的調(diào)劑大小)

 

12.3.2 使用JTabbedPane

JTabbedPane可以很方便的在窗口上放置多個標簽頁,每一個標簽頁相當于取得1個與外部容用具有大小相同的組件擺放區(qū),通過這類方式,可以在1個容器里放置更多的組件

如果需要使用JTabbedPane在窗口上創(chuàng)建標簽頁步驟以下

1.創(chuàng)建1個JTabbedPane對象(構(gòu)造器包括以下兩個參數(shù) tabPlacement 指定標簽頁放置的位置  tabLayoutPolicy 指定標簽頁的布局策略 有兩種(JTabbedPane.WRAP_TAB_LAYOUT)標題換行  (SCROLL_TAB_LAYOUT)使用轉(zhuǎn)動條顯示)

2.調(diào)用JTabbedPane對象的addTab() insertTab()()等方法來增刪改查(不要使用add()方法來增加組件 后插入的組件會覆蓋之前增加的組件)

3.如果需要某1個標簽顯示出來則可以調(diào)用JTabbedPanesetSelectedIndex()方法來實現(xiàn)

4.程序還可以通過JTabbedPane提供的1系列方法來操作JTabbedPane的相干屬性

5.如果程序需要監(jiān)聽用戶點擊某1個標簽,則可使用監(jiān)聽器來監(jiān)聽JTabbedPane對象

 

12.3.3使用JLayeredPane JDesktopPane JInternalFrame

JLayeredPane是1個代表有層次深度的容器,它允許組件在需要時相互疊加,當向JLayeredPane容器中添加組件時,需要為組件指定1個深度索引,其中層次索引較高的層的組件位于其他層組件之上

JLayeredPane中添加組件必須要顯示的設(shè)置該組件的大小和位置 ,否則該組件顯示不出來

 

JDesktopPane 需要和JInternalFrame組合使用,其中JDesktopPane代表了1個虛擬桌面,而JInternalFrame則用于創(chuàng)建內(nèi)部窗口 創(chuàng)建步驟以下

1. 創(chuàng)建1個JDesktopPane對象,

2. 使用JInternalFrame創(chuàng)建1個內(nèi)部窗口,創(chuàng)建內(nèi)部窗口時除可以穿字符串作為窗口的名字還可以傳4Boolean值 用于表示是不是允許改變窗口大小 關(guān)閉窗口 最大化窗口 最小化窗口

3. 1旦取得內(nèi)部窗口以后,該窗口的用法和普通窗口的用法基本1樣,1樣可以制定該窗口的布局管理器,可以添加組件。。

4. 將該內(nèi)部窗口以適合的大小適合的位置顯示出來(該窗口默許大小是0*0 位于 0,0處于隱藏狀態(tài))

5. 將內(nèi)部窗口添加到 JDesktopPane 容器,在將 JDesktopPane 容器加到其他容器

 

 JDesktopPane 不能獨立存在,必須將 JDesktopPane 添加到其他頂級容器中才能正常使用

 

12.4 Swing簡化拖放功能

java 1.4 開始Swing部份組件就提供了默許的拖放支持,除此以外,Swing還提供該了1個非常特殊的類 TransferHandler,它可以直接將某1個組件的指定屬性設(shè)置為拖放目標(條件該組件具有該屬性的setter方法)

 

12.5 java 7 新增的Swing功能

java 7 提供了重大的更新包括對Swing的更新,對Swing的更新除前面介紹的Nimbus外觀改進了JColorChooser組件外,還有兩個重要的跟新 JLayer和創(chuàng)建不規(guī)則窗口

 

12.5.1 使用JLayer裝潢組件

JLayer的功能是在指定的組件上額外的添加1個裝潢層,開發(fā)者可以在這個裝潢層上任意繪制,可以指定組件添加任意裝潢

JLayer1般總是要和LayerUI1起使用 ,而LAyerUI用于被擴大,擴大時重寫它的paint(Graphics g ,JComponent c)方法

12.5.2 創(chuàng)建透明、不規(guī)則狀態(tài)窗口

java 7 Frame提供了兩個方法

serShapeShape shape) 設(shè)置窗口的形狀

serOpacityfloat opacity)設(shè)置窗口的透明度

 

12.6 使用JProgressBar ProgressMonitor       BoundedRangeModel 創(chuàng)建進度條

12.6.1 創(chuàng)建進度條

使用JProgressBar可以非常方便的創(chuàng)建進度條,步驟以下

1.創(chuàng)建1個JProgressBar對象,創(chuàng)建對象時可以指定3個參數(shù),(用于設(shè)置進度條的排列方式 進度條的最大和最小值)

2.調(diào)用該對象的經(jīng)常使用方法設(shè)置進度條的普通方法

3.當程序中工作進度完成改變時,調(diào)用用于JProgressBar對象的setValue()方法

 

12.6.2 創(chuàng)建進度對話框

ProgressMonitor的用法和JProgressBar的用法基本相似,只是ProgressMonitor可以直接創(chuàng)建1個進步對話框 ProgressMonitor提供以下構(gòu)造器

ProgressMonitorComponent parentcom ,Object message , String note ,int mix ,int max

使用ProgressMonitor創(chuàng)建的對話框包括的進度條是1個非常固定的 程序乃至不能設(shè)置該進度條是不是包括邊框,(總是包括邊框)不能設(shè)置進度不肯定,不能改變進度條的方向(總是水平方向)

 

12.7 使用JSiderBoundedRangeModel創(chuàng)建滑動條

JSider的用法和JProgressBar的用法非常相似,這1點可以從它們同享同1個Model類看出來 主要區(qū)分以下

1.JSlide不是采取填充色彩的方式來表示該組件確當前值,而是采取滑塊的位置來表示該組件確當前值

2.JSider允許用戶手動改變滑動條確當前值

3.JSider 允許為滑動條指定刻度值,這系列的刻度值可以是連續(xù)的數(shù)字,也能夠是自定義的刻度值,乃至多是圖標

 

使用JSider的構(gòu)造器創(chuàng)建滑動條的步驟以下

1.使用JSider的構(gòu)造器創(chuàng)建1個JSider對象,

2.調(diào)用JSider的以下方法來設(shè)置滑動條的外觀樣式

3.如果程序需要在用戶拖動滑塊時做出相應(yīng)的處理,則應(yīng)為JSider對象添加時間監(jiān)聽器

4.將JSider對象添加到其他容器中顯示出來

 

12.8 使用JSpinner SpinnerModel 創(chuàng)建微調(diào)控制器

JSpinner組件是1個帶有兩個小箭頭的文本框,這個文本框只能接收滿足要求的數(shù)據(jù),用戶既可以通太小箭頭調(diào)劑該微調(diào)控制器的值,也能夠直接在文本框內(nèi)輸入內(nèi)容來改變文本框微調(diào)控制器的值

 

通常JSpinner組件常常需要和SprinnerModel結(jié)合使用,其中JSpinner控制組件的外觀,而SprinnerModel控制該組件的內(nèi)部狀態(tài)數(shù)據(jù)

JSpinner組件的值可以是數(shù)值 日期 和List中的值

JSpinner組件還可以是任意系列 只要這個系類可以通過previous() next() 取得值便可,在這類情況下用戶必須自行提供SpinnerModel實現(xiàn)類

 

12.9 使用JList JComboBox創(chuàng)建列表框

JList JComboBox都是極為相似的,他們都有1個列表框,只有JComboBox的列表框需要以下拉方式顯示出來

JList JComboBox都可以通過調(diào)用setRenderer()方式來改變列表框的表現(xiàn)情勢

12.9.1簡單列表框

如果僅需要創(chuàng)建1個簡單的列表框,則直接使用他們的構(gòu)造器便可,他們的構(gòu)造器都可以接收1個對象數(shù)組或元素類型的任意Vector作為參數(shù),這個對象數(shù)組或元素類型任意的Vector里的所有元素將被轉(zhuǎn)換為列表框的列表項

步驟

1.使用JList JComboBox的構(gòu)造器來創(chuàng)建1個列表框?qū)ο?/span>

2.調(diào)用JList JComboBox 的各種方法來設(shè)置列表框的外觀行動

3.如果有需要監(jiān)聽列表框選項的變化,則可以通過監(jiān)聽器來實現(xiàn)

 

12.9.2 不強迫存儲列表項的JListModel JComboBoxModel

Swing的絕大部份組件都實現(xiàn)了MVC的設(shè)計模式,其中JListModel JComboBoxModel只負責組件的外觀顯示,而組件的狀態(tài)數(shù)據(jù)保護則有對應(yīng)的Model負責,JList對應(yīng)的ModelListModel接口

12.9.3 強迫存儲列表項的DefaultListModelDefaultComboBoxModel

當使用JListModel JComboBoxModel經(jīng)常常需要動態(tài)的增加插入刪除列表項

但是JListModel 并沒有提供這些類似的方法,實際上對JList還是很難刪除列表項。

所以應(yīng)當在創(chuàng)建JList時顯示使用DefaultListModel作為構(gòu)造參數(shù)

由于DefaultListModel作為JListModel,它負責保護JList組件的所有列表數(shù)據(jù)

 

為何JComboBox提供了增刪改 而 JList沒有

由于 直接使用數(shù)組 vector 創(chuàng)建JListJComboBox對應(yīng)實現(xiàn)類不1樣,創(chuàng)建JComboBoxModelDefaultComboBoxModel,這是1個可變集合類,所有使用數(shù)組集合可以直接增刪改

但使用數(shù)據(jù)Vector創(chuàng)建的JList對應(yīng)的Model分別是JList$1,JList$2 (內(nèi)部類)

 

DefaultListModelDefaultComboBoxModel 是兩個強迫保存所有列表項的Model類,他們使用Vector來保存所有列表項

 

12.9.4 使用ListCellRender 改變列表項外觀

JList JComboBox 都可以支持圖標列表,如果創(chuàng)建JList JComboBox 傳入圖標數(shù)組,則創(chuàng)建的JList JComboBox 列表項就是圖標

ListCellRender只是1個接口,它并未強迫指定列表項繪制屬于那種組件,因此可擴大任何組件來實現(xiàn)ListCellRender接口

 

12.10 使用 JTree TreeModal創(chuàng)建樹

樹是圖形用戶界面中使用非常廣泛的GUI組件,

1個樹只能有1個根節(jié)點如果1個樹有多個節(jié)點,那它就不是樹1棵樹了,而是多棵樹的集合,也被稱為森林

12.10.1 創(chuàng)建樹

Swing使用JTree對象來代表1棵樹,(實際上也能夠是森林)JTree樹種節(jié)點可使用TreePath來標識,該對象封裝了當前節(jié)點及所有父節(jié)點

節(jié)點及所有的父節(jié)點才能標識1個節(jié)點

1個節(jié)點有2種狀態(tài)

1.展開狀態(tài)

2.折疊狀態(tài)

只有當某1個節(jié)點的所有父節(jié)點(直接的和間接的)都全部展開才能是可見的

如果希望創(chuàng)建1棵樹,則直接使用JTree構(gòu)造器創(chuàng)建JTree對象便可

為了利用根節(jié)點來創(chuàng)建JTree,程序需要創(chuàng)建1個TreeNode對象(接口),該接口有1個子接口MutableTreeNode,程序可以通過該接口的實現(xiàn)類DefaultMutableTreeNode來創(chuàng)建樹節(jié)點并通過add()方法來添加節(jié)點之間的父子關(guān)系

 

DefaultMutableTreeNode提供還提供了深度優(yōu)先遍歷和廣度優(yōu)先遍歷兩個方法

12.10.2 拖到,編輯樹節(jié)點

JTree生成的樹默許是不可編輯的,不可以添加、刪除節(jié)點,也不可以變換節(jié)點,如果想讓某1個樹變成可編輯狀態(tài),則可以調(diào)用JTreesetEditableBoolean b)改成true便可變成可編輯的樹了

JTree處理節(jié)點有兩種方式

1.1種是根據(jù)TreePath

2.另外一種是根據(jù)節(jié)點行號

所有JTree顯示的節(jié)點都有1個唯1的行號,只有那些被顯示出來的節(jié)點才有行號,(如果該節(jié)點之前被展開 折疊或修改 那末該節(jié)點行號可能產(chǎn)生變化)所以使用TreePath比較穩(wěn)定

 

12.10.3 監(jiān)聽節(jié)點事件

JTree專門提供了1個TreeSelectionModel對象來保存該JTree選中狀態(tài)信息,也就是說JTree組件背后隱藏了兩個model對象,其中TreeModel用于保存該JTree的所有節(jié)點數(shù)據(jù),而TreeSelectionModel用于保存該JTree中被選中的信息

程序可以通過getSelectPath getSelectPaths()方法來獲得被選中的TreePath 實際上這兩個方法還是依賴于TreeSelectionModel

 

12.10.4 使用DefaultTreeCellRenderer改變節(jié)點外觀

JTree也可也改變樹節(jié)點的外觀,包括改變節(jié)點的圖標,字體等,乃至可以自由繪制節(jié)點的外觀,為了改變外觀,可以通過樹指定自己的CellRenderer來實現(xiàn),JTree默許使用DefaultTreeCellRenderer來繪制每一個節(jié)點 該類是JLabel的子類

改變樹節(jié)點的外觀樣式 可以有以下3種方式

1.使用DefaultTreeCellRenderer直接改變節(jié)點的外觀,這類方式可改變整棵樹所有節(jié)點的字體色彩和圖標

2.為JTree指定DefaultTreeCellRenderer的擴大對象作為JTree的節(jié)點繪制器,該節(jié)點負責為不同的節(jié)點使用不同的字體色彩和圖標

3.為JTree指定1個實現(xiàn)TreeCellRenderer接口的節(jié)點繪制器 該節(jié)點可為不同的節(jié)點自由繪制任意內(nèi)容

 

12.10.5 擴大DefaultTreeCellRenderer改變節(jié)點外觀

DefaultTreeCellRenderer類實現(xiàn)了TreeCellRenferer接口,給接口里只有1個用于繪制節(jié)點內(nèi)容的方法 getTreeCellRendererComponent(),該方法負責繪制JTree節(jié)點

DefaultTreeCellRenderer類繼承了JLabel,實現(xiàn)getTreeCellRendererComponent()方法時返回this,返回的是JLabel對象

 

12.10.6 實現(xiàn)TreeCellRenderer改變外觀

程序?qū)崿F(xiàn)TreeCellRenderer時1樣要實現(xiàn)getTreeCellRendererComponent()方法,該方法返回任意類型的組件,該組件將作為JTree節(jié)點

程序一樣是通過擴大JPanel來實現(xiàn)TreeCellRenferer

 

12.11 使用JTableTableModel創(chuàng)建表格

12.11.1 創(chuàng)建表格

使用JTable來創(chuàng)建表格是非常容易的事情,JTable可以把1個2維數(shù)據(jù)包裝成1個表格這個2維數(shù)據(jù)包可以是2維數(shù)組也能夠是集合元素為VectorVector對象

在默許情況下 JTable的表格數(shù)據(jù),表格列表全部都是字符串內(nèi)容,可以通過特定的TableModel或自己制定自己的單元格繪制器來實現(xiàn)

通常應(yīng)當講JTable對象放在JScrollPane容器由JSrollPaneJTable提供viewPort(不但可以為JTable增加轉(zhuǎn)動條,而且可讓JTable的標題顯示出來,如果不把JTable放在JScorllPaneJTable默許不會顯示列標題)

12.11.2 TableModel 和監(jiān)視器

JList. JTree類似的是,JTable采取TableModel來保存表格中的所有狀態(tài)數(shù)據(jù),與ListModel類似的是,TableModel 也不強迫保存該表格顯示的數(shù)據(jù),

也能夠通過TableModel對象來創(chuàng)建表格。

 

12.11.3 TableColumnModel 和監(jiān)聽器

JTable使用TableColumnModel 來保存該表格所有數(shù)據(jù)列的狀態(tài)數(shù)據(jù),如果程序需要訪問JTable的所有列狀態(tài)信息,則可以通過獲得該JTableTableColumnModel來實現(xiàn)

12.11.4 實現(xiàn)排序

使用JTable實現(xiàn)的表格并沒有實現(xiàn)排序功能,但是可使用AbstactTableModel類來實現(xiàn)該功能,只要TableModel實現(xiàn)了getValueAt(),getColumnCount(),getRowCount(), JTable 就能夠根據(jù)該TableModel生成表格,因此可以創(chuàng)建1個SortableTableModel實現(xiàn)類,將TableModel封裝起來,并實現(xiàn)排序功能

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 欧美二区在线观看 | 欧美性福利 | 婷婷综合缴情亚洲五月伊 | 91精品免费在线观看 | 成人欧美日本免费观看 | 手机看片日韩在线 | 亚洲精品99久久久久久欧美版 | 欧美亚洲日本在线 | 亚洲人成77777在线播放网站不卡 | 羞羞视频免费入口 | 欧美日韩国产一区二区三区欧 | 中文字幕一区二区三区四区五区 | 国产福利一区二区 | 日本网站免费 | 中文字幕第一页在线 | 亚洲综合射 | 宇都宫紫苑乳在线观看 | 国产视频在线看 | 日韩欧美一区二区三区不卡在线 | 福利视频一区 | 成人免费淫片95视频观看网站 | 欧美最猛黑人xxxx黑人猛交3p | 久草三级 | 国产一区亚洲二区三区毛片 | 日韩a级毛片免费视频 | 国产性一交一乱一伦一色一情 | 一级欧美日韩 | 欧美一级人与动毛片免费播放 | 免费91最新地址永久入口 | 男女视频在线观看免费 | a久久久久一级毛片护士免费 | 性欧美一级 | 东京干男人都知道的网站 | 日本精品久久久久中文字幕8 | 最近免费2019中文字幕大全 | 日韩美女福利视频 | 亚洲欧美中文字幕高清在线一 | 羞羞动漫在线观看 | 亚洲三级久久 | 久久久日韩精品国产成人 | 日本高清免费网站 |