精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用BeanTableModel簡化Swing

開發 后端
本文介紹用BeanTableModel簡化Swing,您可以在 src 文件夾中找到文中介紹的所有源代碼。特定于 TMF 的代碼位于 com.ibm.j2x.swing.table 包中。

讓我們來檢視Swing TMF 框架,看看它是如何讓傳統 TableModel 過時的。設計該框架的第一部分是學習 JTable 的使用 —— 開發人員如何使用它,它顯示了什么內容,以便了理解哪些東西可以內化、通用化,哪些應當保留可配置狀態,以便開發人員配置。對于 TableModel,也要進行同樣的思考,我必須確定哪些東西可以從代碼中移出,哪些必須留在代碼中。一旦找出這些問題,接下來要做的就是確定能夠讓代碼足夠通用的最佳技術,以便所有人都能使用它,但是,還要讓代碼具備足夠的可配置性,這也是為了讓每個人都能使用它。

該框架分成三個基本部分:一個能夠處理任何類型數據的通用 TableModel、一個外部 XML 文件(負責對不同表中不同的表內容進行配置),以及模型與視圖之間的橋。

com.ibm.j2x.swing.table.BeanTableModel

BeanTableModel 是框架的第一部分。它充當的是通用 TableModel ,您可以用它來處理任何類型的數據。我知道,您可能會說,“您怎么這么肯定它適用于所有的數據呢?”確實,很明顯,我不能這么肯定,而且實際上,我確信有一些它不適用的例子。但是從我使用 JTables 的經驗來說,我愿意打賭(即使看起來我有點抬杠),實際使用中的 JTables,99% 都是用來顯示數據對象列表(也就是說,JavaBeans 組件的 ArrayList)。基于這個假設,我建立了一個通用表模型,它可以顯示任何數據對象列表,它就是 BeanTableModel。

BeanTableModel 大量使用了 Java 的內省機制,來檢查 bean 中的字段,顯示正確的數據。它還使用了來自 Jakarta Commons Collections 框架的兩個類來輔助設計。

在我深入研究代碼之前,請讓我解釋來自類的幾個概念。因為我可以在 bean 上使用內省機制,所以我需要了解 bean 本身的信息,主要是了解字段的名稱是什么。我可以通過普通的內省機制來完成這項工作:我可以檢查 bean ,找出其字段。但是,對于表來說,這還不夠好,因為多數開發人員想讓他們的表按照指定順序顯示字段。除此之外,還有一項表需要的信息,我無法通過內省機制從 bean 中獲得,即列名消息。所以,為了獲得正確顯示,對于表中的每個列,您需要兩條信息:列名和將要顯示的 bean 中的字段。我用鍵-值對的格式表示該信息,其中,將列名用作鍵,字段作為值。

正因為如此,我在這里使用了來自 Collections 框架的適合這項工作的兩個類。 BeanMap 用作實用工具類,負責處理內省機制,它接手了內省機制的所有繁瑣工作。普通的內省機制開發需要大量的 try / catch 塊,對于表來說,這是沒有必要的。 BeanMap 把 bean 作為輸入,像處理 HashMap 那樣來處理它,在這里,鍵是 bean 中的字段(例如, firstName ),值是 get 方法(例如, getFirstName() )的結果。BeanTableModel 廣泛地運用 BeanMap ,消除了操作內省機制的麻煩,也使得訪問 bean 中的信息更加容易。

LinkedMap 是另外一個在 BeanTableModel 中全面應用的類。我們還是回到為列名-字段映射所進行的鍵-值數據設置,對于數據對象來說,很明顯應當選擇 HashMap。但是,HashPap 沒有保留插入的順序,對于表來說,這是非常重要的一部分,開發人員希望在每次顯示表的時候,都能以指定的順序顯示列。這樣,插入的順序就必須保留。解決方案是 LinkedMap ,它是 LinkedList 與 HashMap 的組合,它既保留了列,也保留了列的順序信息。參見清單 1,可以查看我是如何用 LinkedMap 和 BeanMap 來設置表的信息的。

清單1. 用 LinkedMap 和 BeanMap 設置表信息

  1. protected List mapValues = new ArrayList();  
  2. protected LinkedMap columnInfo = new LinkedMap();    
  3. protected void initializeValues(Collection values)  
  4. {  
  5. List listValues = new ArrayList(values);  
  6. mapValues.clear();  
  7. for (Iterator i=listValues.iterator(); i.hasNext();)  
  8. {  
  9. mapValues.add(new BeanMap(i.next()));  
  10. }  

在 BeanTableModel 中比較有趣的檢查代碼實際上是通用 TableModel 的那一部分,這部分代碼擴展了 AbstractTableModel 。將清單 2 中的代碼與您通常用來建立傳統 TableModel 的代碼進行比較,您可以看到一些類似之處。

清單 2. BeanTableModel 中的通用 TableModel 代碼

  1. /**  
  2. *ReturnsthenumberofBeanMaps,thereforethenumberofJavaBeans  
  3. */  
  4. publicintgetRowCount()  
  5. {  
  6. returnmapValues.size();  
  7. }  
  8. /**  
  9. *Returnsthenumberofkey-valuepairingsinthecolumnLinkedMap  
  10. */  
  11. publicintgetColumnCount()  
  12. {  
  13. returncolumnInfo.size();  
  14. }  
  15.  
  16. /**  
  17. *GetsthekeyfromtheLinkedMapatthespecifiedindex(anda  
  18. *goodexampleofwhyaLinkedMapisneededinsteadofaHashMap)  
  19. */  
  20. publicStringgetColumnName(intcol)  
  21. {  
  22. returncolumnInfo.get(col).toString();  
  23. }  
  24. /**  
  25. *Getstheclassofthecolumn.Alotofdeveloperswonderwhat  
  26. *thisisevenusedfor.ItisusedbytheJTabletousecustom  
  27. *cellrenderers,someofwhicharebuiltintoJTablesalready  
  28. *(Boolean,Integer,Stringforexample).Ifyouwriteacustomcell  
  29. *rendereritwouldgetloadedbytheJTableforuseindisplayifthat  
  30. *specifiedclasswerereturnedhere.  
  31. *ThefunctionusestheBeanMaptogettheactualvalueoutofthe  
  32. *JavaBeananddetermineitsclass.However,becausetheBeanMap  
  33. *autoboxesthings--itconvertstheprimitivestoObjectsforyou  
  34. *(e.g.intstoIntegers)--thecodeneedstounautoboxit,sincethe  
  35. *functionmustreturnaClassObject.Thus,itrecognizesanyprimitives  
  36. *andconvertsthemtotheirrespectiveObjectclass.  
  37. */publicClassgetColumnClass(intcol)  
  38. {  
  39. BeanMapmap=(BeanMap)mapValues.get(0);  
  40. Classc=map.getType(columnInfo.getValue(col).toString());  
  41. if(c==null)  
  42. returnObject.class;  
  43. elseif(c.isPrimitive())  
  44. returnClassUtilities.convertPrimitiveToObject(c);  
  45. else  
  46. returnc;  
  47. }  
  48. /**  
  49. *TheBeanTableModelautomaticallyreturnsfalse,andifyou  
  50. *needtomakeaneditabletable,you'llhavetosubclass  
  51. *BeanTableModelandoverridethisfunction.  
  52. */  
  53. publicbooleanisCellEditable(introw,intcol)  
  54. {  
  55. returnfalse;  
  56. }  
  57. /**  
  58. *ThefunctionthatreturnsthevaluethatyouseeintheJTable.Itgets  
  59. *theBeanMapwrappingtheJavaBeanbasedontherow,itusesthe  
  60. *columnnumbertogetthefieldfromthecolumninformationLinkedMap,  
  61. *andthenusesthefieldtoretrievethevalueoutoftheBeanMap.  
  62. */  
  63. publicObjectgetValueAt(introw,intcol)  
  64. {  
  65. BeanMapmap=(BeanMap)mapValues.get(row);  
  66. returnmap.get(columnInfo.getValue(col));  
  67. }  
  68. /**  
  69. *TheoppositefunctionofthegetValueAt--itduplicatestheworkofthe  
  70. *getValueAt,butinsteadputstheObjectvalueintotheBeanMapinstead  
  71. *ofretrievingitsvalue.  
  72. */  
  73. publicvoidsetValueAt(Objectvalue,introw,intcol)  
  74. {  
  75. BeanMapmap=(BeanMap)mapValues.get(row);  
  76. map.put(columnInfo.getValue(col),value);  
  77. super.fireTableRowsUpdated(row,row);  
  78. }  
  79.  
  80. /**  
  81. *TheBeanTableModelimplementstheCollectionListenerinterface  
  82. *(1ofthe3partsoftheframework)andthuslistensforchangesinthe  
  83. *dataitismodelingandautomaticallyupdatestheJTableandthe  
  84. *modelwhenachangeoccurstothedata.  
  85. */  
  86. publicvoidcollectionChanged(CollectionEvente)  
  87. {  
  88. initializeValues((Collection)e.getSource());  
  89. super.fireTableDataChanged();  

正如您所看到的,BeanTableModel 的整個 TableModel 足夠通用化,可以在任何表中使用。它充分利用了內省機制,省去了所有特定于 bean 的編碼工作,在傳統的 TableModel 中,這類編碼工作絕對是必需的 —— 同時也是完全冗余的。BeanTableModel 還可以在 TMF 框架之外使用,雖然在外面使用會喪失一些威力和靈活性。

#p#

看過這段代碼之后,您會提出兩個問題。首先,BeanTableModel 從哪里獲得列名-字段與鍵-值配對的信息?第二,到底什么是 ObservableCollection ?這些問題會將我們引入框架的接下來的兩個部分。這些問題的答案以及更多的內容,將在本文后面接下來的章節中出現。

Swing Castor XML 解析器

保存必需的列名-字段信息的最合理的位置位于 Java 類之外,這樣,不需要再重新編譯 Java 代碼,就可以修改這個信息。因為關于列名和字段的信息是 TMF 框架中惟一明確與表有關的信息,這意味著整個表格都可以在外部進行配置。

顯然,該解決方案會自然而然把 XML 作為配置文件的語言選擇。配置文件必須為多種表模型保存信息;您還需要能夠用這個文件指定每個列中的數據。配置文件還應當盡可能地易于閱讀,因為開發人員之外的人員有可能要修改它。

這些問題的最佳解決方案是 Castor XML 解析器。查看 Castor 實際使用的最佳方法就是查看如何在框架中使用它。

讓我們來考慮一下配置文件的目的:保存表模型和表中列的信息。 XML 文件應當盡可能簡單地顯示這些信息。TMF 框架中的 XML 文件用清單 3 所示的格式來保存表模型信息。

清單3. TMF 配置文件示例

  1. <model> 
  2. <className>demo.hr.TableModelFreeExampleclassName> 
  3. <name>Hirename> 
  4. <column> 
  5. <name>First Namename> 
  6. <field>firstNamefield> 
  7. column> 
  8. <name>Last Namename> 
  9. <field>lastNamefield> 
  10. column> 
  11. model> 

與這個目的相反的目標是,開發人員必須處理的 Java 對象應當像 XML 文件一樣容易理解。通過 Castor XML 解析器用來存儲http://storage.it168.com/" target=_blank>存儲列信息的三個 Java 對象,就可以看到這一點,這三個對象是: TableData (存儲文件中的所有表模型)、 TableModelData (存儲特定于表模型的信息)和 TableModelColumnData (存儲列信息)。這三個類提供了 Java 開發人員所需的所有包裝器,以便得到有關 TableModel 的所有必要信息。

將所有這些包裝在一起所缺少的一個環節就是 映射文件,它是一個 XML 文件,Castor 用它把簡單的 XML 映射到簡單的 Java 對象中。在完美的世界中,映射文件也應當很簡單,但事實要比這復雜得多。良好的映射文件要使別的一切東西都保持簡單;所以一般來說,映射文件越復雜,配置文件和 Java 對象就越容易處理。映射文件所做的工作顧名思義就是把 XML 對象映射到 Java 對象。清單 4 顯示了 TMF 框架使用的映射文件。

清單 4. TMF 框架使用的 Castor 映射文件

  1. xmlversionxmlversion="1.0"?> 
  2. <mapping> 
  3. <description>Amappingfileforexternalizedtablemodelsdescription> 
  4. <classnameclassname="com.ibm.j2x.swing.table.TableData"> 
  5. <map-toxmlmap-toxml="data"/> 
  6. <fieldnamefieldname="tableModelData"collection="arraylist"type=  
  7. "com.ibm.j2x.swing.table.TableModelData"> 
  8. <bind-xmlnamebind-xmlname="tableModelData"/> 
  9. field> 
  10. class> 
  11. <classnameclassname="com.ibm.j2x.swing.table.TableModelData"> 
  12. <map-toxmlmap-toxml="model"/> 
  13. <fieldnamefieldname="className"type="string"> 
  14. <bind-xmlnamebind-xmlname="className"/> 
  15. field> 
  16. <fieldnamefieldname="name"type="string"> 
  17. <bind-xmlnamebind-xmlname="name"/> 
  18. field> 
  19. <fieldnamefieldname="columns"collection="arraylist"type=  
  20. "com.ibm.j2x.swing.table.TableModelColumnData"> 
  21. <bind-xmlnamebind-xmlname="columns"/> 
  22. field> 
  23. class> 
  24. <classnameclassname="com.ibm.j2x.swing.table.TableModelColumnData"> 
  25. <map-toxmlmap-toxml="column"/> 
  26. <fieldnamefieldname="name"type="string"> 
  27. <bind-xmlnamebind-xmlname="name"/> 
  28. field> 
  29. <fieldnamefieldname="field"type="string"> 
  30. <bind-xmlnamebind-xmlname="field"/> 
  31. field> 
  32. class> 
  33. mapping> 

僅僅通過觀察這段代碼,您就可以看出,映射文件清晰地勾劃出了每個用來存儲表模型信息的類,定義了類的類型,并將 XML 文件中的名稱連接到了 Java 對象中的字段。請保持相同的名稱,這樣會讓事情簡單、更好管理一些,但是沒必要保持名稱相同。

到現在為止,列名和字段信息都已外部化,可以讀入包含列信息的 Java 對象中,并且可以很容易地把信息發送給 BeanTableModel,并用它來設置列。

Swing ObservableCollection

TMF 框架的最后一個關鍵部分,就是 ObservableCollection 。您們當中的某些人可能熟悉 ObservableCollection 的概念,它是 Java Collections 框架的一個成員,在被修改的時候,它會拋出事件,從而允許其偵聽器根據這些事件執行操作。雖然從來沒有將它引入 Java 語言的正式發行版中,但在 Internet 上,這個概念已經有了一些第三方實現。就本文而言,我使用了自己的 ObservableCollection 實現,因為框架只需要一些最基本的功能。我的實現使用了一個稱為 collectionChanged() 的方法,每次發生修改時, ObservableCollection 都會在自己的偵聽器上調用該方法。也可以將該用法稱為 Collection 類的 Decorator(有關 Collections 的 Decorator 更多信息,請參閱 Collections 框架的站點),只需要增加幾行代碼,您就可以在普通的 Collection 類中創建 Collection 類的 Observable 實例。清單 5 顯示了 ObservableCollection 用法的示例。(這只是一個示例,沒有包含在 j2x.zip 中。)

清單 5. ObservableCollection 用法示例

  1. convert a normal list to an ObservableList  
  2. ObservableList oList = CollectionUtilities.observableList(list);  
  3. // A listener could then register for events from this list by calling  
  4. oList.addCollectionListener(this);  
  5. // trigger event  
  6. oList.add(new Integer(3));  
  7. // listener receives event  
  8. public void collectionChanged(CollectionEvent e)  
  9. {  
  10. // event received here}  

ObservableCollection 有許多 TMF 框架之外的應用程序。如果您決定采用 TMF 框架,您會發現,在開發代碼期間, ObservableCollection 框架有許多實際的用途。

但是,它在 TMF 框架中的用途,重點在于它能更好地定義視圖和模型之間的關系,當數據發生變化時,可以自動更新視圖。您可以回想一下,這正是傳統 TableModel 的最大限制,因為每當數據發生變化時,都必須用表模型的引用來更新視圖。而在 TMF 框架中使用 ObservableCollection 時,當數據發生變化時,視圖會自動更新,不需要維護一個到模型的引用。在 BeanTableModel 的 collectionChanged() 方法的實現中,您可以看到這一點。

Swing TableUtilities

在該框架中執行的最后一步操作,是將所有內容集成到一些實用方法中,讓 TMF 框架使用起來簡單明了。這些實用方法可以在 com.ibm.j2x.swing.table.TableUtilities 類中找到,該類提供了您將需要的所有輔助函數:

getColumnInfo() :該實用方法用 Castor XML 文件解析指定的文件,并返回指定表模型的所有列信息,返回的形式是 BeanTableModel 所需的 LinkedMap 。當開發人員選擇從 BeanTableModel 中派生子類時,這個方法很重要。

getTableModel() :該實用方法是建立在上面的 getColumnInfo() 方法之上,它獲得列的信息,然后把信息傳遞給 BeanTableModel,返回已經設置好所有信息的 BeanTableModel。

setViewToModel() :該實用方法是最重要的函數,也是 TMF 框架的主要吸引人的地方。它也是建立在 getTableModel() 方法之上,也有一個到 JTable 的引用(JTable 中有這個表的模型),以及一個到數據(要在表中顯示)的引用。它對 JTable 上的 TableModel 進行設置,并把數據傳遞給 TableModel,結果是:只需一行代碼,就為 JTable 完成了 TableModel 的設置。TMF 框架在該方法上得到了最佳印證,TableModel 將永遠地被下面這個簡單的方法所代替:

  1. TableUtilities.setViewToModel("table_config.xml", "Table", myJTable, myList);  

【編輯推薦】

  1. 淺談學習Swing組件
  2. Swing使用invokeLater()方法
  3. 淺析Swing組件的規則
  4. 詳解Swing中JTree組件的功能
  5. 簡單介紹Swing外觀
責任編輯:佚名 來源: 中國IT實驗室
相關推薦

2009-06-29 15:28:00

TableModelSwing開發

2009-07-14 09:52:10

TableModelESwing

2009-07-14 09:28:26

JTable和TablSwing

2017-04-19 08:47:42

AsyncJavascript異步代碼

2019-08-29 08:00:00

微服務架構服務網格

2025-05-21 08:23:52

IO開發Java

2011-11-04 10:22:43

Java Mail

2012-01-16 12:53:51

JavaSwing

2011-04-02 09:34:38

2012-02-16 09:11:34

Swing

2009-07-15 15:35:59

Swing程序Swing性能

2009-07-16 08:53:03

Swing任務Swing線程

2024-08-23 08:50:51

監控Python開發

2009-07-16 16:01:55

EventQueue

2011-04-12 10:04:01

OPLCFTTH

2021-03-03 23:20:51

機器學習保險人工智能

2009-07-10 10:37:50

Swing Set示例

2009-07-10 13:36:32

Swing容器

2009-07-15 14:29:24

構造JListSwing

2009-07-15 13:06:38

Swing組件
點贊
收藏

51CTO技術棧公眾號

一区二区免费av| 成人国内精品久久久久一区| 男女污污的视频| 香蕉视频在线免费看| 麻豆免费精品视频| 欧美激情影音先锋| 亚洲第一成人网站| 99tv成人影院| 五月综合激情日本mⅴ| 日产国产精品精品a∨| 国产伦精品一区二区三区视频痴汉| 欧美日韩三级| 中文字幕亚洲欧美日韩在线不卡| 欧美69精品久久久久久不卡| 韩国主播福利视频一区二区三区| 国产精品国产成人国产三级| 国产久一道中文一区| 免费无码国产精品| 国模一区二区三区| 中文字幕日韩电影| 国产一级黄色录像| 四虎精品在线观看| 日韩欧美国产激情| 台湾无码一区二区| 香港伦理在线| 黄色一级大片在线免费看国产| 国产日本亚洲| 色综合久久88色综合天天免费| 致1999电视剧免费观看策驰影院| 亚洲人在线观看视频| 国产精品综合网| 国产精品狼人色视频一区| 精品少妇爆乳无码av无码专区| 欧美先锋资源| 亚洲精品视频免费| 日韩综合第一页| 精品午夜视频| 欧美日本国产视频| 午夜精品在线免费观看| 精品丝袜在线| 亚洲国产精品久久一线不卡| 成人短视频在线看| av资源网在线观看| 久久久一区二区| 激情五月综合色婷婷一区二区 | 成人免费视频国产免费麻豆| 久久国产精品72免费观看| 国产91色在线播放| 国产原创视频在线| 国产精品视频| 91精品国产乱码久久久久久蜜臀 | 亚洲一二三区在线观看| 特色特色大片在线| 久cao在线| 国产精品毛片大码女人| 亚洲v国产v在线观看| 麻豆影视在线| 国产午夜亚洲精品理论片色戒| 久久久久高清| 三级做a全过程在线观看| 99r国产精品| 久久99精品久久久水蜜桃| 污污视频在线观看网站| aa级大片欧美| 美日韩精品免费| 日韩视频第二页| 日本一级淫片色费放| 国产精品激情电影| 午夜精品久久久久久99热软件| 日产精品久久久久久久| 日韩视频久久| 国产99视频精品免视看7| 亚洲精品一区二三区| 蜜臀av亚洲一区中文字幕| 国产欧美在线看| 99国产精品欲| 成人91在线观看| 免费成人av网站| seseavlu视频在线| 最新日韩av在线| www.男人天堂网| 成人免费观看在线观看| 美女免费视频一区| 亚洲精品视频免费在线观看| 亚洲熟妇一区二区三区| 成人aaaa| 久久精品久久精品亚洲人| 四虎永久免费在线| 在线精品观看| 国产成人精品综合| 99久久精品国产一区二区成人| 国产a级毛片一区| 久久五月天婷婷| 91激情在线| 一区二区三区精品视频在线| 国产午夜亚洲精品羞羞网站| 国产精品一区二区av| 欧美精品久久久久久久久久丰满| 国产精品欧美综合在线| 国产一区二区三区乱码| 欧美日韩国产网站| 妺妺窝人体色www在线观看| 男女av在线| 国产精品亲子乱子伦xxxx裸| 国产一区二区片| 欧洲一区二区三区精品| 欧美人xxxx| 国产黑丝一区二区| 日韩欧美精品一区| 久久久久久一区二区三区| 乱子伦一区二区三区| 国产精品亚洲一区二区三区在线 | 欧美亚洲综合视频| 亚洲国产成人精品女人久久久| 亚洲欧美va天堂人熟伦| 国产综合精品一区| 成人免费xxxxx在线观看| 婷婷av一区二区三区| 最新久久zyz资源站| 精品中文字幕av| 欧美高清一级片| 国产亚洲欧美日韩精品| 日本免费在线播放| 加勒比av一区二区| 日本一区二区三区在线视频| 白白色在线观看| 91精品国产欧美一区二区18| 熟女俱乐部一区二区| 1024日韩| 97人人干人人| 免费a级人成a大片在线观看| 色噜噜狠狠成人中文综合| 韩国三级在线看| 欧美电影《睫毛膏》| 日韩男女性生活视频| 手机在线观看毛片| 亚洲第一主播视频| 国产乱国产乱老熟300部视频| 97偷自拍亚洲综合二区| 成人小视频在线观看| 国产精品久久激情| 三级视频网站在线| 精品久久久国产精品999| www.四虎精品| 国内激情久久| 国产成人免费观看| 成人在线免费观看黄色| 欧美一级在线免费| 极品颜值美女露脸啪啪| 国产真实精品久久二三区| 中文字幕中文字幕在线中一区高清 | 成人成人成人在线视频| 福利在线一区二区| 国产精品一线| 91国产在线精品| 人人妻人人玩人人澡人人爽| 亚洲图片欧美色图| yjizz视频| 在线播放日韩| 久久久久久国产精品一区| 蜜桃视频在线网站| 日韩精品中文在线观看| 日本一本在线观看| 中文在线一区二区| 午夜视频在线观| 亚洲最新色图| 成人看片在线| 国内激情视频在线观看| 亚洲女人被黑人巨大进入| 日韩电影在线观看一区二区| 一个色综合网| 欧美影院一区二区三区| 亚洲精品成人av久久| 另类中文字幕网| 一级黄色片播放| 爱高潮www亚洲精品| 91成人在线观看国产| 久蕉在线视频| 欧美日韩国产免费一区二区 | 亚洲免费一级片| 丰满岳妇乱一区二区三区| wwwwxxxx国产| 老司机午夜精品99久久| 男女啪啪免费观看| 麻豆一区二区| 国产精品视频男人的天堂| 成人黄色在线电影| 精品国产电影一区二区| 精品人妻一区二区色欲产成人| 国产女主播在线一区二区| 久热在线视频观看| 欧美日韩三区| 日韩av大全| 亚洲精品视频一二三区| 日韩美女免费视频| dy888亚洲精品一区二区三区| 亚洲成人xxx| 姑娘第5集在线观看免费好剧| 亚洲美女视频在线观看| 30一40一50老女人毛片| 精品一区二区三区av| 国产不卡一区二区视频| 日韩在线综合| 国产一区在线免费观看| 国产麻豆一区| 午夜精品久久久久久久白皮肤 | 国产特级aaaaaa大片| 在线一区av| 6080午夜不卡| 麻豆久久久久久久久久| 亚洲三级免费电影| 美女洗澡无遮挡| 成人精品免费视频| 手机免费av片| 久久精品伊人| 一本久道高清无码视频| 99久久影视| 日韩中文一区| 很污的网站在线观看| 成人黄色av| 精品一卡二卡三卡四卡日本乱码| 国产精品天堂蜜av在线播放 | 欧美日韩国产精品一卡| 欧美不卡在线观看| 国产精品久久久久久久美男| а√天堂8资源中文在线| 久久综合网hezyo| 国产私人尤物无码不卡| 亚洲精品美女免费| 亚洲第一黄色片| 7777精品伊人久久久大香线蕉最新版| av黄色在线播放| 亚洲成在人线免费| 欧美精品久久久久性色| 亚洲欧洲另类国产综合| 日韩精品无码一区二区三区久久久| 成人久久久精品乱码一区二区三区| 亚洲一级片av| 精品一区二区在线观看| 国产理论在线播放| 日本不卡中文字幕| 欧美激情精品久久久久久小说| 国产亚洲激情| 欧美精品一区在线观看| 色哟哟视频在线| 国产传媒欧美日韩成人| 制服丝袜中文字幕第一页 | 欧洲精品在线视频| 松下纱荣子在线观看| 97在线看福利| 人成在线免费网站| 国产69精品99久久久久久宅男| 免费男女羞羞的视频网站在线观看| 不卡伊人av在线播放| gogo在线观看| 欧美激情xxxx| 久草视频这里只有精品| 欧美电影《轻佻寡妇》| 中文字幕中文字幕在线中心一区 | 黄色a级在线观看| 香蕉视频黄在线观看| 国产精品亚洲综合一区在线观看| 久久精品久久99| 国产美女在线精品| 波多野吉衣在线视频| 成人少妇影院yyyy| 中文字幕在线永久| 久久亚洲综合av| 日韩视频在线观看免费视频| 国产精品国产三级国产a| 国产免费美女视频| 一区二区三区四区不卡视频 | 天天操天天综合网| 亚洲不卡视频在线观看| 欧美影院午夜播放| 精品人妻伦一二三区久久| 精品国产不卡一区二区三区| 天堂v在线观看| 欲色天天网综合久久| a毛片在线观看| 97久久精品国产| 日韩欧美2区| 亚洲伊人久久综合| 思热99re视热频这里只精品| 日本视频一区二区在线观看| 国产精品久久久久久| 拔插拔插海外华人免费| 日韩精品国产欧美| 亚洲AV无码久久精品国产一区| 成人精品视频一区二区三区尤物| 欧美多人猛交狂配| 亚洲视频一二三| 久久香蕉精品视频| 在线亚洲高清视频| 亚洲黄色在线观看视频| 国产午夜精品全部视频播放| 怡红院在线播放| 国产成人久久久| 高清日韩中文字幕| 亚洲精品中文字幕在线| 亚洲大黄网站| 日本在线播放一区二区| 99久久国产综合精品女不卡| 亚洲熟女毛茸茸| 色综合久久中文字幕| 午夜精品一二三区| 色偷偷偷综合中文字幕;dd| www.51av欧美视频| 91夜夜未满十八勿入爽爽影院 | 在线免费一区| 中文在线一区| 男人操女人下面视频| 欧美极品aⅴ影院| 日本熟伦人妇xxxx| 欧美丰满少妇xxxbbb| 九色视频在线播放| 久久久久久久香蕉网| 国产999精品在线观看| 日韩久久不卡| 极品日韩av| 国内精品国产三级国产aⅴ久| 国产亚洲一区二区三区| 日韩成人在线免费视频| 日韩欧美一级在线播放| 精品51国产黑色丝袜高跟鞋| 久久久久久久久久久91| 精品视频成人| 一区二区三区四区视频在线| 久久亚洲不卡| 一级国产黄色片| 亚洲一二三四区| 亚洲av无码乱码国产精品久久| 久久久国产一区二区| 欧美高清免费| 亚洲欧美日产图| 日本亚洲视频在线| 熟女少妇内射日韩亚洲| 欧美日韩中文字幕在线| 色偷偷在线观看| 欧美激情综合色| 91成人福利| 国产精品va在线观看无码| 国产精品一卡二卡在线观看| 91香蕉视频网| 欧美精品在线一区二区| 国产原创视频在线观看| 成人福利免费观看| 久久久9色精品国产一区二区三区| 在线看的黄色网址| 国产精品免费aⅴ片在线观看| 综合久久中文字幕| 丝袜情趣国产精品| 日韩色性视频| 亚洲精品少妇一区二区| 成人永久aaa| 特一级黄色大片| 亚洲乱码一区av黑人高潮| 欧美大片1688| 水蜜桃一区二区三区| 男人的天堂亚洲一区| 99re6热在线精品视频| 7777精品伊人久久久大香线蕉的 | 可以免费看毛片的网站| 久久久久久久久中文字幕| 日本国产精品| 91香蕉视频污版| 亚洲欧洲精品一区二区三区不卡| 国产乱淫a∨片免费视频| 天堂精品久久久久| 亚洲国产精品www| 韩国av一区二区三区在线观看| 欧美色图一区二区| 亚洲激情视频在线观看| 偷拍视频一区二区三区| 伊人久久大香线蕉av一区| 国产丶欧美丶日本不卡视频| 日本在线观看中文字幕| 亚洲人成网站免费播放| 成人污污www网站免费丝瓜| 久久成人福利视频| 久久久99精品免费观看| 99在线精品视频免费观看20| 欧美精品久久久久久久免费观看| 美女毛片一区二区三区四区最新中文字幕亚洲| 成年人在线看片| 自拍偷拍欧美激情| 亚洲区小说区图片区| 成人h视频在线| 国产欧美91| 亚洲精品国产精品乱码在线观看| 欧美成人在线直播| 日韩电影免费观看高清完整版| 一级全黄肉体裸体全过程| 99久久综合国产精品| 亚洲天堂男人网| 国内精品久久久久影院 日本资源| 精品国产91乱码一区二区三区四区| 久久久久亚洲av无码麻豆| 欧美日韩中文字幕在线| 2024最新电影免费在线观看|