3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TIJ阅读笔记(第十四章)[转]

發布時間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TIJ阅读笔记(第十四章)[转] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

14: 創建窗口與Applet

設計的宗旨是"能輕松完成簡單的任務,有辦法完成復雜的任務"

本章只介紹Java 2Swing類庫,并且合理假定SwingJava GUI類庫的發展方向。

本章的開頭部分會講,用Swing創建applet與創建應用程序有什么不同,以及怎樣創建一個既能當applet在瀏覽器里運行,又能當普通的應用程序,在命令行下運行程序。

Swing類庫的體系龐大,而本章的目的也只是想讓你從基礎開始理解并且熟悉這些概念。如果你有更高的要求,只要肯花精力研究,Swing大概都能做到。

你越了解Swing,你就越能體會到:

  • 與其它語言或開發環境相比,Swing是一個好得多的編程模型。而JavaBeans (本章的臨近結尾的地方會作介紹)則是專為這個構架服務的類庫。
  • 就整個Java開發環境來講,"GUI builders" (可視化編程環境)只是一個"社交"的層面。當你用圖形工具把組件放到窗體上的時候,實際上是GUI builder在調用JavaBeansSwing為你編寫代碼。這樣不僅能可以加快GUI的開發速度,而且能讓你做更多實驗。這樣你就可以嘗試更多的方案,得到更好的效果了。
  • Swing的簡單易用與設計合理,使你即便用GUI builder也能得到可讀性頗佳的代碼。這一點解決了GUI builder的一個老問題,那就是代碼的可讀性。
  • Swing囊括了所有比較時髦的用戶界面元素:從帶圖像的按鈕到樹型控件和表格控件,應有盡有。考慮到類庫的規模,其復雜性還是比較理想的。如果要做的東西比較簡單,代碼就不會很多,如果項目很復雜,那么代碼就會相應地變得復雜。也就是說入門很容易,但是如果有必要,它也可以變得很強大。

    Swing的好感,很大程度上源于其"使用的正交性"。也就是說,一旦領會了這個類庫的精神,你就可以把這種概念應用到任何地方。這一點首先就緣于其標準的命名規范。通常情況下,如果想把組件嵌套到其它組件里,直接插就行了。

    為了照顧運行速度,組件都是"輕量級"的。為了能跨平臺,Swing是完全用Java寫的。

    鍵盤支持是內置的;運行Swing應用的時候可以完全不用鼠標,這一點,不需要額外的編程。加滾動條,很容易,只要把控件直接嵌到JScrollPane里就行了。加Tooltip也只要一行代碼。

    Swing還提供一種更前衛的,被稱為"pluggable look and feel(可插接式外觀)"的功能,也就是說用戶界面的外觀可以根據操作系統或用戶的習慣動態地改變。你甚至可以自己發明一套外觀(當然是很難的)

    基本的applet

    Java能創建applet,也就是一種能在Web瀏覽器里運行的小程序。Applet必須安全,所以它的功能很有限。但是applet是一種很強大的客戶端編程工具,而后者是Web開發的一個大課題。

    Applet的限制

    applet編程的限制是很多的,所以也經常被稱作關在"沙箱"里。因為時時刻刻都有一個人——也就是Java的運行時安全系統——在監視著你。

    不過你也可以走出沙箱,編寫普通的應用程序而不是applet,這樣就可以訪問操作系統的其它功能了。迄今為止,我們寫的都是這種應用程序,只不過它們都是些沒有圖形界面的控制臺程序罷了。Swing也可以寫GUI界面的應用程序。

    大體上說,要想知道applet能做什么,最好先去了解一下,為什么要有applet:用它來擴展瀏覽器里的Web頁面的功能。因為上網的人是不可能真正知道這個頁面是不是來自于一個無惡意的網站的,但是你又必須確保所有運行的代碼都是安全的。所以你會發現,它的最大的限制是:

  • Applet不能訪問本地磁盤。Javaapplet提供了數字簽名。你可以選擇讓有數字簽名(由可信的開發商簽署)applet訪問你的硬盤,這樣applet的很多限制就被解除了。本章的后面在講Java Web Start的時候,會介紹一個這樣的例子的。Web Start是一種通過Internet將應用程序安全地送到客戶端的方案。
  • Applet的啟動時間很長,因為每次都得下載所有東西,而且每下載一個類都要向服務器發一個請求。或許瀏覽器會作緩存,但這并不是一定的。所以一定要把applet的全部組件打成一個JAR(Java ARchive)卷宗(除了.class文件之外,還包括圖像,聲音),這樣只要發一個請求就可以下載整個applet了。JAR卷宗里的東西可以逐項地"數字簽名"
  • Applet的優勢

    如果你不在意這些限制,applet還是有明顯優勢的,特別是在構建client/server 或是其他網絡應用的時候:

  • 沒有安裝的問題。Applet是真正平臺無關的(包括播放音頻文件) ,所以你用不著去為不同的平臺修改程序,用戶也用不著安裝完了之后再作調整。實際上每次載入有appletWeb頁面時,安裝就自動完成了。因此軟件的更新可以不驚動客戶自動地完成。為傳統的client/server系統構建和安裝一個新版的軟件,通常都是一場惡夢。
  • 由于Java語言和applet內置了安全機制,因此你不用擔心錯誤代碼會破壞別人的機器。有了這兩個優勢,Java就能在intranetclient/server應用里大展身手了。所謂intranetclient/server應用,是指僅存在于公司內部的,或者可以限定和控制用戶環境的(Web瀏覽器和插件)特殊場合的client/server應用。
  • 由于applet是自動集成到HTML里面的,因此你就有了一種與平臺無關的,能支持applet的文檔系統了(譯者注:指HTML)。這真是太有趣了,因為我們通常都認為文檔是程序的一部分,而不是相反。

    應用框架

    類庫通常按功能進行分類。有些類庫是拿來直接用的,比如Java標準類庫里面的StringArrayList。有些類庫則是用來創建其它類的。此外還有一種被稱為應用框架(application framework)的類庫。它的目的是,提供一個或一組具備某些基本功能的類,幫助程序員創建應用程序。而這些基本功能,是這類應用程序所必備的。于是你寫應用程序的時候,只要繼承這個類,然后再根據需要,覆寫幾個你感興趣的方法,定制一下它的行為就可以了。應用框架的默認控制機制會在適當的時機,調用那些你寫的方法。應用框架是一種"將會變和不會變的東西分開來"的絕好的例子。它的設計思想是,通過覆寫方法把程序的個性化部分留在本地。[76]

    Applet是用應用框架創建的。你只要繼承JApplet類,再覆寫幾個方法就可以了。下面幾個方法可以控制Web頁面上的applet的創建和執行:

    方法

    操作

    init( )

    applet初始化的時候會自動調用,其任務包括裝載組件的布局。必須覆寫。

    start( )

    Web瀏覽器上顯示applet的時候調用。顯示完畢之后,applet才開始正常工作,(特別是那些用stop( )關閉的applet)(此外,應用框架)調用完init( )之后也會調用這個方法。

    stop( )

    appletWeb瀏覽器上消失的時候調用,這樣它就能關閉一些很耗資源的操作了。此外(應用框架調用)destroy( )之前也會先調用這個方法。

    destroy( )

    (瀏覽器)不再需要這個applet了,要把它從頁面里卸載下來的時候,就會調用這個方法以釋放資源了。

    注意applet不需要main()。它已經包括在應用框架里了;你只要把啟動代碼放到init( )里面就行了。

    JLabel的構造函數需要一個String作參數。

    init( )方法負責將組件add( )到表單上。或許你會覺得,應該能直接調用它自己(JApplet)add( )方法。實際上AWT就是這么做的。Swing要求你將所有的組件都加到表單的"內容面板(content pane)"上,所以add( )的時候,必須先調用getContentPane( )

    Web瀏覽器里運行applet

    要想運行程序,先得把applet放到Web頁面里,然后用一個能運行JavaWeb瀏覽器打開頁面。你得用一種特殊的標記把applet放到Web頁面里,然后讓它來告訴頁面該怎樣裝載并運行這個applet

    這個步驟曾經非常簡單。那時Java自己就很簡單,所有人都用同一個Java,瀏覽器里的Java也都一樣。所以你只要稍微改一下HTML就行了,就像這樣:

    <applet code=Applet1 width=100 height=50>

    </applet>

    但是隨后而來的瀏覽器和語言大戰使我們(不僅是程序員,還包括最終用戶)都成了輸家。不久,Sun發現再也不能指望靠瀏覽器來支持風味醇正的Java了,唯一的解決方案是利用瀏覽器的擴展機制來提供"插件(add-on)"。通過這個辦法(要想禁掉Java,除非把所有第三方的插件全都禁掉,但是為了獲取競爭優勢,沒有一個瀏覽器的提供商會這么做的)Sun確保了Java不會被敵對的瀏覽器提供商給禁掉。

    對于Internet Explorer,這種擴展機制就是ActiveX的控件,而Netscape的則是plugin。你做頁面時必須為這兩個瀏覽器各寫一套標記,不過JDK自帶了一個能自動生成標記的HTMLconverter工具。下面就是用HTMLconverter處理過的Applet1HTML頁面:

    <!--"CONVERTED_APPLET"-->

    <!-- HTML CONVERTER -->

    <OBJECT

    ??? classid = "clsid:CAFEEFAC-0014-0001-0000-ABCDEFFEDCBA"

    ??? codebase = "http://java.sun.com/products/plugin/autodl/jinstall-1_4_1-windows-i586.cab#Version=1,4,1,0"

    ??? WIDTH = 100 HEIGHT = 50 >

    ??? <PARAM NAME = CODE VALUE = Applet1 >

    ??? <PARAM NAME = "type" VALUE = "application/x-java-applet;jpi-version=1.4.1">

    ??? <PARAM NAME = "scriptable" VALUE = "false">

    ??? <COMMENT>

    ????? <EMBED

    ????????? type = "application/x-java-applet;jpi-version=1.4.1"

    ????????? CODE = Applet1

    ????????? WIDTH = 100

    ????????? HEIGHT = 50 ?

    ????????? scriptable = false

    ????????? pluginspage = "http://java.sun.com/products/plugin/index.html#download">

    ????????? <NOEMBED>

    ????????? </NOEMBED>

    ????? </EMBED>

    ??? </COMMENT>

    </OBJECT>

    <!--

    <APPLET CODE = Applet1 WIDTH = 100 HEIGHT = 50>

    </APPLET>

    -->

    <!--"END_CONVERTED_APPLET"-->

    ?

    code的值是applet所處的.class文件的名字,widthheight則表示applet的初始尺寸(和前面一樣,以象素為單位)。此外applet標記里面還可以放一些東西:到哪里去找.class文件(codebase),怎樣對齊(align)applet相互通訊的時候要用的標識符(name),以及提供給applet的參數。參數的格式是這樣的:

    <param name="identifier" value = "information">

    你可以根據需要,加任意多個參數。

    Appletviewer的用法

    SunJDK包含一個名為Appletviewer的工具,它可以根據<applet>標記在HTML文件里找出applet,然后不顯示HTML文本,直接運行這個applet。由于Appletviewer忽略了除applet標記之外的所有其他東西,因此你可以直接把applet標記當作注釋放到Java的源文件里:

    // <applet code=MyApplet width=200 height=100></applet>

    這樣你就可以用"appletviewer MyApplet.java"來啟動applet了,不用再寫HTML的測試文件了。

    Applet的測試

    如果只是想簡單的測試一下,那么根本不用上網。直接啟動Web瀏覽器,打開含applet標記的HTML文件就可以了。瀏覽器裝載HTML的時候會發現applet標記,并且按照code的值去找相應的.class文件。當然,是在CLASSPATH里面找。如果CLASSPATH里沒有,它就在瀏覽器的狀態欄里給一個錯誤信息,告訴你找不到.class文件。

    如果客戶端的瀏覽器不能在服務器上找到.class文件,它會到客戶機的CLASSPATH里面去找。這樣一來,就有可能發生,瀏覽器在服務器上找不到.class文件,因此用你機器上的文件啟動了applet的情形了。于是在你看來一切都很正常,而其他人則什么都看不見了。所以測試之前,一定要把本地的.class文件(.jar文件)全部刪了,只有這樣才能知道程序是不是呆在正確的服務器目錄里。

    我就曾經在這里栽過一個很冤枉的跟頭。有一次,我上載HTMLapplet的時候搞錯了package的名字,因此把applet放錯了目錄。但是我的瀏覽器還能在本地的CLASSPATH里找到程序,所以我成了唯一一個能正常運行這個applet的人了。所以給applet標記的CODE參數賦值的時候,一定要給全名,這一點非常重要。很多公開發表的applet都沒有打包,但是實際工作中,最好還是打個包。

    用命令行啟動applet

    有時你還會希望讓GUI程序能做一些別的事情。比方說在保留Java引以為豪的跨平臺性的前提下,讓它做一些"普通"程序能作的事。

    你可以用Swing類庫寫出與當前操作系統的外觀風格完全一致的應用程序。如果你要編寫GUI程序,先看看是不是能最新版的Java及與之相關的工具,只有是,那才值得去寫。因為只有這樣,才能寫出不會讓用戶覺得討厭的程序。。

    你肯定會希望能編寫出既能在命令行下啟動,又能當applet運行的程序。這樣測試applet的時候,會非常方便。因為通常從命令行啟動要比從Web瀏覽器和Appletviewer啟動更快,也更方便。

    要想創建能用命令行啟動的applet,只要在類里加一個main( ),讓它把這個applet的實例嵌到JFrame里面就行了。

    我們只加了一個main( ),其它什么都沒動。main( )創建了applet的實例,并把它加到JFrame里面,這樣我們就能看到它了。

    你會看到main( )明確地調用了appletinit( )start( )。這是因為,這兩步原先是交給瀏覽器做的。當然這并不能完全替代瀏覽器,因為前者還會調用stop( )destroy( ),不過大致說來,這個辦法還是可行的。如果還有問題,你可以親自去調用。[80]

    注意,要是沒有這行:

    frame.setVisible(true);

    那么你什么都看不見。

    一個專門用來顯示Applet的框架

    雖然將applet轉換成應用程序的代碼是非常有用的,但寫多了就既浪費紙張又讓人生厭了。

    setDefaultCloseOperation( )的作用是,告訴程序,一旦JFrame被關掉了,程序也應該退出了。默認情況下關掉JFrame并不意味著退出程序,所以除非你調用setDefaultCloseOperation( )或者寫一些類似的代碼,否則程序是不會中止的。

    制作按鈕

    做按鈕很簡單:想讓按鈕顯示什么,就拿它作參數去調用JButton的構造函數。

    通常按鈕是類的一個字段,這樣就能用它來表示按鈕了。

    JButton是一個組件——它有自己的小窗口——更新的時候會自動刷新。也就是說,你不用明確地指示該如何顯示按鈕或是其他什么控件;只要把它們放到表單上,它們就能自己把自己給畫出來了。所以你得在init( )把按鈕放到表單上。

    在往content pane里面加東西之前,我們先把它的"布局管理器(layout manager)"設成FlowLayout。布局管理器的作用是告訴面板將控件放在表單上的哪個位置。這里我們不能用applet默認的BorderLayout,這是因為如果用它,一旦你往表單上加了新的控件,舊控件就會被全部遮住了。而FlowLayout則會讓控件均勻地散布在表單上,從左到右,從上到下。

    捕捉事件

    編寫事件驅動的程序是GUI編程的一個重要重要組成部分,而驅動程序的基本思路就是,將事件與代碼聯系起來。

    Swing的思路是,將接口(圖形組件)和實現(當組件發生了某個事件之后,你要運行的代碼)明明白白地分開來。Swing組件能通報在它身上可以發生什么事件,以及發生了什么事件。所以,如果你對某個事件不感興趣,比如鼠標從按鈕的上方經過,你完全可以不去理會這個事件。用這種方法能非常簡潔優雅地解決事件驅動的問題,一旦你理解了其基本概念,你甚至可以去直接使用過去從未看到過的Swing組件。實際上這個模型也適用于JavaBean

    我們還是先來關心一下我們要用的這個控件的主要事件。就這個例子而言,這個控件JButton,而"我們感興趣的事件"就是按下按鈕。要想表示你對按鈕被按下感興趣,可以調用addActionListener( )。這個方法需要一個ActionListener參數。ActionListener是一個接口,它只有一個方法,actionPerformed( )。所以要想讓JButton執行任務,你就得實現先定制一個ActionListener,然后用addActionListener方法把這個類的實例注冊給JButton。當按鈕被按下的時候,這個方法就會啟動了。(這通常被稱作回調(callback))

    JTextField這個組件可以顯示文本。它的文本既可以是用戶輸入的,也可以是程序插的。雖然創建JTextField的方法有很多,但是最簡單的還是把寬度直接傳給JTextField的構造函數。等到JTextField被放上了表單,你就可以用setText( )來修改內容了(JTextField還有很多方法,請參閱JDK文檔)

    JTextArea

    JTextField相比,JTextArea能容納多行文字,提供更多的功能,除此之外它們很相似。append( )方法很有用;你可以用它把程序的輸出直接導到JTextArea里,這樣你就能用Swing程序來改進我們先前寫的,往標準輸出上打印的命令行程序了(因為你能用滾動條看到前面的輸出了)

    在把JTextArea加入applet的時候,我們先把它嵌入JScrollPane,這樣一旦文本多了出來,滾動條就會自動顯現了。裝滾動條就這么簡單。相比其它GUI編程環境下的類似控件,JScrollPane的簡潔與優雅真是令人折服。

    控制布局

    Java把組件放到表單上的方法可能與你見過的其他GUI系統的都不同。首先,它全部都是代碼,根本沒有"資源"這個故事。其次,組件在表單上的位置不是由絕對定位來控制的,而是由一個被稱為"布局管理器"的對象來控制的。布局管理器的作用是根據組件add( )的順序,決定其擺放的位置。組件的大小,形狀,擺放的位置會隨布局管理器的不同而有明顯的差別。此外布局管理器會根據applet或應用程序的窗口大小,自動調整組件的位置,這樣一旦窗口的大小改變了,組件的尺寸,形狀,擺放位置也會相應的作出調整。

    JAppletJFrame JWindow以及JDialog,這幾個組件都有一個getContentPane( )方法。這個方法能返回一個Container,而這個Container的作用是安置(contain)和顯示ComponentContainer有一個setLayout( )方法,你就是用它來選擇布局管理器的。其它類,比如JPanel,能直接安置和顯示組件,所以你得跳過內容面板(content pane)直接設置它的布局管理器。

    BorderLayout

    Applet的默認布局管理器是BorderLayout。如果沒有其它指令,BorderLayout會把所有控件全都放到表單的正中,并且拉伸到最大。

    好在BorderLayout的功能還不止這些。它還有四個邊界以及中央的概念。當你往BorderLayout的面板上加控件加時,你還可以選擇重載過的add( )方法。這時要給它一個常量。這個常量可以是下邊五個中的一個:

    BorderLayout. NORTH

    頂邊

    BorderLayout. SOUTH

    底邊

    BorderLayout. EAST

    右邊

    BorderLayout. WEST

    左邊

    BorderLayout.CENTER

    填滿當中,除非碰到其它組件或表單的邊緣

    如果你不指明擺放對象的區域,默認它就使用CENTER

    除了CENTER,其它控件都會在一個方向上壓縮到最小,在另一個方向上拉伸到最大。而CENTER則會往兩個方向上拉伸,直至占滿整個中間區域。

    FlowLayout

    它會讓組件直接""到表單上,從左到右,從上到下,一行滿了再換一行。

    用了FlowLayout之后,組件就會凍結在它的"固有"尺寸上。比如JButton就會根據字符串的長度來安排大小。

    由于FlowLayout面板上的控件會被自動地壓縮到最小,因此時常會出現一些意外。比方說,JLabel是根據字符串來決定控件的大小的,所以當你對FlowLayout面板上的JLable控件的文本作右對齊時,顯示效果不會有任何變化。

    GridLayout

    GridLayout的意思是,把表單視作組件的表格,當你往里加東西的時候,它會按從左到右,從上到下的順序把組件放到格子里。創建布局管理器的時候,你得在構造函數里指明行和列的數目,這樣它就能幫你把表單劃分成相同大小的格子了。

    GridBagLayout

    GridBagLayout的作用是,當窗口的大小發生變化時,你能用它來準確地控制窗口各部分的反應。但與此同時,它也是最難和最復雜的布局管理器。它主要是供GUI builder生成代碼用的(或許GUI builder用的不是絕對定位而是GridBagLayout)。如果你的設計非常復雜,以至于不得不用GridBagLayout,那么建議你使用GUI builder

    絕對定位

    還可以這樣對圖形組件進行絕對定位:

  • Container的布局管理器設成nullsetLayout(null)
  • 往面板上加組件的時候,先調用setBounds( )reshape( )方法(根據各個版本)為組件設一個以象素為單位的矩形。這個步驟可以放在構造函數里,也可以放在paint( )里面,看你的需要。
  • 有些GUI builder主要用的就是這個方法,但是通常情況下,這并不是最好的方法。

    BoxLayout

    由于GridBagLayout實在是太難學難用了,所以Swing引入了一個新的BoxLayout。它保留了GridBagLayout的很多優點,但是卻沒那么復雜。所以當你想手工控制控件的布局時,可以優先考慮用它(再重申一遍,如果設計非常復雜,最好還是用GUI builder)BoxLayout能讓你在垂直和水平兩個方向上控制組件的擺放,它用一些被稱為支柱(struts)和膠水(glue)的東西來控制組件間的距離。

    BoxLayout的構造函數同其它布局管理器稍有些不同——它的第一個參數是這個BoxLayout將要控制的Container,第二個參數是布局的方向。

    為了簡化起鑒,Swing還提供了一種內置BoxLayout的特殊容器,Box(譯者注:這里的容器是指java.awt.Container)Box有兩個能創建水平和垂直對齊的boxstatic的方法,下面我們就用它來排列組件。

    有了Box之后,再要往content pane里加組件的時候,你就可以把它成第二的參數了。

    支柱(struts)會把組件隔開,它是大小是按象素算的。用的時候,只要把它當作空格加在兩個組件的中間就行了。

    與固定間距的struts不同,glue(膠水)會盡可能地將組件隔開。所以更準確的說,它應該是"彈簧(spring)"而不是"膠水"(再加上這種設計是基于被稱為"springs and struts"的思想的,因此這個術語就顯得有些奇怪了)

    strut只控制一個方向上的距離,而rigid area(剛性區域)則在兩個方向上固定組件間的距離。

    應該告訴你,對rigid area的評價不是那么的統一。實際上它就是絕對定位,因此有些人認為,它根本就是多余的。

    最佳方案?

    Swing的功能非常強大,短短幾行代碼就能做很多事。實際上你完全可以把這幾種布局結合起來,完成一些比較復雜的任務。但是,有些時候用手寫代碼創建GUI表單就不那么明智了;首先是太復雜,其次也不值得。JavaSwing的設計者們是想用語言和類庫去支持GUI builder工具,然后讓你用工具來簡化編程。實際上只要知道布局是怎么一回事,以及事件該怎么處理(下面講)就行了,懂不懂手寫代碼控制控件的擺放,其實并不重要。你完全可以選一個趁手的工具(畢竟Java的初衷就是想讓你提高編程的效率)

    Swing的事件模型

    Swing的事件模型中,組件可以發起("射出")事件。各種事件都是類。當有事件發生時,一個或多個"監聽器(listener)"會得到通知,并做出反應。這樣事件的來源就同它的處理程序分隔開來了。一般說來,程序員是不會去修改Swing組件的,他們寫的都是些事件處理程序,當組件收到事件時,會自動調用這些代碼,因此Swing的事件模型可稱得上是將接口與實現分隔開來的絕好范例了。

    實際上事件監聽器(event listener)就是一個實現listener接口的對象。所以,程序員要做的就是創建一個listener對象,然后向發起事件的組件注冊這個對象。注冊的過程就是調用組件的addXXXListener( )方法,這里"XXX"表示組件所發起的事件的類型。只要看一眼"addListener"方法的名字就能知道組件能處理哪種事件了,所以如果你讓它聽錯了事件,那么編譯就根本通不過。到后面你就會看到,JavaBean在決定它能處理哪些事件時,也遵循"addListener"的命名規范。

    事務邏輯都應該封裝成listener。創建listener的唯一的條件是,它必須實現接口。你完全可以創建一個"全局的listener(global listener)",但是內部類或許更合適。這么做不僅是因為要根據UI或事務邏輯對listener進行邏輯分組,更重要的是(你很快就會看到),要利用內部類可以引用宿主類對象的特性,這樣就能跨越類或子系統的邊界進行調用了。

    我們前面的例子里已經涉及到Swing的事件模型了,下面我們把這個模型的細節補充完整。

    事件與監聽器種類

    所有Swing組件都有addXXXListener( )removeXXXListener( )方法,因此組件都能添加和刪除監聽器。你會發現,這里的"XXX"也正好是方法的參數,例如addMyListener(MyListener m)。下面這張表列出了基本的事件,監聽器和方法,以及與之相對應的,提供了addXXXListener( )removeXXXListener( )方法的組件。要知道,這個事件模型在設計時就強調了擴展性,因此你很可能會遇到這張表里沒有講到過的事件和監聽器。

    事件,listener接口以及addremove方法

    支持這一事件的組件

    ActionEvent
    ActionListener
    addActionListener( )
    removeActionListener( )

    JButton, JList, JTextField, JMenuItem 以及它們的派生類JCheckBoxMenuItem, JMenu,JpopupMenu

    AdjustmentEvent
    AdjustmentListener
    addAdjustmentListener( )
    removeAdjustmentListener( )

    JScrollbar以及實現Adjustable接口的組件

    ComponentEvent
    ComponentListener
    addComponentListener( )
    removeComponentListener( )

    *Component及其派生類JButton, JCheckBox, JComboBox, Container, JPanel, JApplet, JScrollPane, Window, JDialog, JFileDialog, JFrame, JLabel, JList, JScrollbar, JTextArea,JTextField

    ContainerEvent
    ContainerListener
    addContainerListener( )
    removeContainerListener( )

    Container及其派生類JPanel, JApplet, JScrollPane, Window, JDialog, JFileDialog,JFrame

    FocusEvent
    FocusListener
    addFocusListener( )
    removeFocusListener( )

    Component及其"派生類(derivatives*)"

    KeyEvent
    KeyListener
    addKeyListener( )
    removeKeyListener( )

    Component及其"派生類(derivatives*)"

    MouseEvent(包括點擊和移動)
    MouseListener
    addMouseListener( )
    removeMouseListener( )

    Component及其"派生類(derivatives*)"

    MouseEvent[81](包括點擊和移動)
    MouseMotionListener
    addMouseMotionListener( )
    removeMouseMotionListener( )

    Component及其"派生類(derivatives*)"

    WindowEvent
    WindowListener
    addWindowListener( )
    removeWindowListener( )

    Window及其派生類JDialog, JFileDialog,JFrame

    ItemEvent
    ItemListener
    addItemListener( )
    removeItemListener( )

    JCheckBox, JCheckBoxMenuItem, JComboBox, JList, 以及實現了ItemSelectableinterface的組件

    TextEvent
    TextListener
    addTextListener( )
    removeTextListener( )

    JTextComponent的派生類,包括JTextAreaJTextField

    一旦你知道了組件所支持的事件,你就用不著再去查文檔了。你只要:

  • event類的名字里的"Event"去掉,加上"Listener",這就是你要實現的接口的名字了。
  • 實現上述接口,想捕捉哪個事件就實現它的接口。比方說,如果你對鼠標的移動感興趣,你可以去實現MouseMotionListener接口的mouseMoved( )方法。(你必須實現這個接口的全套方法,但是這種情況下,通常都會有捷徑,過一會就會看到了。)
  • 創建一個listener的對象。在接口的名字前面加一個"add",然后用這個方法向組件注冊。比如,addMouseMotionListener( )
  • 下面是部分listener接口的方法:

    Listener接口/Adapter

    接口所定義的方法

    ActionListener

    actionPerformed(ActionEvent)

    AdjustmentListener

    adjustmentValueChanged(AdjustmentEvent)

    ComponentListener
    ComponentAdapter

    componentHidden(ComponentEvent)
    componentShown(ComponentEvent)
    componentMoved(ComponentEvent)
    componentResized(ComponentEvent)

    ContainerListener
    ContainerAdapter

    componentAdded(ContainerEvent)
    componentRemoved(ContainerEvent)

    FocusListener
    FocusAdapter

    focusGained(FocusEvent)
    focusLost(FocusEvent)

    KeyListener
    KeyAdapter

    keyPressed(KeyEvent)
    keyReleased(KeyEvent)
    keyTyped(KeyEvent)

    MouseListener
    MouseAdapter

    mouseClicked(MouseEvent)
    mouseEntered(MouseEvent)
    mouseExited(MouseEvent)
    mousePressed(MouseEvent)
    mouseReleased(MouseEvent)

    MouseMotionListener
    MouseMotionAdapter

    mouseDragged(MouseEvent)
    mouseMoved(MouseEvent)

    WindowListener
    WindowAdapter

    windowOpened(WindowEvent)
    windowClosing(WindowEvent)
    windowClosed(WindowEvent)
    windowActivated(WindowEvent)
    windowDeactivated(WindowEvent)
    windowIconified(WindowEvent)
    windowDeiconified(WindowEvent)

    ItemListener

    itemStateChanged(ItemEvent)

    之所以這張表不是很全,部分是因為事件模型允許你創建自己的事件及相關的listener。所以你時常會碰到一些在事件類型方面自成體系的類庫,而你在本章所學到的知識會幫助你學會使用這些事件。

    listeneradapter簡化編程

    可以看到上面那張表里的一些listener只有一個方法。實現這種接口的工作量并不大,因為寫完方法,接口也就實現了。但是如果你要使用有多個方法的listener的話,事情就不那么輕松愉快了。

    為了解決這個問題,有些(但不是全部)多方法的listener接口提供了適配器(adapter)。從上面那張表已經列出了它們的名字。適配器會為接口提供默認的空方法。這樣,你只要繼承適配器,根據需要覆寫方法就可以了。

    adapter就是用來簡化listener的創建的。

    但是適配器這種東西也有缺點。

    只是大小寫方面的一個疏漏,它就成為一個新方法了。還好,這還不是關閉窗口時會調用的方法,所以最壞的結果也只是不能實現預期的效果。雖然有種種不方便,但接口卻能保證讓你實現所有應該實現的方法。

    跟蹤多個事件

    Swing組件的一覽表

    現在你已經知道布局管理器和事件模型了,接下來就要學習怎樣使用Swing組件了。這部分只是一個大致的介紹,我們講的都是常用的Swing組件及其特性。

    記住:

  • JDK文檔里有所有Swing組件的資料。
  • Swing事件的命名規范比較合理,所以要猜該怎樣編寫和安裝事件處理程序也比較簡單。用我們前面講的ShowAddListeners.java來檢查組件。
  • 如果事情開始變得復雜了,那么恭喜你畢業了,該用GUI Builder了。
  • Button

    Swing收錄了很多Button,包括各種按鈕,check box radio button,甚至連菜單項(menu item)都是繼承AbstractButton(鑒于菜單項也牽涉進來了,(AbstractButton)可能還是叫"AbstractSelector"或其它什么名字更好一些)

    Button

    如果想讓radio button"幾選一"的方式運行(譯者注:原文為exclusive or,字面的意思是"排他性的邏輯與"),你就必須把他們加到一個"button(button group)"里。但只要是AbstractButton,都可以加進ButtonGroup

    這幾步給原本很簡單任務加了點難度。要讓button做到"幾選一",你必須先創建一個button組,然后把要加進去的button加進去。

    Icon

    Icon能用于JLabelAbstractButton(包括JButtonJCheckBoxJRadioButton以及JMenuItem)。把Icon用于JLabel的語法非常簡單

    你也可以使用你自己的gif文件。如果想打開文件讀取圖像,只要創建一個ImageIcon,并且把文件的名字傳給它就行了。接下來,你就可以在程序中使用這個Icon了。

    很多Swing組件構造函數都可以拿Icon作參數,不過你也可以用setIcon( )方法添加或修改Icon

    Tool tips

    幾乎所有與GUI相關的類都繼承自JComponent,而JComponent又包含了一個setToolText(String)方法。因此不管是哪種組件,只要能放到表單上,你幾乎都可以用(假設這是個JComponent的派生類對象jc)

    jc.setToolTipText("My tip");

    來設置tool tip。這樣只要鼠標停在JComponent上一段時間,旁邊就會跳出一個提示框,里面就是你設置的文本。

    Text fields

    Borders

    JComponent里面有一個setBorder( )方法,它能讓你為各種可視組件安上有趣的邊框。

    你還可以創建你自己的邊框,然后把它放到按鈕(button),標簽(label)或者其它控件里面,——只要它是繼承JComponent的就行。

    JScrollPanes

    大多數時候,你只需要JScrollPane能干好它的本職工作,但是你也可以去控制它,告訴它顯示哪根滾動條——垂直的,水平的,還是兩個都顯示或者兩個都不顯示。

    通過給JScrollPane的構造函數傳不同的參數,可以控制它的滾動條。

    一個袖珍的編輯器

    不用費多大的勁,JTextPane已經提供了很多編輯功能。

    applet的默認布局是BorderLayout。所以,如果你什么都不說,直接往面板里面加組件,那么它會填滿整個面板。但是如果你指明其位置(NORTHSOUTH EAST,或WEST),控件就會被釘在這個區域里。

    注意JTextPane的內置功能,比如自動換行。此外它還有很多其他功能,具體詳情請參閱JDK文檔。

    Check boxes

    Check box能讓你做逐項的開/關選擇。它由一個小框和一個標簽組成。一般來說,選中之后框里會有一個'x'(或者其它什么表示選中的標記),否則就是空的。

    一般來說,你用構造函數創建JCheckBox的時候,會傳給它一個用作標簽的參數。JCheckBox創建完了之后,你還可以隨時讀取或設置它的狀態,或者讀取或重設它的標簽。

    不管是選中還是清除,JCheckBox都會引發一個事件。捕捉方法同按鈕事件完全相同:ActionListener

    Radio buttons

    GUI編程里的radio button的概念來自于老式的汽車收音機里的機械式按鈕;當你按下一個按鈕之后,另一個就會彈出來。因此你只能選一個。

    要想創建一組相關聯的JRadioButton,只要把它們加進ButtonGroup就可以了(一個表單里允許有任意數量的ButtonGroup)。如果你(用構造函數的第二個參數)把多個radio button設成true了,那么只有最后一個才是有效的。

    注意,捕捉radio button事件的方法同捕捉其它事件的完全相同。

    text field它可以可以代替JLabel

    Combo boxes (下拉式列表)

    radio button組一樣,下拉式列表只允許用戶在一組選項里面選取一個元素。但是這種做法更簡潔,而且能在不驚擾客戶的情況下修改列表中的元素。(你也可以動態地修改radio button,但是這個視覺效果就太奇怪了)

    JComboBox的默認行為同Windowscombo box不太一樣。在Windows里,你既可以從combo box的列表里選一個,也可以自己輸入,但是在JComboBox里,這么做就必須先調用setEditable( )了。此外你只能從列表中選擇一個。下面我們舉一個例子。我們先給JComboBox加幾個選項,然后每按一下按鈕就加一個選項。

    List boxes

    List boxJComboBox的不同不僅僅在外觀上,它們之間有著非常重大的區別。JComboBox激活之后會彈出下拉框而JList則總是會在屏幕上占一塊固定大小,永遠也不會變。如果你想列表里的東西,只要調用getSelectedValues( )就行了,它會返回一個String的數組,其中包含著被選中的元素。

    JList能做多項選擇;如果你control-click了一個以上的選項(在用鼠標進行選擇的時候,一直按著"control"),那么已選中的選項就會一直保持"高亮(highlighted)",這樣你能選任意多個了。如果你先選一項,然后再shift-click另一個,那么兩個選項之間的所有選項就都被選中了。要取消一個選項只要control-click就可以了。

    如果你只是想把String數組放到JList里面,那么還有一個更簡單的辦法;就是把數組當作參數傳給JList的構造函數,這樣它就會自動創建一個列表了。

    JList不會自動提供滾動軸。當然只要把它嵌到JScrollPane里它就會自動鑲上滾動軸了,具體的細節它自會打理。

    Tabbed panes

    JTabbedPane能創建"帶頁簽的對話框(tabbed dialog)",也就是對話框的邊上有一個像文件夾的頁簽一樣的東西,你只要點擊這個頁簽,對話框就把這一頁顯示出來。

    Java編程當中熟練使用頁簽面板(tabbed panel)相當重要,因為每當applet要彈出一個對話框的時候,它都會自動加上一段警告,所以彈出式對話框在applet里并不受歡迎。

    程序運行起來你就會發現,如果tab太多了,JTabbedPane還會自動把它們堆起來以適應一定的行寬。

    Message boxes

    圖形界面系統通常都包含一套標準的,能讓你迅速地將消息傳給用戶,或者從用戶那里得到信息的對話框。對于Swing來說,這些消息框就包含在JOptionPane里面了。你有很多選擇(有些還相當復雜),但是最常用的可能還是"確認對話框(confirmation dialog)",它用static JOptionPane.showMessageDialog( )JOptionPane.showConfirmDialog( )啟動。

    注意showOptionDialog( )showInputDialog( )會返回用戶輸入的信息。

    菜單

    所有能包含菜單的組件,包括JAppletJFrameJDialog以及它們所派生的組件,都有一個需要JMenuBar作參數的setJMenuBar( )方法(一個組件只能有一個JMenuBar)。你可以把JMenu加入JMenuBar,再把JMenuItem加入JMenu。每個JMenuItem都可以連一個ActionListener,當你選中菜單項(menu item)的時候,事件就發出了。

    與使用資源的系統不同,JavaSwing要求你必須用源代碼來組裝菜單。

    通常情況下每個JMenuItem都得有一個它自己的ActionListener

    JMenuItemAbstractButton的派生類,所以它有一些類似按鈕的行為。JMenuItem本身就是一個可以置入下拉菜單的菜單選項。此外JMenuItem還有三個派生類:用來持有其它JMenuItemJMenu(這樣你就可以做層疊式菜單了);有一個能表示是否被選中的"候選標記(checkmark)"JCheckBoxMenuItem;以及包含一個radio buttonJRadioButtonMenuItem

    為了演示在程序運行期間動態地交換菜單條,我們創建了兩個JMenuBar。你會發現JMenuBar是由JMenu組成的,而JMenu又是由JMenuItemJCheckBoxMenuItem甚至JMenu(它會創建子菜單)組成的。等JMenuBar組裝完畢,你就可以用setJMenuBar( )方法把它安裝到當前程序里面了。注意當你按下鈕按的時候,它會用getJMenuBar( )來判斷當前的菜單,然后把另一菜單換上去。

    字符串的比較是引發編程錯誤的一大誘因。

    程序會自動的將菜單項勾掉或恢復。JCheckBoxMenuItem的代碼演示了兩種怎樣決定該勾掉哪個菜單項的方法。一個是匹配字符串(雖然也管用,但就像上面我們所講的,不是很安全),另一個則是匹配事件目標對象。正如你所看到的,getState( )方法可以返回JCheckBoxMenuItem的狀態,而setState( )則可以設置它的狀態。

    菜單事件不是很一致,這一點可能會引起混亂。JMenuItem使用ActionListener事件,而JCheckBoxMenuItem則使用ItemListener事件。JMenu也支持ActionListener,但通常沒什么用。總之,你得為每個JMenuItemJCheckBoxMenuItemJRadioButtonMenuItem都制備一個listener,不過這里我們偷了點懶,把一個ItemListenerActionListener連到多個菜單組件上了。

    Swing支持助記符,或者說"快捷鍵",這樣你就可以扔掉鼠標用鍵盤來選取AbstractButton(按鈕,菜單項等)。要這么做很容易,就拿JMenuItem舉例,你可以用它重載了的構造函數,把快捷鍵的標識符當作第二個參數傳給它。不過絕大多數AbstractButton都沒有提供類似的構造函數,所以比較通用的辦法還是用setMnemonic( )方法。在上述例程中我們為按鈕和多個菜單項加上了快捷鍵,這些快捷鍵的提示會自動顯示在組件上。

    好工具應該能幫你維護好菜單。

    彈出式菜單

    要想實現JPopupMenu,最直截了當的辦法就是創建一個繼承MouseAdapter的內部類,然后把這內部類的實例加到要提供彈出式菜單的組件里:

    JMenuItem用的是同一個ActionListener,它負責從菜單標簽里面提文本并且把它插入JTextField

    畫屏幕

    一個好的GUI框架能讓作圖相對而言比較簡單——確實如此,Swing就做到了。所有作圖問題都面臨同一個難點,那就是相比調用畫圖函數,計算該在哪里畫東西通常會更棘手,但不幸的是這種計算又常常和作圖函數的調用混在一起,所以作圖函數的接口的實際的復雜程度很可能會比你認為的要簡單。

    雖然你可以在任何一個JComponent上作畫,也就是說它們都能充當畫布(canvas),但是如果你想要一塊能直接畫東西的白板,最好還是創建一個繼承JPanel的類。這樣你只需要覆寫一個方法,也就是paintComponent( )就行了。當系統需要重畫組件的時候,會自動調用這個方法(通常情況下,你不必為此操心,因為這是由Swing控制的)。調用的時候,Swing會傳一個Graphics對象給這個方法,這樣你就能用這個對象作畫了。

    覆寫paintComponent( )的時候,必須首先調用其基類的同名方法。接下來再做什么就由你了決定了;通常是調用Graphics的方法在JPanel上畫畫或者是在其象素上著色。要想了解具體怎樣使用這些方法,可以查閱java.awt.Graphics文檔(可以到java.sun.com上面去找JDK文檔)

    如果問題非常復雜,那么還有一些更復雜的解決方案,比如第三方的JavaBean或者Java 2D API

    對話框

    所謂對話框是指,能從其他窗口里面彈出來的窗口。其作用是,在不搞亂原先窗口前提下,具體處理其某一部分的細節問題。對話框在GUI編程中的用途很廣,但是在applet中用的不多。

    要想創建對話框,你得先繼承JDialog。和JFrame一樣,JDialog也是另一種Window,它也有布局管理器(默認情況下是BorderLayout),也可以用事件監聽器來處理事件。它同JFrame有一個重要的區別,那就是在關對話框的時候別把程序也關了。相反你得用dispose( )方法將對話框窗口占用的資源全部釋放出來。

    一旦創建完JDialog,你就得用show( )來顯示和激活它了。關閉對話框的時候,還得記住要dispose( )

    你會發現,對applet來說,包括對話框在內所有彈出的東西都是"不可信任的"。也就是說彈出來的窗口里面有一個警告。這是因為,從理論上講惡意代碼可以利用這個功能來愚弄用戶,讓他們覺得自己是在運行一個本地應用程序,然后誤導它們輸入自己的信用卡號碼,再通過Web傳出去。applet總是和網頁聯在一起,因此只能用瀏覽器運行,但是對話框卻可以脫離網頁,所以從理論上講這種欺騙手段是成立的。所以這么一來,applet就不太會用到對話框了。

    由于static只能用于宿主類,因此內部類里不能再有static的數據或是嵌套類了。

    paintComponent( )負責把panel的周圍的方框以及"x""o"畫出來。雖然充斥著單調的計算,但是還算簡明。

    文件對話框

    有些操作系統還內置了一些特殊的對話框,比如讓你選擇字體,顏色,打印機之類的對話框。實際上所有的圖形操作系統都提供了打開和存儲文件的對話框,所以為了簡化起鑒,Java把它們都封裝到JFileChooser里面了。

    注意JFileChooser有很多變例可供選擇,比方說加一個過濾器濾文件名之類的。

    要用"open file"對話框就調用showOpenDialog( ),要用"save file"對話框,就調用showSaveDialog( )。在對話框關閉之前,這兩個函數是不會返回的。即便對話框關了,JFileChooser對象仍然還在,所以你還去讀它的數據。要想知道操作的結果,可以用getSelectedFile( )getCurrentDirectory( )。如果返回null則說明用戶按了cancel

    Swing組件上的HTML

    所有能顯示文件的組件都可以按照HTML的規則顯示HTML的文本。也就是說你可以很方便地讓Swing組件顯示很炫的文本。比如:

    文本必須以"<html>"開頭,下面你就可以用普通的HTML標記了。注意,它沒有強制你一定要關閉標記。

    JTabbedPaneJMenuItemJToolTipJRadioButton以及JCheckBox都支持HTML文本。

    Slider和進程條

    Slider能讓用戶通過來回移動一個點來輸入數據,有時這種做法還是很直觀的(比方說調節音量)。進程條(progress bar)則以一種用類比的方式顯示數據,它表示數據是"全部"還是"空的",這樣用戶就能有一個比較全面的了解了。

    JProgressBar還比較簡單,而JSlider的選項就比較多了,比如擺放的方向,大小刻度等等。注意一下給Slider加帶抬頭的邊框的那行代碼,多簡潔。

    JTree的用法可以簡單到只有下面這行代碼:

    add(new JTree(new Object[] {"this", "that", "other"}));

    這樣顯示的是一棵最基本的樹。JTreeAPI非常龐大,應該是Swing類庫里最大的之一了。雖然你可以用它來做任何事情,但是要想完成比較復雜任務,就需要一定的研究和實驗了。

    好在這個類庫還提供了變通手段,也就是一個"默認"的,能滿足一般需求的樹型組件。所以絕大多數情況下你都可以使用這個組件,只有在特殊情況下,你才需要去深入研究樹。

    Trees類包含一個用來創建多個Branch的兩維String數組,以及一個用來給數組定位的static int i。節點放在DefaultMutableTreeNode里面,但是實際在屏幕上顯示則是由JTree及與之相的model——DefaultTreeModel控制的。注意JTree在加入applet之前,先套了一件JScrollPane,這樣它就能提供自動的滾動軸了。

    JTree的操控是經由它的model來實現的。當model發生變化時,它會產生一個事件,讓JTree對樹的顯示作出必要的更新。init( )getModel( )提取這個model。當你按下按鈕的時候,它會創建一個新的新的"branch" 。等它找到當前選中的那個節點(如果什么也沒選,就用根節點)之后,modelinsertNodeInto( )方法就會接管所有的任務了,包括修改樹,刷新顯示等等。

    或許上述例程已能滿足你的需求了。但是樹的功能強大到只要你能想到它就能做到的地步。但是要知道:差不多每個類都有一個非常龐大的接口,所以你要花很多時間和精力去理解它的內部構造。但話說回來,它的設計還是很優秀的,其競爭者往往更糟。

    表格

    和樹一樣,Swing的表格控件也非常復雜強大。剛開始的時候,他們是想把它做成用JDBC連接數據庫時常用的"grid"接口,因此它具有極高的靈活性,不過代價就是復雜度了。它能讓你輕易創建一個全功能的電子表格程序,不過這要花整整一本書篇幅才能講清楚。但是如果你弄懂了基本原理,也可以用它來創建一個相對簡單的JTable

    JTable只負責怎樣顯示數據,而數據本身是由TableModel控制的。所以在創建JTable之前,你通常都得先創建一個TableModel。你可以從頭開始去實現TableModel接口,但是Java提供了一個AbstractTableModel的幫助類,繼承它會比較簡單。

    選擇Look & Feel

    所謂"可插接式的外觀風格(look & feel)"是指,你可以讓程序模擬其他操作環境的外觀。你甚至可以做一些更炫的事情,比如在程序運行期間動態改變其外觀。但是通常情況下,你只會在下面兩項中選一個:選擇"跨平臺"的外觀(也就是Swing"metal"),或者選當前操作系統的外觀,讓Java程序看上去就像是為這個操作系統定制的(絕大多數情況下,這幾乎是勿庸置疑的選擇,這樣用戶就不至于被搞糊涂了)。不管你選哪個,代碼都很簡單,但是必須先執行這些代碼再創建組件,因為組件是按照當前的look and feel創建的,而且程序運行到一半的時候,你再去改look and feel,它就不會跟著你去改了。(這個過程非常復雜,而且并不實用,所以我們把它留給Swing專著了)

    實際上如果你認為跨平臺的("metal")外觀是Swing程序的特色,而你也想用它,那你就可以什么都不作了——它是默認的look and feel。但是如果你選擇當前操作系統的外觀風格,那么只要插入下面這段代碼就可以了,一般來說是放在main( )開頭的地方,但是最晚要在加第一個組件之前:

    try {

    ? UIManager.setLookAndFeel(UIManager.

    ??? getSystemLookAndFeelClassName());

    } catch(Exception e) {

    ? throw new RuntimeException(e);

    }

    你根本不用在catch里面做任何事,因為如果選擇其他look and feel失敗的話,UIManager會回到默認的跨平臺的look and feel。但是在調試的時候這個異常還是很起作用的,最起碼你可以從catch里看到些什么。

    下面是一個用命令行參數來選擇look and feel的程序,順便也看看這幾個組件在不同的look and feel下都是什么樣子:

    假如你為一個對程序外觀有特殊要求的公司做一個framework的話,你甚至可以自創一套look and feel。不過這可是一個大工程,其難度遠遠超出了本書的范圍。

    剪貼板

    JFC與系統剪貼板的互動功能非常有限(java.awt.datatransfer package里面)。你可以把String對象當作文本復制到剪貼板里,也可以把剪貼板里的文本粘貼到String對象里。當然剪貼板支持任何類型的數據,至于數據在剪貼板里該怎么表示,那是粘貼數據的程序的事。Java通過"flavor"這個概念加強了剪貼板API的擴展性。當數據進到剪貼板的時候還跟著一組與這個數據相關聯的,可以轉換這些數據的flavor(比方說一幅畫可以表示成一個全部有數字組成的字符串或一個image),這樣你就能知道剪貼板里的數據是否支持你感興趣的flavor了。

    JTextFieldJTextArea它們原本就已經支持剪貼板了。

    可以期待,未來Java會提供更多的flavor。你能得到更多的數據flavor的支持。

    applet打成JAR卷宗

    JAR的一個主要用途就是優化applet的裝載。在Java 1.0時代,程序員們都盡量把applet的代碼塞進一個類里,這樣當用戶下載applet的時候只需向服務器發一次請求就可以了。但這么做不僅使代碼變得非常難讀(也難維護),而且.class文件也是未經壓縮的,因此下載速度仍有提升的潛力。

    JAR解決了這個問題,它把所有的.class文件全都壓縮在一個供瀏覽器下載的文件里。現在你可以大膽運用正確的設計方案而不用再擔心它會產生多少.class文件了,而用戶的下載速度也更快了。

    簽發applet

    由于沙箱安全模型的限制,未獲簽名的applet是不能在客戶端進行某些操作的,比如寫文件,連接本地網絡等。一旦你簽發了applet,用戶就可以去核對那個自稱創建了這個applet的人是不是真的就是創建者了,同時他們也可以確認JAR文件是不是在離開服務器之后被篡改了。沒有這些最起碼的保證,applet是根本不可能去做任何可能損壞計算機或泄漏個人隱私的事的。這層限制對于appletInternet上的安全運用是至關重要的,但同時也削弱了applet的功能。

    自從有了Java Plugin,簽發applet的步驟也變得更簡單也更標準化了,而applet也成為一種更簡便的部署應用程序的方法了。簽發applet已經變得非常簡單了,而且也有了標準的Java工具了。

    早先plugin還沒出來的時候,你得用Netscape的工具為Netscape的用戶簽署.jar文件,用Microsoft的工具為Internet Explorer用戶簽署.cab文件,然后在HTML文件里面為兩個平臺各自準備一套標記。而用戶也必須在瀏覽器里安裝證書,這樣applet才能獲得信任。

    Plugin不僅提供了標準化的簽署和部署applet的方法,而且能自動安裝證書,方便了用戶。

    } ///:~

    要想簽名,你必須先把它做成一個JAR文件(見本章前面講過的jar工具這一節),然后再簽署這個文件。

    有了JAR文件,你就得用證書或是密鑰來簽名了。如果是一個大公司,那么你可以跟VerisignThawte這樣的"認證中心(signing authority)"提申請,它們會給你發給你證書的。證書是用來給代碼簽名的,這樣用戶就能確信你確實是他所下載的這段代碼的提供者了,而且自你簽發之后,這段代碼未被篡改過。電子簽名的本質是一串兩進制的數,當有人要核對簽名的時候,那個給你發證書的認證中心會為你作證。

    認證中心發的證書是要付錢的,而且得定期更新。就這個問題而言,我們可以自己給自己簽一張證書。這個證書會存在文件里(通常被稱為keychain)。你可以用下面這條命令:

    keytool –list

    訪問默認的文件。如果默認的文件不存在,那么你還得先建一個,或者告訴它去找哪個文件。或許你應該去試試"cacerts"文件。

    keytool -list -file <path/filename>

    其默認路徑通常是

    {java.home}/lib/security/cacerts

    其中,java.home表示JRE所在的目錄。

    你也可以用keytool給自己發一份證書,供測試用。如果PATH環境變量里已經有Java"bin"目錄了,那么這個命令就是:

    keytool –genkey –alias <keyname> -keystore <url>

    其中keyname表示key的別名,比如“mykeyname”url表示存放密鑰的位置,通常就放在上面講的cacerts文件里。

    它會提示你輸入(keystore)密碼。默認是"changeit"(提醒你該做些什么)。然后是姓名,部門,單位,城市,州,國家。這些信息會被放進證書里。最后它會要你給證書設一個密碼。如果你對安全問題真的很在意,可以給它設一個單獨的密碼,默認情況下,證書的密碼就是"存證書的文件(keystore)"的密碼,一般來說這已經夠了。上面這些信息還可以用命令行提供給像Ant這樣的編譯工具使用。

    如果你不給參數,直接在命令行下用keytool命令,那么它會把所有的選項全部都打印出來。你或許想用-valid 選項,看看證書的有效期還有多長。

    如果想確認證書確實保存在cacerts文件里,用

    keytool –list –keystore <url>

    然后輸入前面設的密碼。或許你的證書和別人的存放在一起(如果別人已經在這個keystore里存了證書的話)

    你剛獲得的那張證書是你自己簽發的,所以認證中心是不會認帳的。如果你用這張證書簽發JAR文件,最終用戶那里就會看到一個警告窗口,同時強烈建議他們不要使用這個程序。除非你去買一份有效力的證書,否則否則你和你的用戶就得忍著。

    簽發JAR文件要用Javajarsigner標準工具,命令如下:

    jarsigner –keystore <url> <jarfile> <keyname>

    url表示cacerts文件的位置,jarfile表示JAR文件的名字,而keyname則是證書的別名。你還得再輸一遍密碼。

    現在這個JAR文件就帶上你的這張證書的簽名了,而用戶也能知道它在簽發之后是不是被篡改了(包括修改,添加或刪除等)

    接下來你得操心一下HTML文件的applet標記的"archive"屬性了,JAR的文件名就在這里。

    如果瀏覽器用的是Javapluginapplet的標記還要更復雜一些,不過你可以創建一個簡單點的,就像這樣:

    <APPLET

    ? CODE=package.AppletSubclass.class

    ? ARCHIVE = myjar.jar

    ? WIDTH=300

    ? HEIGHT=200>

    </APPLET>

    然后用HTMLConverter過一遍,它會自動幫你生成正確的applet標記。

    現在當用戶下載applet時,瀏覽器就會提醒他們現在正在裝載的是一個帶簽名的applet,并且問他是不是信任這個簽發者。正如我們前面所講的,測試用的證書并不具備很高的可信度,因此它會給一個警告。如果客戶信任了,applet就能訪問整個客戶系統了,于是它就和普通的程序沒什么兩樣了。

    JNLPJava Web Start

    雖然經過簽名的applet功能強大,甚至能在有效地取代應用程序,但它還是得在Web瀏覽器上運行。這不僅使客戶端增加了額外的運行瀏覽器的開銷,而且常常使用戶界面變得非常的單調和混亂。瀏覽器有它自己的菜單和工具條,而他們正好壓在applet的上面。

    Java的網絡啟動協議(Java Network Launch Protocol簡稱JNLP)能在不犧牲applet優點的前提下解決這個問題。你可以在客戶端上下載并安裝單獨的JNLP應用程序。它可以用命令行,桌面圖標,或隨JNLP一同分發的應用程序管理器啟動。程序甚至可以從最初下載的那個網站上啟動。

    JNLP程序運行的時候會動態地從Internet上下載資源,并且自動檢查其版本(如果用戶連著Internet的話)。也就是說它同時具備appletapplication的優點。

    applet一樣,客戶機在對待JNLP應用程序的時候也必須注意安全問題。JNLP應用程序是一種易于下載的,基于Web的應用程序,因此有可能會被惡意利用。有鑒于此,JNLP應用程序應該和applet一樣被放在沙箱里。同applet一樣,它可以用帶簽名的JAR文件部署,這時用戶可以選擇是不是信任簽發者。和applet的不同之處在于,即便沒有簽名,它仍然可以通過JNLP API去訪問客戶系統的某些資源(這就需要用戶在程序運行時認可這些請求了)

    JNLP是一個協議而非產品,因而得先把它實現了才能用。Java Web Start有稱JAWS就是Sun提供的,能免費下載的,JNLP的官方樣板實現。你只要下載安裝就行了,如果要做開發,不要忘了把JAR文件放到classpath里面。要想在網站上部署JNLP應用程序,只要確保服務器能認得application/x-java-jnlp-fileMIME類型就行了。如果是用最新版的Tomcat服務器(http://jakarta.apache.org/tomcat),那它應該已經幫你配置好了。否則就去查查服務器的用戶手冊。

    創建JNLP應用程序并不難。先創建一個標準的應用程序,然后用JAR打包,最后再準備一個啟動文件就行了。啟動文件是一個很簡單的XML文件,它負責向客戶端傳遞下載和安裝應用程序的信息。如果你決定用不帶簽名的JAR文件來部署軟件,那還得用JNLP API來訪問客戶端系統上的資源。

    注意,FileOpenServiceFileCloseServicejavax.jnlp里的類,要使用這兩個服務,不但要用ServiceManager.lookup( )提出請求,而且要用這個方法所返回的對象來訪問客戶端資源。如果你不想受JNLP束縛,要直接使用這些類的話,那就必須使用簽名的JAR文件。

    這個啟動文件的后綴名必須是.jnlp,此外它還必須和JAR文件呆在一個目錄里。

    這是一個根節點為<jnlp>標記的XML文件。這個節點下面還包括了一些子元素,其中絕大部分是自解釋的。

    jnlp元素的spec屬性告訴客戶端系統,這個應用程序需要哪個版本的JNLPcodebase屬性告訴客戶端到哪個目錄去找啟動文件和資源。通常它應該是一個指向Web服務器的HTTP URL,但這里為了測試需要,我們把它指到本機的目錄了。href屬性表示文件的名字。

    information標記里有多個提供與程序相關的信息的子元素。它們是供Java Web Start的管理控制臺或其它類似程序使用的。這些程序會把JNLP應用安裝到客戶端上,讓后讓用戶通過命令行,快捷方式或者其它什么方法啟動。

    resource標記的功能HTML文件里的applet標記相似。j2se子元素指明程序運行所需的j2se的版本,jar子元素告訴客戶端class文件被打在哪個JAR文件里。此外jar元素還有一個download屬性,其值可以是"eager""lazy",它的作用是告訴JNLP是不是應該下載完這個jar再開始運行程序。

    application-desc屬性告訴客戶端系統,可執行的class,也就是JAR文件的入口是哪個類。

    jnlp標記還有一個很有用的子元素,那就是這里沒用到的security標記。下面我們來看看security標記長什么樣子:

    <security>

    ?? <all-permissions/>

    <security/>

    只有在部署帶簽名的JAR文件時才能使用security標記。上面那段程序不需要這個標記,因為所有的本地資源都是通過JNLP服務來訪問的。

    此外還有一些其它標記,具體細節可以參考http://java.sun.com/products/javawebstart/download-spec.htm

    現在.jnlp文件也寫好了,接下來就是在網頁里加超鏈接了。這個頁面應該是個下載頁面。頁面上除了有復雜的格式和詳細介之外,千萬別忘了把這條加上:

    <a href="classname.jnlp">click here</a>

    這樣你就可以點擊鏈接啟動JNLP應用程序的安裝進程了。你只要下載一次,以后就可以通過管理控制臺來進行配置了。如果你用的是WindowsJava Web Start的話,那么第二次啟動程序的時候,它會提示你,是不是創建一個快捷方式。這種東西是可以配置的。

    我們這里只介紹了兩個JNLP服務,而當前版本里有七種。它們都是為特定的任務所設計的,比如像打印,剪貼板操作等。

    編程技巧

    由于JavaGUI編程是一個還在不斷改進的技術,Java 1.0/1.1Java 2Swing類庫之間就有著非常重大的區別,與舊模式相比,Swing能讓你用一種更好的方式編程。這里,我們會就其中一些問題做個介紹,同時檢驗一下這些編程技巧。

    動態綁定事件

    Swing的事件模型的優點就在于它的靈活性。你可以調用方法給組件添加或刪除事件。

  • Button可以連不止一個listener。通常組件是以多播(multicast)方式處理事件的,也就是說你可以為一個事件注冊多個listener。但是對于一些特殊的,以單播(unicast)方式處理事件的組件,這么做就會引發TooManyListenersException了。
  • 程序運行的時候能動態地往Button b2上面添加或刪除listener。你應該已經知道加listener的方法了,此外每個組件還有一個能用來刪listenerremoveXXXListener( )方法。
  • 這種靈活性為你帶來更大的便利

    值得注意的是,listener的添加順序并不一定就是它們的調用順序(雖然絕大多數JVM確實是這么實現的)

    將業務邏輯(business logic)與用戶界面分離開來

    一般情況下,設計類的時候總是強調一個類"只作一件事情"。涉及用戶界面的時候更是如此,因為你很可能會把"要作什么""要怎樣顯示"給混在一起了。這種耦合嚴重妨礙了代碼的復用。比較好的做法是將"業務邏輯(business login)"GUI分離開來。這樣不僅方便了業務邏輯代碼的復用,也簡化了GUI的復用。

    還有一種情況,就是多層系統(multitiered systems),也就是說業務對象(business object)"完全貯存在另一臺機器上。業務規則的集中管理能使規則的更新立即對新交易生效,因此這是這類系統所追求的目標。但是很多應用程序都會用到這些業務對象,所以它們絕不能同特定的顯示模式連在一起。它們應該只做業務處理,別的什么都不管。

    樹立了將UI同業務邏輯相分離的觀點之后,當你再碰到用Java去維護遺留下來的老代碼時,也能稍微輕松一點。

    范式

    內部類,Swing事件模型,還能繼續用下去的AWT事件模型,以及那些要我們用老辦法用的新類庫的功能,所有這些都使程序設計變得更混亂了。現在就連大家寫亂七八糟的代碼的方式也變得五花八門了。

    這些情況都是事實,但是你應該總是使用最簡單也最有條理的解決方案:Listener(通常要寫成內部類)來處理事件。

    用了這個模型,你可以少寫很多"讓我想想這個事件是誰發出的"這種代碼。所有代碼都在解決問題,而不是在做類型檢查。這是最佳的編程風格,寫出來的代碼不僅便于總結,可讀性和可維護性也高。

    并發與Swing

    Swing程序的時候,你很可能會忘了它還正用著線程。雖然你并沒有明確地創建過Thread對象,但它所引發的問題卻會乘你不備嚇你一跳。絕大多數情況下,你寫的Swing或其他帶窗口顯示的GUI程序都是事件驅動的,而且除非用戶用鼠標或鍵盤點擊GUI組件,否則什么事都不會發生。

    只要記住Swing有一個事件分派線程就行了,它會一直運行下去,并且按順序處理Swing的事件。如果你想確保程序不會發生死鎖或者競爭的情形,那么倒是要考慮一下這個問題。

    重訪Runnable

    在第13章,我曾建議大家在實現Runnable接口時一定要慎重。 當然如果你設計的類必須繼承另一個類而這個類又得有線程的行為,那么選擇Runnable還是對的。

    不同的JVM,在如何實現線程方面,存在著巨大的性能和行為差異。

    管理并發

    當你用main方法或另一個線程修改Swing組件的屬性時,一定要記住,有可能事件分派線程正在和你競爭同一個資源。

    看來線程遇到Swing的時候,麻煩也跟著來了。要解決這個問題,你必須確保Swing組件的屬性只能由事件分派線程來修改。

    這要比聽上去的容易一些。Swing提供了兩個方法,SwingUtilities.invokeLater( )SwingUtilities.invokeandWait( ),你可以從中選一個。它們負責絕大多數的工作,也就是說你不用去操心那些很復雜的線程同步的事了。

    這兩個方法都需要runnable對象作參數。當Swing的事件處理線程處理完隊列里的所有待處理事件之后,就會啟動它的run( )方法了。

    能用這兩個方法來設置Swing組件的屬性。

    可視化編程與JavaBeans

    看到現在你已經知道Java在代碼復用方面的價值了。復用程度最高的代碼是類,因為它是由一組緊密相關的特征(字段field)和行為(方法)組成的,它既能以合成(composition),也能以繼承的方式被復用。

    繼承和多態是面向對象編程的基礎,但是在構建應用程序的時候,絕大多數情況下,你真正需要的是能幫你完成特定任務的組件。你希望能把這些組件用到設計里面,就像電子工程師把芯片插到電路板上一樣。同樣,也應該有一些能加速這種"模塊化安裝"的編程方法。

    MicrosoftVisual Basic"可視化編程(Visual programming)"贏得了初次成功——非常巨大的成功,緊接著是第二代的Borland Delphi(直接啟發了JavaBean的設計) 。有了這些工具,組件就變得看得見摸的著了,而組件通常都表示像按鈕,文本框之類的可視組件,因此這樣一來組件編程也變得有意義了。實際上組件的外觀,通常是設計時是什么樣子運行時也就這樣,所以從控件框(palette)里往表單上拖放組件也就成了可視化編程的步驟了。而當你在這么做的時候,應用程序構造工具在幫你寫代碼,所以當程序運行時,它就會創建那些組件了。

    通常簡單地把組件拖到表單上還不足以創建程序。你還得修改一些特征,比如它的顏色,上面的文字,所連接的數據庫等等。這些在設計時可以修改的特征被稱為屬性(properties)。你可以在應用程序的構建工具里控制組件的屬性。當程序創建完畢,這些配置信息也被保存下來,這樣程序運行時就能激活這些配置信息了。

    看到現在你或許已經習慣這樣來理解對象了,也就是對象不僅是一組特征,還是一組行為。設計的時候,可視組件的行為部分的表現為事件,也就是說"是些能發生在這個組件上的事情"。一般來說你會用把代碼連到事件的方法來決定事件發生時該做些什么。

    下面就是關鍵部分了:應用程序的構建工具用reflection動態地查詢組件,找出這個組件支持哪些屬性和事件。一旦知道它是誰,構建工具就能把這些屬性顯示出來,然后讓你作修改了(創建程序的時候會把這些狀態保存下來),當然還有事件。總之,只要你在事件上雙擊鼠標或者其他什么操作,編程工具就會幫你準備好代碼的框架,然后連上事件。現在,你只要編寫事件發生時該執行的代碼就可以了。

    編程工具幫你做了這么多事,這樣你就能集中精力去解決程序的外觀和功能問題了,至于把各部分銜接起來的細節問題,就交給構建工具吧。可視化編程工具之所以能獲得如此巨大的成功,是因為它能極大的提高編程的效率,當然這一點首先體現在用戶界面,但是其它方面往往也受益頗豐。

    JavaBean是干什么用的?

    言歸正傳,組件實際上是一段封裝成類的代碼。關鍵在于,它能讓應用程序的構建工具把自己的屬性和事件提取出來。創建VB組件的時候,程序員必須按照特定的約定,用相當復雜的代碼把屬性和事件發掘出來。Delphi是第二代的可視化編程工具,而且整個語言是圍繞著可視化編程設計的,所以用它創建可視化組件要簡單得多。但是Java憑借其JavaBean在可視化組件的創建技術領域領先群雄。Bean只是一個類,所以你不用為創建一個Bean而去編寫任何額外的代碼,也不用去使用特殊的語言擴展。事實上你所要做的只是稍稍改變一下方法命名的習慣。是方法的名字告訴應用程序構建工具,這是一個屬性,事件還是一個普通的方法。

    JDK文檔把命名規范(naming convention)錯誤地表述成"設計模式(design pattern)”。這真是不幸,設計模式(請參閱www.BruceEckel.com上的Thinking in Patterns (with Java))本身已經夠讓人傷腦筋的了,居然還有人來混淆視聽。重申一遍,這算不上是什么設計模式,只是命名規范而已,而且還相當簡單。

  • 對于名為xxx的屬性,你通常都得創建兩個方法:getXxx( )setXxx( )。注意構建工具會自動地將"get""set"后面的第一個字母轉換成小寫,以獲取屬性的名字。"get"所返回的類型與”set"所使用的參數的類型相同。屬性的名字同"get"”set"方法返回的類型無關。
  • 對于boolean型的屬性,你既可以使用上述的"get""set"方法,也可以用"is"來代替"get"
  • Bean的常規方法無需遵循上述命名規范,但它們都必須是public的。
  • Swinglistener來處理事件。就是我們講到現在一直在用的這個方案:用addBounceListener(BounceListener)removeBounceListener(BounceListener)來處理BounceListener。絕大多數情況下,內置的事件和監聽器已經可以滿足你的需要了,但是你也可以創建你自己的事件和監聽器接口。
  • 第一點回答了你在比較新舊代碼時或許會注意的一個問題:很多方法的名字都有了一些很小的,但明顯沒什么意義的變化。現在你應該知道了,為了把組件做成JavaBean,絕大多數修改是在同"get""set"的命名規范接軌。

    Introspector提取BeanInfo

    當你把Bean從控件框(palette)里拖到表單上的時候,JavaBean架構中最重要的一環就開始工作了。應用程序構建工具必須能創建這個Bean(有默認構造函數的話就可以了),然后在不看Bean源代碼的情況下提取所有必須的信息,然后創建屬性表和事件句柄。

    從第十章看,我們已經能部分地解決這個問題了:Javareflection機制可以幫我們找出類的所有方法。我們不希望像別的可視化編程語言那樣用特殊的關鍵字來解決JavaBean的問題,因此這是個完美的解決方案。實際上給Java加上reflection的主要原因,就是為了支持JavaBean(雖然也是為了支持"對象的序列化(object serializaiton)""遠程方法調用(remote method invocation)"。所以也許你會想設計應用程序構建工具的人會逐個地reflect Bean,找出所有的方法,再在里面挑出Bean的屬性和事件。

    這么做當然也可以,但是Java為我們提供了一個標準的工具。這不僅使Bean的使用變得更方便了,而且也為我們創建更復雜的Bean指出了一條標準通道。這個工具就是Introspector,其中最重要的方法就是static getBeanInfo( )。當你給這個方法傳一個Class對象時,它會徹底盤查這個類,然后返回一個BeanInfo對象,這樣你就可以通過這個對象找出Bean的屬性,方法和事件了。

    通常你根本不用為此操心;絕大多數Bean都是從供應商那里直接買過來的,更何況你也不必知道它在底層都玩了什么花樣。你只要直接把Bean放到表單上,然后配置一下屬性,再寫個程序處理一下事件就可以了。

    一個更復雜的Bean

    所有的字段都是private的這是Bean的通常做法——也就是說做成"屬性"之后,通常只能用方法來訪問了。

    JavaBeans和同步

    只要你創建了Bean,你就得保證它能在多線程環境下正常工作,這就是說:

  • 只要允許,所有Beanpublic方法都必須是synchronized。當然這會影響性能(不過在最新版本的JDK里,這種影響已經明顯下降了)。如果性能下降確實是個問題,那么你可以把那些不致于引起問題的方法的synchronized給去掉,但是要記住,會不會引發問題不是一眼就能看出來的。這種方法首先是要小(就像上面那段程序里的getCircleSize( )),而且/或是"原子操作",就是說這個方法所調用的代碼如此之少,以至于執行期間對象不會被修改了。所以把這種方法做成非synchronized的,也不會對性能產生什么重大影響。所以你應該把Bean的所有public方法都做成synchronized,只有在有絕對必要,而且確實對性能提高有效的時候,才能把synchronized移掉。
  • 當你將多播事件發送給一隊對此感興趣的listener時,必須做好準備,listener會隨時加入或從隊列中刪除。
  • 第一個問題很好解決,但第二個問題就要好好想想了。

    paintComponent( )也沒有synchronized。決定覆寫方法的時候是不是該加synchronized不像決定自己寫的方法那樣清楚。。這里,好像paintComponent( )加不加synchronized一樣都能工作。但必須考慮的問題有:

  • 這個方法是否會修改對象的"關鍵"變量?變量是否關鍵"的判斷標準是,它們是否會被其它線程所讀寫。(這里,讀寫實際上都是由synchronized方法來完成的,所以你只要看這一點就可以了)在這段程序里,paintComponent( )沒有修改任何東西。
  • 這個方法是否與這種"關鍵"變量的狀態有關?如果有一個synchronized方法修改了這個方法要用到的變量,那么最好是把這個方法也作成synchronized的。基于這點,你或許會發現cSize是由synchronized方法修改的,因此paintComponent( )也應該是synchronized。但是這里你應該問問"如果在執行paintComponent( )的時候,cSize被修改了,最糟糕的情況是什么呢?"如果問題并不嚴重,而且轉瞬即逝的,那么為了防止synchronized所造成的性能下降,你完全可以把paintComponent( )做成非synchronized的。
  • 第三個思路是看基類的paintComponent( )是不是synchronized,答案是""。這不是一個萬無一失的判斷標準,只是一個思路。就拿上面那段程序說吧,paintComponent( )里面混了一個通過synchronized方法修改的cSize字段,所以情況也改變了。但是請注意,synchronized不會繼承;也就是說派生類覆寫的基類synchronized方法不會自動成為synchronized方法。
  • paint( )paintComponent( )是那種執行得越快越好的方法。任何能夠提升性能的做法都是值得大力推薦的,所以如果你發覺不得不對這些方法用synchronized,那么很有可能是一個設計失敗的信號。
  • main( )的測試代碼是根據BangBeanTest修改而得的。為了演示BangBean2的多播功能,它多加了幾個監聽器。

    封裝Bean

    要想在可視化編程工具里面用JavaBean,必須先把它放入標準的Bean容器里。也就是把所有Beanclass文件以及一份申明"這是一個Bean""manifest"文件打成一個JAR的包。manifest文件是一種有一定格式要求的文本文件。對于BangBean,它的manifest文件是這樣的:

    Manifest-Version: 1.0

    Name: bangbean/BangBean.class

    Java-Bean: True

    第一行表明manifest的版本,除非Sun今后發通知,否則就是1.0。第二行(空行忽略不計)特別提到了BangBean.class文件,而第三行的意思是"這是y一個Bean"。沒有第三行,應用程序構建工具不會把它看成Bean

    唯一能玩點花樣的地方是,你必須在"Name:"里指明正確的路徑。如果你翻到前面去看BangBean.java,就會發覺它屬于bangbean package(因此必須放到classpath的某個目錄的"bangbean"的子目錄里),而manifestname也必須包含這個package的信息。此外還必須將manifest文件放到package路徑的根目錄的上一層目錄里,這里就是將manifest放到"bangbean"子目錄的上一層目錄里。然后在存放manifest文件的目錄里打入下面這條jar命令:

    jar cfm BangBean.jar BangBean.mf bangbean

    這里假定JAR文件的名字是BangBean.jar,而manifest文件的名字是BangBean.mf

    或許你會覺得有些奇怪,"我編譯BangBean.java的時候還生成了一些別的class文件,它們都放到哪里去了?"是的,它們最后都放在bangbean子目錄里,而上面那條jar命令的最后一個參數就是bangbean。當你給jar一個子目錄做參數時,它會將整個子目錄都打進JAR文件里(這里還包括BangBean.java的源代碼——你自己寫Bean的時候大概不會想把源代碼打進包吧)。此外如果你把剛做好的JAR文件解開,就會發現你剛寫的那個manifest已經不在里面了,取而代之的是jar自己生成的(大致根據你寫的),名為MANIFEST.MFmanifest文件,而且它把它放在META-INF子目錄里 (意思是“meta-information”)。如果你打開這個manifest文件,就會發現jar給每個文件加了條簽名的信息,就像這樣:

    Digest-Algorithms: SHA MD5

    SHA-Digest: pDpEAG9NaeCx8aFtqPI4udSX/O0=

    MD5-Digest: O4NcS1hE3Smnzlp2hj6qeg==

    總之,你不必為這些事擔心。你作修改的時候可以只改你自己寫的manifest文件,然后重新運行一遍jar,讓它來創建新的JAR文件。你也可以往JAR文件里加新的Bean,只是要把它們的信息加到manifest里面就行了。

    值得注意的是,你應該為每個Bean創建一個子目錄。這是因為當你創建JAR文件的時候,你會把子目錄的名字交給jar,而jar又會把子目錄里的所有東西都放進JAR。所以FrogBangBean都有它們自己的子目錄。

    等你把Bean封裝成JAR文件之后,你就能把它們用到支持BeanIDE里了。這個步驟會隨開發工具的不同有一些差別,不過Sun在他們的"Bean Builder"里提供了一個免費的JavaBean的測試床(可以到java.sun.com/beans去下載)。要把Bean加入Bean Builer,只要把JAR文件拷貝到正確的目錄里就行了。

    Bean的高級功能

    你已經知道做一個Bean有多簡單了,但是它的功能并不僅限于此。JavaBean的架構能讓你很快上手,但是經過擴展,它也可以適應更復雜的情況。這些用途已經超出了本書的范圍,但是我會做一個簡單的介紹。你可以在java.sun.com/beans上找到更多的細節。

    屬性是一個能加強的地方。在我們舉的例子里,屬性都是單個的,但是你也可以用一個數組來表示多個屬性。這被稱為索引化的屬性(indexed property)。你只要給出正確的方法(還是要遵循方法的命名規范)Introspector就能找到索引化的屬性,這樣應用程序構建工具就能作出正確的反映了。

    屬性可以被綁定,也就是說它們能通過PropertyChangeEvent通知其它對象。而其它對象能根據Bean的變化,修改自己的狀態。

    屬性是可以被限制的,也就是說如果其他對象認為屬性的這個變化是不可接受的,那么它們可以否決這個變化。BeanPropertyChangeEvent通知其他對象,而其他對象則用PropertyVetoException來表示反對,并且命令它將屬性的值恢復到原來的狀態。

    你也可以修改Bean在設計時的表示方式:

  • 你可以為Bean提供自定義的屬性清單。當用戶選擇其它Bean的時候,構建工具會提供普通屬性清單,但是當他們選用你的Bean時,它會提供你定義的清單。
  • 你可以為屬性創建一個自定義的編輯器,這樣雖然構建工具用的是普通的屬性清單,但當用戶要編輯這個特殊屬性時,編輯器就會自動啟動了。
  • 你可以為Bean提供一個自定義的BeanInfo類,它返回的信息,可以同Introspector默認提供的BeanInfo不同。
  • 還可以把所有FeatureDescriptor"專家(expert)"模式打開,看看基本功能和高級功能有什么區別。
  • 總結

    這一章只是想跟你介紹一下Swing的強大功能然后領你入門,這樣當你知道相對而言Swing有多簡單之后,你就能自己去探路了。你看到的這些已經能大致滿足UI設計之需了。但是Swing不止于此;它的目標是要成為一種功能齊全的UI設計工具。只要你能想到,它都有辦法能作到。

    如果你在這里找不到你想要的,那么研究一下SunJDK文檔吧,或者去搜Web,如果還不行,就去找一本Swing的專著。

    總結

    以上是生活随笔為你收集整理的TIJ阅读笔记(第十四章)[转]的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    乱中年女人伦av三区 | 国产精品18久久久久久麻辣 | 久久久成人毛片无码 | 精品国产乱码久久久久乱码 | 欧美激情一区二区三区成人 | 色偷偷人人澡人人爽人人模 | 无码人中文字幕 | 久久人人爽人人爽人人片ⅴ | 装睡被陌生人摸出水好爽 | 女人色极品影院 | 久久精品人人做人人综合 | 国产激情精品一区二区三区 | 一本久道久久综合狠狠爱 | 亚洲精品国产第一综合99久久 | 国产人妻精品一区二区三区不卡 | 日日橹狠狠爱欧美视频 | 亚洲日本va午夜在线电影 | 波多野42部无码喷潮在线 | 夜夜夜高潮夜夜爽夜夜爰爰 | 精品久久综合1区2区3区激情 | 伊人久久大香线蕉av一区二区 | 日韩在线不卡免费视频一区 | 成熟妇人a片免费看网站 | 丰满人妻被黑人猛烈进入 | 中文字幕无码免费久久99 | 久久久精品欧美一区二区免费 | 美女极度色诱视频国产 | 精品偷拍一区二区三区在线看 | 亚洲精品国产精品乱码视色 | 国产亚洲精品久久久久久国模美 | 国内揄拍国内精品少妇国语 | 综合人妻久久一区二区精品 | 日日橹狠狠爱欧美视频 | 亚洲精品中文字幕乱码 | 无码av岛国片在线播放 | 亚洲精品中文字幕 | 大肉大捧一进一出视频出来呀 | 久久久久99精品国产片 | 亚洲gv猛男gv无码男同 | 欧美老人巨大xxxx做受 | 国产精品亚洲а∨无码播放麻豆 | 波多野结衣乳巨码无在线观看 | 色欲人妻aaaaaaa无码 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产真人无遮挡作爱免费视频 | 黑人巨大精品欧美一区二区 | 色 综合 欧美 亚洲 国产 | √天堂资源地址中文在线 | 久久人人爽人人爽人人片av高清 | 免费人成在线视频无码 | 特黄特色大片免费播放器图片 | 成人免费视频在线观看 | 在线观看欧美一区二区三区 | 天天拍夜夜添久久精品 | 四虎永久在线精品免费网址 | 狠狠噜狠狠狠狠丁香五月 | 色偷偷人人澡人人爽人人模 | 人妻少妇精品无码专区二区 | 精品国产aⅴ无码一区二区 | 99精品久久毛片a片 | 久久久久久av无码免费看大片 | 永久免费精品精品永久-夜色 | 久久人人爽人人人人片 | 亚洲成a人片在线观看无码3d | 中文精品久久久久人妻不卡 | 亚洲综合久久一区二区 | 鲁鲁鲁爽爽爽在线视频观看 | 精品无码成人片一区二区98 | 亚洲精品久久久久久久久久久 | av小次郎收藏 | 国产超碰人人爽人人做人人添 | 无码人妻丰满熟妇区毛片18 | 中国大陆精品视频xxxx | 国产成人人人97超碰超爽8 | 一区二区三区高清视频一 | 丰满肥臀大屁股熟妇激情视频 | 男人扒开女人内裤强吻桶进去 | 亚洲色www成人永久网址 | 国产精品无码成人午夜电影 | 日日碰狠狠躁久久躁蜜桃 | 狠狠躁日日躁夜夜躁2020 | 久久亚洲中文字幕精品一区 | 中文亚洲成a人片在线观看 | 俺去俺来也在线www色官网 | 国产麻豆精品一区二区三区v视界 | 乱人伦人妻中文字幕无码 | 日本肉体xxxx裸交 | √8天堂资源地址中文在线 | 日本护士毛茸茸高潮 | 亚洲精品一区二区三区婷婷月 | 伊人久久大香线焦av综合影院 | 伊人久久大香线蕉亚洲 | 亚洲第一网站男人都懂 | 色婷婷综合激情综在线播放 | 东京一本一道一二三区 | 亚洲国产精品成人久久蜜臀 | 激情内射日本一区二区三区 | 天堂亚洲2017在线观看 | 99久久人妻精品免费一区 | 中文字幕乱码人妻无码久久 | 久久综合给久久狠狠97色 | 无码一区二区三区在线 | 国产九九九九九九九a片 | 亚洲熟妇色xxxxx欧美老妇y | 女人和拘做爰正片视频 | 98国产精品综合一区二区三区 | 永久免费观看美女裸体的网站 | 色综合天天综合狠狠爱 | 亚洲中文字幕无码中文字在线 | 久久zyz资源站无码中文动漫 | 伊人久久大香线蕉午夜 | 亚洲日韩一区二区三区 | 国产极品美女高潮无套在线观看 | 国产在线精品一区二区高清不卡 | 少妇激情av一区二区 | 强伦人妻一区二区三区视频18 | 欧美xxxx黑人又粗又长 | 欧美人与动性行为视频 | 免费看少妇作爱视频 | 久久zyz资源站无码中文动漫 | 麻豆果冻传媒2021精品传媒一区下载 | 正在播放老肥熟妇露脸 | 国产精品丝袜黑色高跟鞋 | 国产成人精品久久亚洲高清不卡 | 55夜色66夜色国产精品视频 | 成人精品天堂一区二区三区 | 西西人体www44rt大胆高清 | 久久久久久av无码免费看大片 | 国产内射老熟女aaaa | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品久久久久中文第一幕 | 国产亚洲精品久久久闺蜜 | 亚洲区欧美区综合区自拍区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 青青草原综合久久大伊人精品 | 色窝窝无码一区二区三区色欲 | 亚洲精品欧美二区三区中文字幕 | 亚洲人成网站免费播放 | 中国女人内谢69xxxxxa片 | 日韩亚洲欧美中文高清在线 | 精品国产国产综合精品 | 色噜噜亚洲男人的天堂 | 欧美日韩综合一区二区三区 | 波多野结衣乳巨码无在线观看 | 荡女精品导航 | 国产小呦泬泬99精品 | 亚洲 另类 在线 欧美 制服 | 国产片av国语在线观看 | 中文字幕无码视频专区 | 麻豆蜜桃av蜜臀av色欲av | 女高中生第一次破苞av | 中文字幕无码乱人伦 | 在教室伦流澡到高潮hnp视频 | 国产两女互慰高潮视频在线观看 | 欧美三级a做爰在线观看 | 日韩精品无码一区二区中文字幕 | 成人av无码一区二区三区 | 人人爽人人澡人人人妻 | 亚洲精品鲁一鲁一区二区三区 | 国产人妖乱国产精品人妖 | 久久久中文字幕日本无吗 | 亚洲综合无码久久精品综合 | 极品尤物被啪到呻吟喷水 | 精品夜夜澡人妻无码av蜜桃 | 中文无码成人免费视频在线观看 | 亚洲欧美日韩综合久久久 | 久久国产精品二国产精品 | 99国产欧美久久久精品 | 亚洲一区二区观看播放 | 激情综合激情五月俺也去 | 中国女人内谢69xxxxxa片 | 老司机亚洲精品影院无码 | 中文字幕精品av一区二区五区 | 蜜桃av抽搐高潮一区二区 | 天海翼激烈高潮到腰振不止 | 自拍偷自拍亚洲精品被多人伦好爽 | 欧洲精品码一区二区三区免费看 | 人人妻人人藻人人爽欧美一区 | 欧美日韩视频无码一区二区三 | 东京无码熟妇人妻av在线网址 | 波多野结衣av一区二区全免费观看 | 欧洲欧美人成视频在线 | 精品无码国产自产拍在线观看蜜 | 亚洲 激情 小说 另类 欧美 | 亚洲国产精品一区二区美利坚 | 色婷婷欧美在线播放内射 | 奇米影视888欧美在线观看 | 无遮挡啪啪摇乳动态图 | 亚洲国产精华液网站w | 亚洲自偷自拍另类第1页 | 色综合天天综合狠狠爱 | 免费人成在线观看网站 | 亚洲 日韩 欧美 成人 在线观看 | 未满小14洗澡无码视频网站 | 伊人色综合久久天天小片 | 国产真实伦对白全集 | 天堂а√在线中文在线 | 亚洲成av人片天堂网无码】 | 日韩 欧美 动漫 国产 制服 | 日产国产精品亚洲系列 | 久久精品99久久香蕉国产色戒 | 东京热一精品无码av | 国产片av国语在线观看 | 男女爱爱好爽视频免费看 | 小泽玛莉亚一区二区视频在线 | 成人无码视频在线观看网站 | 亚洲精品久久久久中文第一幕 | 亚洲国产成人a精品不卡在线 | 亚洲国产成人av在线观看 | 亚洲一区av无码专区在线观看 | 日韩欧美中文字幕在线三区 | 18禁止看的免费污网站 | 国产性生大片免费观看性 | 一区二区三区乱码在线 | 欧洲 | v一区无码内射国产 | 国产麻豆精品精东影业av网站 | 曰韩少妇内射免费播放 | 亚洲午夜无码久久 | 日韩亚洲欧美精品综合 | 国产卡一卡二卡三 | 国产高清av在线播放 | 一本色道久久综合亚洲精品不卡 | 国产成人综合在线女婷五月99播放 | 久久久无码中文字幕久... | 亚洲小说春色综合另类 | 帮老师解开蕾丝奶罩吸乳网站 | 99er热精品视频 | 午夜成人1000部免费视频 | 久久zyz资源站无码中文动漫 | 一本大道伊人av久久综合 | 色 综合 欧美 亚洲 国产 | 久久亚洲国产成人精品性色 | 性生交大片免费看女人按摩摩 | 露脸叫床粗话东北少妇 | 国产精品嫩草久久久久 | 免费乱码人妻系列无码专区 | 性欧美熟妇videofreesex | 国产无av码在线观看 | 国产av人人夜夜澡人人爽麻豆 | 国产熟妇另类久久久久 | 国产又爽又猛又粗的视频a片 | 无人区乱码一区二区三区 | 嫩b人妻精品一区二区三区 | 日韩av无码中文无码电影 | √天堂资源地址中文在线 | 精品乱子伦一区二区三区 | 国产sm调教视频在线观看 | 国产一区二区三区四区五区加勒比 | 久久综合狠狠综合久久综合88 | 少妇无码一区二区二三区 | 国产精品va在线播放 | 无码人妻久久一区二区三区不卡 | 久久国产自偷自偷免费一区调 | 国产一区二区三区日韩精品 | 亚洲第一网站男人都懂 | 亚洲欧洲日本无在线码 | 国产精品-区区久久久狼 | 无码人妻少妇伦在线电影 | 人妻体内射精一区二区三四 | 国产特级毛片aaaaaaa高清 | 亚洲综合久久一区二区 | 国产另类ts人妖一区二区 | 欧美精品一区二区精品久久 | 樱花草在线社区www | 午夜熟女插插xx免费视频 | 国产精品久久久久久无码 | 久久精品国产99精品亚洲 | 精品无码一区二区三区爱欲 | 色噜噜亚洲男人的天堂 | 欧美 丝袜 自拍 制服 另类 | 在线а√天堂中文官网 | 中文字幕乱码亚洲无线三区 | 亚洲精品一区二区三区四区五区 | 久久亚洲中文字幕无码 | 欧美大屁股xxxxhd黑色 | 狠狠色噜噜狠狠狠7777奇米 | 青青青手机频在线观看 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲精品综合一区二区三区在线 | 国产精品无码一区二区桃花视频 | 国产人妻人伦精品 | 国产精品办公室沙发 | 久久精品国产一区二区三区肥胖 | 四虎永久在线精品免费网址 | 少妇高潮一区二区三区99 | 国产精品福利视频导航 | 亚洲人成网站在线播放942 | 97精品人妻一区二区三区香蕉 | 在线a亚洲视频播放在线观看 | 欧美人与禽猛交狂配 | 国产凸凹视频一区二区 | 日日摸夜夜摸狠狠摸婷婷 | 久久综合久久自在自线精品自 | 午夜理论片yy44880影院 | 午夜理论片yy44880影院 | 国产精品久久久久7777 | 免费人成在线视频无码 | 国产麻豆精品精东影业av网站 | 亚洲日韩精品欧美一区二区 | 日日碰狠狠躁久久躁蜜桃 | 久久久久亚洲精品男人的天堂 | 国产乱码精品一品二品 | 高清不卡一区二区三区 | 天天做天天爱天天爽综合网 | 99re在线播放 | 中文字幕人成乱码熟女app | 日本xxxx色视频在线观看免费 | 强伦人妻一区二区三区视频18 | 日韩精品无码一本二本三本色 | 色综合久久网 | 人妻少妇精品视频专区 | 男人扒开女人内裤强吻桶进去 | 久久99精品国产麻豆 | 乱中年女人伦av三区 | 国产97在线 | 亚洲 | 中文字幕无码免费久久9一区9 | 精品国产一区二区三区av 性色 | 丁香花在线影院观看在线播放 | 亚洲一区二区三区含羞草 | 国产亚洲精品精品国产亚洲综合 | 国产电影无码午夜在线播放 | 熟妇人妻激情偷爽文 | 国产成人无码a区在线观看视频app | 天堂亚洲免费视频 | 无码人妻丰满熟妇区五十路百度 | 亚洲国产一区二区三区在线观看 | av在线亚洲欧洲日产一区二区 | 国产成人无码一二三区视频 | 麻豆蜜桃av蜜臀av色欲av | 少妇高潮喷潮久久久影院 | 波多野结衣乳巨码无在线观看 | 亚洲乱码中文字幕在线 | 三上悠亚人妻中文字幕在线 | 亚洲成av人影院在线观看 | 强辱丰满人妻hd中文字幕 | 无码精品人妻一区二区三区av | 国产午夜无码精品免费看 | 国产欧美亚洲精品a | 亚洲a无码综合a国产av中文 | 大肉大捧一进一出视频出来呀 | 亚洲国产成人a精品不卡在线 | 欧美激情综合亚洲一二区 | 亚洲一区二区观看播放 | 日韩精品成人一区二区三区 | 国产网红无码精品视频 | 男人和女人高潮免费网站 | 久久精品人妻少妇一区二区三区 | 无码精品人妻一区二区三区av | 大色综合色综合网站 | 亚洲色大成网站www国产 | 精品久久久久久亚洲精品 | 国内老熟妇对白xxxxhd | 国产午夜手机精彩视频 | 中文无码成人免费视频在线观看 | 亚洲自偷精品视频自拍 | 亚洲色欲色欲天天天www | а√资源新版在线天堂 | 香蕉久久久久久av成人 | 国产精品免费大片 | 久久精品人人做人人综合试看 | 亚洲精品一区二区三区四区五区 | 国产一精品一av一免费 | 未满小14洗澡无码视频网站 | 日韩av无码一区二区三区不卡 | 久久久精品欧美一区二区免费 | yw尤物av无码国产在线观看 | 天干天干啦夜天干天2017 | 午夜无码区在线观看 | 国产艳妇av在线观看果冻传媒 | 无码乱肉视频免费大全合集 | 强辱丰满人妻hd中文字幕 | 撕开奶罩揉吮奶头视频 | 亚洲啪av永久无码精品放毛片 | 国产又粗又硬又大爽黄老大爷视 | 国产av一区二区精品久久凹凸 | 乱中年女人伦av三区 | 亚洲毛片av日韩av无码 | 一区二区传媒有限公司 | 无码免费一区二区三区 | 鲁鲁鲁爽爽爽在线视频观看 | 日本又色又爽又黄的a片18禁 | 熟妇人妻中文av无码 | 中文无码精品a∨在线观看不卡 | 国产无遮挡又黄又爽又色 | 偷窥日本少妇撒尿chinese | 欧美性猛交xxxx富婆 | 中文字幕av无码一区二区三区电影 | 55夜色66夜色国产精品视频 | 亚洲综合无码一区二区三区 | 国产性生大片免费观看性 | 欧美老人巨大xxxx做受 | 窝窝午夜理论片影院 | 99久久99久久免费精品蜜桃 | 少妇高潮喷潮久久久影院 | 国产精品自产拍在线观看 | 波多野结衣av一区二区全免费观看 | 日本一区二区更新不卡 | 色欲人妻aaaaaaa无码 | 久激情内射婷内射蜜桃人妖 | 国产真人无遮挡作爱免费视频 | 久久综合九色综合97网 | 5858s亚洲色大成网站www | 蜜臀av无码人妻精品 | 亚洲欧美国产精品久久 | 男人扒开女人内裤强吻桶进去 | 国产精品久久久一区二区三区 | 双乳奶水饱满少妇呻吟 | 精品久久久久香蕉网 | 国产精品第一区揄拍无码 | 亚洲а∨天堂久久精品2021 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲一区av无码专区在线观看 | 国产明星裸体无码xxxx视频 | 久久97精品久久久久久久不卡 | 日本精品少妇一区二区三区 | 日本免费一区二区三区最新 | 国产99久久精品一区二区 | 性做久久久久久久久 | 色一情一乱一伦一区二区三欧美 | 亚洲 a v无 码免 费 成 人 a v | 久久人人97超碰a片精品 | 国产精品理论片在线观看 | 国色天香社区在线视频 | 欧美性黑人极品hd | 伊人久久大香线蕉av一区二区 | 国产在线精品一区二区高清不卡 | 久久久无码中文字幕久... | 熟妇女人妻丰满少妇中文字幕 | 亚洲国产精品一区二区美利坚 | 性欧美熟妇videofreesex | 国产av人人夜夜澡人人爽麻豆 | 欧美日韩亚洲国产精品 | 国产绳艺sm调教室论坛 | 无遮无挡爽爽免费视频 | 狠狠色色综合网站 | 亚洲中文字幕无码一久久区 | 麻豆果冻传媒2021精品传媒一区下载 | 粗大的内捧猛烈进出视频 | 色五月五月丁香亚洲综合网 | 日本一区二区三区免费高清 | 国产精品二区一区二区aⅴ污介绍 | 欧美激情综合亚洲一二区 | 玩弄中年熟妇正在播放 | 无码人妻少妇伦在线电影 | 国产婷婷色一区二区三区在线 | 大胆欧美熟妇xx | 成年美女黄网站色大免费视频 | 日本肉体xxxx裸交 | 中文久久乱码一区二区 | 欧美 日韩 人妻 高清 中文 | 亚洲国产综合无码一区 | 一本久道久久综合婷婷五月 | 国产国产精品人在线视 | 国产亚洲精品久久久ai换 | 理论片87福利理论电影 | 色综合久久久无码中文字幕 | 国精产品一品二品国精品69xx | 国产成人精品一区二区在线小狼 | 国内精品九九久久久精品 | 国产无套粉嫩白浆在线 | 亚洲精品一区三区三区在线观看 | 国精品人妻无码一区二区三区蜜柚 | 国产手机在线αⅴ片无码观看 | 精品国产青草久久久久福利 | 激情内射日本一区二区三区 | 亚拍精品一区二区三区探花 | 成人试看120秒体验区 | 精品无码av一区二区三区 | a片免费视频在线观看 | 国产精品免费大片 | 天堂а√在线中文在线 | 激情爆乳一区二区三区 | 中文精品无码中文字幕无码专区 | 奇米影视7777久久精品人人爽 | 日本爽爽爽爽爽爽在线观看免 | 欧美日本精品一区二区三区 | 成人免费视频视频在线观看 免费 | 色噜噜亚洲男人的天堂 | 又紧又大又爽精品一区二区 | 成人欧美一区二区三区黑人 | 性欧美疯狂xxxxbbbb | 午夜精品一区二区三区的区别 | 国产女主播喷水视频在线观看 | 在线播放无码字幕亚洲 | 午夜成人1000部免费视频 | 牛和人交xxxx欧美 | 亚洲精品中文字幕 | 免费无码的av片在线观看 | 精品国产一区二区三区四区在线看 | 久久久www成人免费毛片 | 日本乱人伦片中文三区 | 中文字幕人妻无码一区二区三区 | 97无码免费人妻超级碰碰夜夜 | √8天堂资源地址中文在线 | 国产超碰人人爽人人做人人添 | 久久99精品国产.久久久久 | 性欧美牲交xxxxx视频 | 男女性色大片免费网站 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲综合无码一区二区三区 | 国产午夜手机精彩视频 | 久久国产精品萌白酱免费 | 国精品人妻无码一区二区三区蜜柚 | 兔费看少妇性l交大片免费 | 久久久中文久久久无码 | av无码电影一区二区三区 | 欧美国产日韩亚洲中文 | 噜噜噜亚洲色成人网站 | 无码人妻丰满熟妇区五十路百度 | 亚洲色在线无码国产精品不卡 | 国产无套内射久久久国产 | 小sao货水好多真紧h无码视频 | 理论片87福利理论电影 | 欧美老人巨大xxxx做受 | 国产真实伦对白全集 | 成人片黄网站色大片免费观看 | 亚洲国产一区二区三区在线观看 | 亚洲一区av无码专区在线观看 | 国产成人人人97超碰超爽8 | 国产精品高潮呻吟av久久4虎 | 亚洲精品午夜国产va久久成人 | 国产真实乱对白精彩久久 | 色婷婷综合激情综在线播放 | 国产精品久久久久7777 | 精品一二三区久久aaa片 | 久久久久亚洲精品男人的天堂 | 亚洲色大成网站www | 无码人妻av免费一区二区三区 | 日本一卡二卡不卡视频查询 | 日本熟妇人妻xxxxx人hd | 国产在热线精品视频 | 国产成人无码专区 | 国产精品国产三级国产专播 | 久久国产精品二国产精品 | 久久精品视频在线看15 | 亚洲中文字幕久久无码 | 又色又爽又黄的美女裸体网站 | 精品国偷自产在线 | 好爽又高潮了毛片免费下载 | 日本va欧美va欧美va精品 | 狠狠cao日日穞夜夜穞av | 麻豆成人精品国产免费 | 国产99久久精品一区二区 | 精品一区二区三区无码免费视频 | 久久人人爽人人人人片 | 国产精品-区区久久久狼 | 网友自拍区视频精品 | 亚洲天堂2017无码中文 | 国产人妻精品一区二区三区 | 久久午夜夜伦鲁鲁片无码免费 | 国产综合色产在线精品 | 一区二区传媒有限公司 | 午夜无码区在线观看 | 丝袜 中出 制服 人妻 美腿 | 亚洲 另类 在线 欧美 制服 | 丰满少妇女裸体bbw | 成人无码影片精品久久久 | 99久久99久久免费精品蜜桃 | 亚洲欧美精品伊人久久 | 又黄又爽又色的视频 | 国产99久久精品一区二区 | 欧美 丝袜 自拍 制服 另类 | 欧美亚洲国产一区二区三区 | 国产人妻人伦精品1国产丝袜 | 又色又爽又黄的美女裸体网站 | 日韩av无码一区二区三区 | 亚洲精品国产第一综合99久久 | aⅴ亚洲 日韩 色 图网站 播放 | 一本久久伊人热热精品中文字幕 | 精品国产国产综合精品 | 国产精品第一国产精品 | 精品国产麻豆免费人成网站 | 伊人久久大香线焦av综合影院 | 亚洲成a人片在线观看无码3d | 国产真实夫妇视频 | 九九综合va免费看 | 激情亚洲一区国产精品 | 强开小婷嫩苞又嫩又紧视频 | 国产免费无码一区二区视频 | 欧美人与物videos另类 | 精品水蜜桃久久久久久久 | 日韩av激情在线观看 | 久久99国产综合精品 | 亚洲国产综合无码一区 | 欧美精品在线观看 | 老太婆性杂交欧美肥老太 | 无码帝国www无码专区色综合 | 人人妻人人澡人人爽人人精品浪潮 | 思思久久99热只有频精品66 | 色噜噜亚洲男人的天堂 | 蜜桃视频插满18在线观看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产乱人伦偷精品视频 | 久久人人爽人人爽人人片av高清 | 精品一区二区不卡无码av | 无码人妻黑人中文字幕 | 免费无码肉片在线观看 | 无码人妻久久一区二区三区不卡 | 国产精品久久精品三级 | 国产人妖乱国产精品人妖 | 国产片av国语在线观看 | 无码国模国产在线观看 | 久久国语露脸国产精品电影 | 欧美激情一区二区三区成人 | 国产综合在线观看 | 女人被爽到呻吟gif动态图视看 | 色五月丁香五月综合五月 | 人人爽人人澡人人高潮 | 帮老师解开蕾丝奶罩吸乳网站 | 久久精品无码一区二区三区 | 成人免费视频在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 国产高清av在线播放 | 欧美日韩一区二区综合 | 四虎影视成人永久免费观看视频 | 国产后入清纯学生妹 | 国产猛烈高潮尖叫视频免费 | 日韩精品久久久肉伦网站 | 99久久精品日本一区二区免费 | 欧美高清在线精品一区 | 免费人成在线视频无码 | 中文字幕无码视频专区 | 国产精品无码mv在线观看 | 成人试看120秒体验区 | 成人一在线视频日韩国产 | 久久99精品久久久久久动态图 | 成人精品视频一区二区三区尤物 | 无码人妻出轨黑人中文字幕 | 精品夜夜澡人妻无码av蜜桃 | 国产特级毛片aaaaaaa高清 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 色五月丁香五月综合五月 | 色噜噜亚洲男人的天堂 | 亚洲国产欧美国产综合一区 | 欧美日韩久久久精品a片 | 国产精品高潮呻吟av久久 | 国产偷自视频区视频 | 亚洲国产成人a精品不卡在线 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 精品人人妻人人澡人人爽人人 | 一个人看的www免费视频在线观看 | 99久久精品国产一区二区蜜芽 | 两性色午夜免费视频 | 国产精品18久久久久久麻辣 | 国产精品久久久一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品怡红院永久免费 | 久久这里只有精品视频9 | 国产国产精品人在线视 | 亚洲精品欧美二区三区中文字幕 | 扒开双腿疯狂进出爽爽爽视频 | 狠狠色色综合网站 | 99久久人妻精品免费二区 | 久久久精品国产sm最大网站 | 真人与拘做受免费视频一 | 免费无码一区二区三区蜜桃大 | 男女猛烈xx00免费视频试看 | 亚洲精品久久久久久久久久久 | 亚洲中文字幕乱码av波多ji | 九月婷婷人人澡人人添人人爽 | 成人亚洲精品久久久久 | 国产成人无码av片在线观看不卡 | 国产亚av手机在线观看 | 中文字幕无码免费久久9一区9 | 97精品国产97久久久久久免费 | 少妇愉情理伦片bd | 蜜臀aⅴ国产精品久久久国产老师 | 国产精品久久久一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 无遮挡啪啪摇乳动态图 | 一个人看的www免费视频在线观看 | 国产莉萝无码av在线播放 | 国产精品久久福利网站 | 国产亚洲精品久久久久久久 | 久久国产精品精品国产色婷婷 | 欧美成人家庭影院 | 亚洲狠狠婷婷综合久久 | 欧美激情内射喷水高潮 | 亚洲中文字幕成人无码 | 免费人成在线观看网站 | 欧美 日韩 亚洲 在线 | 最近的中文字幕在线看视频 | 久久综合九色综合欧美狠狠 | 色一情一乱一伦一区二区三欧美 | 亚洲一区av无码专区在线观看 | 人妻少妇精品无码专区二区 | 精品国产精品久久一区免费式 | 美女张开腿让人桶 | 亚洲区欧美区综合区自拍区 | 久久精品国产99精品亚洲 | 内射巨臀欧美在线视频 | 无码人中文字幕 | 男人的天堂2018无码 | 日本肉体xxxx裸交 | 久久精品国产99久久6动漫 | 亚洲精品午夜无码电影网 | 久久国产精品二国产精品 | 女高中生第一次破苞av | 国产精品第一区揄拍无码 | 久久久久亚洲精品男人的天堂 | 国产精品久久精品三级 | 麻豆md0077饥渴少妇 | 沈阳熟女露脸对白视频 | 天堂在线观看www | 67194成是人免费无码 | 中文精品无码中文字幕无码专区 | 久久久久免费精品国产 | 国产精品嫩草久久久久 | 国产明星裸体无码xxxx视频 | 高清不卡一区二区三区 | 国产精品自产拍在线观看 | 国产色xx群视频射精 | 午夜时刻免费入口 | 色婷婷综合激情综在线播放 | 少妇高潮一区二区三区99 | 荡女精品导航 | 亚洲国产一区二区三区在线观看 | 久久综合九色综合欧美狠狠 | 亚洲人成影院在线无码按摩店 | 欧美怡红院免费全部视频 | 小sao货水好多真紧h无码视频 | 3d动漫精品啪啪一区二区中 | 在线播放无码字幕亚洲 | 美女扒开屁股让男人桶 | 丰满妇女强制高潮18xxxx | 97夜夜澡人人爽人人喊中国片 | 亚洲伊人久久精品影院 | 一二三四在线观看免费视频 | 色欲人妻aaaaaaa无码 | 久久99精品久久久久久动态图 | 大屁股大乳丰满人妻 | 久久99国产综合精品 | 国产婷婷色一区二区三区在线 | 日韩人妻少妇一区二区三区 | 性做久久久久久久免费看 | 久久久久亚洲精品中文字幕 | 一本久久伊人热热精品中文字幕 | 日本饥渴人妻欲求不满 | 99久久久无码国产aaa精品 | 特黄特色大片免费播放器图片 | 狠狠色噜噜狠狠狠7777奇米 | 欧美精品免费观看二区 | 极品尤物被啪到呻吟喷水 | 日韩欧美群交p片內射中文 | 国产精品99爱免费视频 | 成人三级无码视频在线观看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 欧美精品一区二区精品久久 | 久久久国产一区二区三区 | 丁香花在线影院观看在线播放 | 色偷偷人人澡人人爽人人模 | 久久精品丝袜高跟鞋 | 日日麻批免费40分钟无码 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品亚洲五月天高清 | 夫妻免费无码v看片 | 国产99久久精品一区二区 | 亚洲欧洲日本无在线码 | 99久久精品无码一区二区毛片 | 日本一卡二卡不卡视频查询 | 在线亚洲高清揄拍自拍一品区 | 国产suv精品一区二区五 | 人妻少妇被猛烈进入中文字幕 | 蜜臀av无码人妻精品 | 日本在线高清不卡免费播放 | 欧美喷潮久久久xxxxx | 欧美人妻一区二区三区 | 国产精品高潮呻吟av久久 | 成 人影片 免费观看 | 欧美熟妇另类久久久久久不卡 | 亚洲乱码中文字幕在线 | 性色欲网站人妻丰满中文久久不卡 | 97资源共享在线视频 | 成年美女黄网站色大免费视频 | 中文字幕无码免费久久9一区9 | 天干天干啦夜天干天2017 | 曰本女人与公拘交酡免费视频 | 国内精品久久毛片一区二区 | 日本精品少妇一区二区三区 | aⅴ在线视频男人的天堂 | 永久免费观看国产裸体美女 | 亚洲国产欧美在线成人 | 亚洲精品成a人在线观看 | 在线观看免费人成视频 | 国产免费久久久久久无码 | 国产精品福利视频导航 | 亚洲人成影院在线无码按摩店 | 国内精品久久毛片一区二区 | 九月婷婷人人澡人人添人人爽 | 成人欧美一区二区三区黑人免费 | 国产精品美女久久久 | 精品国产麻豆免费人成网站 | 中文字幕av无码一区二区三区电影 | 国产片av国语在线观看 | 欧美人与禽zoz0性伦交 | 亚洲高清偷拍一区二区三区 | 中文字幕无码人妻少妇免费 | 我要看www免费看插插视频 | 一区二区传媒有限公司 | 国产69精品久久久久app下载 | 超碰97人人做人人爱少妇 | 狂野欧美性猛交免费视频 | 国产熟女一区二区三区四区五区 | 人妻尝试又大又粗久久 | 熟妇女人妻丰满少妇中文字幕 | 乱人伦人妻中文字幕无码久久网 | 亚洲成av人影院在线观看 | 国产精品欧美成人 | 国产亚洲精品久久久久久大师 | 亚洲国产一区二区三区在线观看 | 玩弄人妻少妇500系列视频 | 亚洲天堂2017无码中文 | 丰满妇女强制高潮18xxxx | 无码播放一区二区三区 | 久久久久人妻一区精品色欧美 | 久久精品成人欧美大片 | 日韩av无码一区二区三区不卡 | 婷婷丁香五月天综合东京热 | 国内精品久久久久久中文字幕 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲精品久久久久中文第一幕 | 一本久道久久综合婷婷五月 | 无码国模国产在线观看 | 欧美怡红院免费全部视频 | 国产精品久久精品三级 | 久久午夜夜伦鲁鲁片无码免费 | 国产免费久久久久久无码 | 人妻少妇被猛烈进入中文字幕 | 给我免费的视频在线观看 | 熟女少妇人妻中文字幕 | 自拍偷自拍亚洲精品10p | 99久久久无码国产aaa精品 | aa片在线观看视频在线播放 | 300部国产真实乱 | 天干天干啦夜天干天2017 | 国产亚洲欧美在线专区 | 成人无码视频在线观看网站 | 日韩av无码一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 亚洲熟妇色xxxxx亚洲 | 女人被爽到呻吟gif动态图视看 | 玩弄人妻少妇500系列视频 | 亚洲精品一区二区三区四区五区 | 99久久人妻精品免费二区 | 色婷婷久久一区二区三区麻豆 | 亚洲の无码国产の无码影院 | 亚洲成在人网站无码天堂 | 精品一二三区久久aaa片 | 国产人妻精品午夜福利免费 | 久久视频在线观看精品 | 无码午夜成人1000部免费视频 | 99久久人妻精品免费一区 | 婷婷综合久久中文字幕蜜桃三电影 | 久久精品国产一区二区三区肥胖 | 亚洲日韩av片在线观看 | 国产两女互慰高潮视频在线观看 | 日本丰满护士爆乳xxxx | 欧美三级不卡在线观看 | 97无码免费人妻超级碰碰夜夜 | 中文字幕无码免费久久9一区9 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产午夜无码视频在线观看 | 国产精品99爱免费视频 | 日本大香伊一区二区三区 | 天堂亚洲2017在线观看 | 天天做天天爱天天爽综合网 | 久久久无码中文字幕久... | 成人免费视频一区二区 | 国产精品久久久久9999小说 | 大色综合色综合网站 | 欧美国产日韩亚洲中文 | 久久久久99精品成人片 | 免费无码av一区二区 | 亚洲成a人片在线观看日本 | 久久国内精品自在自线 | 精品乱子伦一区二区三区 | 无码人妻av免费一区二区三区 | 欧美人与善在线com | 人妻少妇精品无码专区动漫 | 97色伦图片97综合影院 | 野外少妇愉情中文字幕 | 国语自产偷拍精品视频偷 | 丰满护士巨好爽好大乳 | 国产麻豆精品一区二区三区v视界 | 亚洲国产精品成人久久蜜臀 | 久久亚洲中文字幕无码 | 国产午夜视频在线观看 | 国产又粗又硬又大爽黄老大爷视 | 国产成人午夜福利在线播放 | 中文无码精品a∨在线观看不卡 | 久久久无码中文字幕久... | 国内少妇偷人精品视频 | 亚洲精品美女久久久久久久 | 青春草在线视频免费观看 | 无码纯肉视频在线观看 | 国产成人亚洲综合无码 | 男女作爱免费网站 | 色欲综合久久中文字幕网 | 99er热精品视频 | 未满成年国产在线观看 | 色婷婷综合中文久久一本 | 久久天天躁夜夜躁狠狠 | 女人高潮内射99精品 | 丰满岳乱妇在线观看中字无码 | 啦啦啦www在线观看免费视频 | 成人精品一区二区三区中文字幕 | 欧美人与禽zoz0性伦交 | 日本大乳高潮视频在线观看 | 无套内射视频囯产 | 欧美兽交xxxx×视频 | 丰满妇女强制高潮18xxxx | 好爽又高潮了毛片免费下载 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 兔费看少妇性l交大片免费 | 丰满肥臀大屁股熟妇激情视频 | 欧美人与善在线com | 欧美老人巨大xxxx做受 | 午夜成人1000部免费视频 | 高清不卡一区二区三区 | 天堂а√在线地址中文在线 | 日韩av无码中文无码电影 | 骚片av蜜桃精品一区 | 澳门永久av免费网站 | 成人无码视频在线观看网站 | 少妇邻居内射在线 | 欧美午夜特黄aaaaaa片 | 国产熟妇高潮叫床视频播放 | 国产精品国产自线拍免费软件 | 婷婷色婷婷开心五月四房播播 | 精品亚洲韩国一区二区三区 | 蜜臀av无码人妻精品 | 亚洲精品www久久久 | 欧美性生交活xxxxxdddd | 中文字幕av伊人av无码av | 亚洲无人区一区二区三区 | 久久无码人妻影院 | 国产美女极度色诱视频www | 国产精品视频免费播放 | 欧美一区二区三区视频在线观看 | 国产亚洲精品久久久闺蜜 | 99久久人妻精品免费一区 | 牲欲强的熟妇农村老妇女 | 少妇无套内谢久久久久 | 亚洲成在人网站无码天堂 | 国产成人无码av一区二区 | 狠狠cao日日穞夜夜穞av | 无套内谢的新婚少妇国语播放 | 青青草原综合久久大伊人精品 | 国产乱人伦偷精品视频 | 欧美亚洲国产一区二区三区 | 国产内射老熟女aaaa | 国内精品一区二区三区不卡 | 国内老熟妇对白xxxxhd | 久久97精品久久久久久久不卡 | 夜先锋av资源网站 | 内射白嫩少妇超碰 | 亚洲а∨天堂久久精品2021 | 乱人伦人妻中文字幕无码 | 免费看男女做好爽好硬视频 | 亚洲精品美女久久久久久久 | 国产精品久久久 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲色www成人永久网址 | 波多野结衣aⅴ在线 | 国产无遮挡又黄又爽又色 | 天海翼激烈高潮到腰振不止 | 欧美三级a做爰在线观看 | 国产电影无码午夜在线播放 | 国内精品久久久久久中文字幕 | 对白脏话肉麻粗话av | 日韩av无码一区二区三区 | 欧美日韩视频无码一区二区三 | 精品欧洲av无码一区二区三区 | 亚洲欧美国产精品专区久久 | 亚洲啪av永久无码精品放毛片 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产乱人伦偷精品视频 | 兔费看少妇性l交大片免费 | 亚洲一区二区三区 | 国产精品亚洲а∨无码播放麻豆 | 欧美人与动性行为视频 | 色综合久久久无码网中文 | 国产超碰人人爽人人做人人添 | 日本大乳高潮视频在线观看 | 久久午夜无码鲁丝片秋霞 | 六月丁香婷婷色狠狠久久 | 国产又爽又猛又粗的视频a片 | 国产99久久精品一区二区 | 国产激情精品一区二区三区 | 成人性做爰aaa片免费看不忠 | 亚洲一区二区三区含羞草 | 国产亚洲欧美在线专区 | 扒开双腿疯狂进出爽爽爽视频 | 国产亚洲精品久久久久久大师 | 欧美日韩久久久精品a片 | 亚洲国精产品一二二线 | 麻花豆传媒剧国产免费mv在线 | 国产免费观看黄av片 | 日本精品人妻无码免费大全 | 亚洲欧洲日本综合aⅴ在线 | 亚洲精品无码国产 | 综合网日日天干夜夜久久 | 少妇激情av一区二区 | 波多野结衣av一区二区全免费观看 | 亚洲欧美国产精品久久 | 国产乱人无码伦av在线a | 无码国产色欲xxxxx视频 | 欧美阿v高清资源不卡在线播放 | 亚洲精品午夜无码电影网 | 无码成人精品区在线观看 | 99精品无人区乱码1区2区3区 | 亚洲一区二区三区国产精华液 | 欧美三级不卡在线观看 | 强开小婷嫩苞又嫩又紧视频 | 好爽又高潮了毛片免费下载 | 色妞www精品免费视频 | av无码久久久久不卡免费网站 | 国产激情无码一区二区 | 乱中年女人伦av三区 | 在线成人www免费观看视频 | 人妻人人添人妻人人爱 | 午夜精品久久久久久久久 | 无遮无挡爽爽免费视频 | 377p欧洲日本亚洲大胆 | 久久人人爽人人爽人人片av高清 | 亚洲日本va午夜在线电影 | 久久久中文字幕日本无吗 | 国产综合久久久久鬼色 | 亚洲精品综合五月久久小说 | 久久精品国产日本波多野结衣 | 免费网站看v片在线18禁无码 | 中文亚洲成a人片在线观看 | 伊在人天堂亚洲香蕉精品区 | 成人欧美一区二区三区黑人 | 大肉大捧一进一出视频出来呀 | 久久精品国产99精品亚洲 | 久久久精品欧美一区二区免费 | 国产舌乚八伦偷品w中 | 99久久久无码国产精品免费 | 亚洲热妇无码av在线播放 | 大屁股大乳丰满人妻 | 精品国产麻豆免费人成网站 | 成人精品一区二区三区中文字幕 | 久久亚洲日韩精品一区二区三区 | 少妇被粗大的猛进出69影院 | 亚洲精品国产第一综合99久久 | 欧美放荡的少妇 | 人妻尝试又大又粗久久 | 午夜精品一区二区三区在线观看 | 99精品无人区乱码1区2区3区 | 娇妻被黑人粗大高潮白浆 | 亚洲成a人片在线观看无码 | 精品人人妻人人澡人人爽人人 | 欧美自拍另类欧美综合图片区 | 国产成人无码区免费内射一片色欲 | 丰满人妻一区二区三区免费视频 | 国产成人av免费观看 | 亚洲精品一区二区三区四区五区 | 国产一区二区三区四区五区加勒比 | 人妻少妇精品久久 | 国产xxx69麻豆国语对白 | 国产香蕉尹人视频在线 | 牲欲强的熟妇农村老妇女 | 少妇无码一区二区二三区 | 欧美 日韩 亚洲 在线 | 亚洲综合无码一区二区三区 | 在线播放无码字幕亚洲 | 日韩少妇内射免费播放 | 成人综合网亚洲伊人 | 荡女精品导航 | 久久aⅴ免费观看 | 久久久www成人免费毛片 | 图片小说视频一区二区 | 国产精华av午夜在线观看 | 国产亚洲视频中文字幕97精品 | 丝袜 中出 制服 人妻 美腿 | 成人aaa片一区国产精品 | 色妞www精品免费视频 | 精品国产一区二区三区四区在线看 | 伊人久久大香线焦av综合影院 | 国产精品第一国产精品 | 水蜜桃av无码 | 东京无码熟妇人妻av在线网址 | 性啪啪chinese东北女人 | 国产乱人无码伦av在线a | 亚洲日韩中文字幕在线播放 | 国内精品一区二区三区不卡 | 久久久中文久久久无码 | 激情国产av做激情国产爱 | 国产精品自产拍在线观看 | 中文字幕亚洲情99在线 | 日日天干夜夜狠狠爱 | 国产午夜精品一区二区三区嫩草 | 亚洲狠狠婷婷综合久久 | 亚洲小说春色综合另类 | 久久久精品456亚洲影院 | 欧美激情一区二区三区成人 | 疯狂三人交性欧美 | 国产av久久久久精东av | 人妻夜夜爽天天爽三区 | 久久无码中文字幕免费影院蜜桃 | 国产熟女一区二区三区四区五区 | 老子影院午夜精品无码 | 国产香蕉97碰碰久久人人 | 日本一区二区三区免费播放 | 久久亚洲中文字幕精品一区 | 人人妻人人澡人人爽欧美一区 | 亚洲热妇无码av在线播放 | 久久久久se色偷偷亚洲精品av | 天天躁日日躁狠狠躁免费麻豆 | 一区二区三区乱码在线 | 欧洲 | 国产免费久久久久久无码 | 精品国产aⅴ无码一区二区 | 初尝人妻少妇中文字幕 | 中国大陆精品视频xxxx | 国产午夜福利亚洲第一 | 午夜精品一区二区三区的区别 | 男女超爽视频免费播放 | 天干天干啦夜天干天2017 | 国产人妻精品一区二区三区 | 18禁黄网站男男禁片免费观看 | 欧美午夜特黄aaaaaa片 | 亚洲欧洲日本无在线码 | 色一情一乱一伦一区二区三欧美 | 2020久久超碰国产精品最新 | 丰满肥臀大屁股熟妇激情视频 | 丁香花在线影院观看在线播放 | 久久久精品国产sm最大网站 | 欧洲vodafone精品性 | 久久人妻内射无码一区三区 | 无码av免费一区二区三区试看 | 免费网站看v片在线18禁无码 | 久久久久成人片免费观看蜜芽 | 亚洲欧美中文字幕5发布 | 欧美大屁股xxxxhd黑色 | 无码av最新清无码专区吞精 | 秋霞特色aa大片 | 国产熟女一区二区三区四区五区 | 玩弄少妇高潮ⅹxxxyw | 国产亚洲tv在线观看 | 久久无码中文字幕免费影院蜜桃 | 欧美刺激性大交 | 人人妻人人澡人人爽精品欧美 | 国产精品亚洲专区无码不卡 | 成 人 网 站国产免费观看 | 一个人看的www免费视频在线观看 | 亚洲中文字幕va福利 | 国产精品爱久久久久久久 | 爽爽影院免费观看 | 国产又爽又黄又刺激的视频 | 亚洲精品一区三区三区在线观看 | 免费男性肉肉影院 | 欧美日韩一区二区三区自拍 | 久久久无码中文字幕久... | 亚洲成av人片天堂网无码】 | 好男人www社区 | 鲁大师影院在线观看 | 久久久精品456亚洲影院 | 日韩精品成人一区二区三区 | 老熟妇仑乱视频一区二区 | 成人免费视频一区二区 | 亚洲精品国产第一综合99久久 | 国产成人无码av一区二区 | 久久无码专区国产精品s | 精品一区二区不卡无码av | 好屌草这里只有精品 | 国产亚洲精品久久久久久大师 | 色老头在线一区二区三区 | 丰满少妇弄高潮了www | 中国大陆精品视频xxxx | 天天拍夜夜添久久精品 | 亚洲综合无码久久精品综合 | 88国产精品欧美一区二区三区 | 久久伊人色av天堂九九小黄鸭 | 亚洲一区二区三区无码久久 | 欧美亚洲日韩国产人成在线播放 | 国产免费久久精品国产传媒 | 欧美乱妇无乱码大黄a片 | 领导边摸边吃奶边做爽在线观看 | 性做久久久久久久久 | 少妇一晚三次一区二区三区 | 激情内射亚州一区二区三区爱妻 | 成人女人看片免费视频放人 | 色综合久久久无码网中文 | 日本www一道久久久免费榴莲 | 香港三级日本三级妇三级 | 无码一区二区三区在线观看 | 久久久久久亚洲精品a片成人 | 美女黄网站人色视频免费国产 | 国内精品九九久久久精品 | 欧美xxxx黑人又粗又长 | 亚洲一区二区三区国产精华液 | 国产亚洲精品久久久久久大师 | 一本无码人妻在中文字幕免费 | 最新国产乱人伦偷精品免费网站 | 日韩在线不卡免费视频一区 | 我要看www免费看插插视频 | 中文字幕无码日韩欧毛 | 免费人成在线视频无码 | 中文字幕 亚洲精品 第1页 | 国产午夜无码视频在线观看 | 国产激情一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 青青青手机频在线观看 | 国产电影无码午夜在线播放 | 中文精品无码中文字幕无码专区 | 色欲久久久天天天综合网精品 | 免费无码一区二区三区蜜桃大 | 欧美 日韩 亚洲 在线 | 国产精品成人av在线观看 | 国产日产欧产精品精品app | 国产人成高清在线视频99最全资源 | 在线亚洲高清揄拍自拍一品区 | 亚洲欧洲中文日韩av乱码 | 亚洲精品一区二区三区四区五区 | 青春草在线视频免费观看 | 久久 国产 尿 小便 嘘嘘 | 国产免费久久精品国产传媒 | 国产精品二区一区二区aⅴ污介绍 | 国精品人妻无码一区二区三区蜜柚 | 双乳奶水饱满少妇呻吟 | 97久久精品无码一区二区 | 亚洲自偷自偷在线制服 | 99久久久无码国产精品免费 | 中文字幕+乱码+中文字幕一区 | 亚洲自偷自偷在线制服 | 亚洲男女内射在线播放 | 伊人久久大香线蕉亚洲 | 婷婷综合久久中文字幕蜜桃三电影 | 日本高清一区免费中文视频 | 大肉大捧一进一出视频出来呀 | 午夜福利一区二区三区在线观看 | 乱人伦人妻中文字幕无码 | 欧美成人高清在线播放 | 97精品国产97久久久久久免费 | 呦交小u女精品视频 | 精品久久久中文字幕人妻 | 亚洲中文字幕va福利 | 东京热男人av天堂 | 免费中文字幕日韩欧美 | 噜噜噜亚洲色成人网站 | 未满成年国产在线观看 | 久久久久久国产精品无码下载 | 日韩人妻系列无码专区 | 国产情侣作爱视频免费观看 | 亚洲中文字幕无码中文字在线 | 亚洲国产精品一区二区第一页 | 蜜桃av抽搐高潮一区二区 | 一本久道久久综合婷婷五月 | 亚洲午夜福利在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 纯爱无遮挡h肉动漫在线播放 | 影音先锋中文字幕无码 | 成人精品视频一区二区 | 亚洲欧洲日本综合aⅴ在线 | 久久人人爽人人爽人人片ⅴ | 久久综合久久自在自线精品自 | 国产97在线 | 亚洲 | 亚洲 日韩 欧美 成人 在线观看 | 久久99精品久久久久久 | 日韩av无码一区二区三区不卡 | 国产亚洲精品久久久ai换 | 国产人妖乱国产精品人妖 | 99精品视频在线观看免费 | 精品亚洲韩国一区二区三区 | 精品国产一区二区三区四区在线看 | 麻豆精品国产精华精华液好用吗 | 亚洲综合无码久久精品综合 | 久久99精品国产.久久久久 | 丰满妇女强制高潮18xxxx | 国内精品久久久久久中文字幕 | 精品 日韩 国产 欧美 视频 | 亚洲欧美日韩国产精品一区二区 | 精品无码一区二区三区的天堂 | 亚洲成av人影院在线观看 | 亚洲爆乳大丰满无码专区 | 给我免费的视频在线观看 | а√天堂www在线天堂小说 | 成人三级无码视频在线观看 | 强伦人妻一区二区三区视频18 | 午夜不卡av免费 一本久久a久久精品vr综合 | 伊人久久大香线焦av综合影院 | 久久视频在线观看精品 | 在线播放亚洲第一字幕 | 国产一区二区不卡老阿姨 | 乱码av麻豆丝袜熟女系列 | 中文字幕乱码人妻无码久久 | 欧洲欧美人成视频在线 | 亚洲精品一区二区三区四区五区 | 亚洲成色在线综合网站 | 欧美第一黄网免费网站 | 久久精品一区二区三区四区 | 午夜男女很黄的视频 | 国产凸凹视频一区二区 | 成人片黄网站色大片免费观看 | 中文字幕av无码一区二区三区电影 | 日本高清一区免费中文视频 | 99麻豆久久久国产精品免费 | 久久久久99精品成人片 | 国产av人人夜夜澡人人爽麻豆 | 久久99精品国产.久久久久 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲va欧美va天堂v国产综合 | 扒开双腿疯狂进出爽爽爽视频 | 国产av无码专区亚洲a∨毛片 | 久久人妻内射无码一区三区 | 日韩精品a片一区二区三区妖精 | 7777奇米四色成人眼影 | 色综合久久久无码网中文 | 国产一区二区三区四区五区加勒比 | 精品一二三区久久aaa片 | 97资源共享在线视频 | 欧美成人免费全部网站 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲精品一区二区三区大桥未久 | 好男人www社区 | 亚洲中文无码av永久不收费 | 亚洲男女内射在线播放 | 久久综合九色综合97网 | 四虎影视成人永久免费观看视频 | 一个人看的www免费视频在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 国产人妻人伦精品 | 国产亚洲精品久久久久久大师 | 成人一区二区免费视频 | 爆乳一区二区三区无码 | 国产特级毛片aaaaaa高潮流水 | 国产香蕉尹人视频在线 | 中文久久乱码一区二区 | 丰满少妇熟乱xxxxx视频 | 中文精品久久久久人妻不卡 | 午夜免费福利小电影 | 一本色道久久综合亚洲精品不卡 | 欧美性生交xxxxx久久久 | 99久久精品国产一区二区蜜芽 | 国产精品久久久av久久久 | 午夜无码区在线观看 | 欧美日韩一区二区综合 | √天堂资源地址中文在线 | 成人综合网亚洲伊人 | 曰本女人与公拘交酡免费视频 | 日韩精品a片一区二区三区妖精 | 国产免费无码一区二区视频 | 久久综合狠狠综合久久综合88 | 国产免费无码一区二区视频 | 少妇高潮喷潮久久久影院 | 久久久久久久人妻无码中文字幕爆 | 亚洲中文无码av永久不收费 | 久久久成人毛片无码 | 人妻无码αv中文字幕久久琪琪布 | 国产精品无套呻吟在线 | 国产麻豆精品精东影业av网站 | 久久综合九色综合欧美狠狠 | 亚洲国产精品一区二区第一页 | 无码人妻久久一区二区三区不卡 | 国产情侣作爱视频免费观看 | 狠狠综合久久久久综合网 | 一二三四社区在线中文视频 | 无码一区二区三区在线 | 色妞www精品免费视频 | 成人免费视频在线观看 | 精品久久久无码人妻字幂 | 国产又爽又猛又粗的视频a片 | 窝窝午夜理论片影院 | 亚洲 日韩 欧美 成人 在线观看 | 色诱久久久久综合网ywww | 漂亮人妻洗澡被公强 日日躁 | 亚洲精品国产品国语在线观看 | 波多野结衣av在线观看 | 青青青爽视频在线观看 | 国产高清av在线播放 | 亚洲精品美女久久久久久久 | 中文字幕无码免费久久99 | 亚洲精品中文字幕 | 秋霞成人午夜鲁丝一区二区三区 | 少女韩国电视剧在线观看完整 | 131美女爱做视频 | 久久亚洲中文字幕无码 | 97资源共享在线视频 | 狂野欧美性猛交免费视频 | 少妇人妻av毛片在线看 | av香港经典三级级 在线 | 国产亚洲精品久久久久久久 | 久久亚洲精品中文字幕无男同 | 午夜嘿嘿嘿影院 | 娇妻被黑人粗大高潮白浆 | 国产乱人伦av在线无码 | 国产av人人夜夜澡人人爽麻豆 | 国产精品久久久久久久9999 | 国产精品久久久久久久影院 | 欧美人与物videos另类 | 亚洲狠狠婷婷综合久久 | 无码人妻精品一区二区三区不卡 | 亚洲成av人片天堂网无码】 | 男人和女人高潮免费网站 | 欧美怡红院免费全部视频 | 亚洲一区二区三区国产精华液 | 人妻天天爽夜夜爽一区二区 | 思思久久99热只有频精品66 | 狂野欧美激情性xxxx | 国产午夜精品一区二区三区嫩草 | 在线看片无码永久免费视频 | 国产精品对白交换视频 | 欧美精品一区二区精品久久 | 欧美放荡的少妇 | 欧美精品无码一区二区三区 | 国产成人精品视频ⅴa片软件竹菊 | 精品aⅴ一区二区三区 | 国产精品亚洲综合色区韩国 | 久久无码专区国产精品s | 欧美成人家庭影院 | 色婷婷欧美在线播放内射 | 久久成人a毛片免费观看网站 | 青青久在线视频免费观看 | 性欧美疯狂xxxxbbbb | 婷婷丁香五月天综合东京热 | 一本久久a久久精品vr综合 | 久久熟妇人妻午夜寂寞影院 | 7777奇米四色成人眼影 | 欧美大屁股xxxxhd黑色 | 国产精品人人妻人人爽 | 无遮挡啪啪摇乳动态图 | 国产精品无码一区二区桃花视频 | 18无码粉嫩小泬无套在线观看 | 久久亚洲中文字幕精品一区 | 亚洲 日韩 欧美 成人 在线观看 | 日本熟妇乱子伦xxxx | 粉嫩少妇内射浓精videos | 丝袜 中出 制服 人妻 美腿 | 久久精品人人做人人综合 | 欧美激情综合亚洲一二区 | 真人与拘做受免费视频 | 少妇无码一区二区二三区 | 国产深夜福利视频在线 | 久精品国产欧美亚洲色aⅴ大片 | 综合人妻久久一区二区精品 | 日韩av无码一区二区三区 | 黑人巨大精品欧美一区二区 | 欧美激情内射喷水高潮 | 熟妇人妻激情偷爽文 | 国产精品久久福利网站 | 99久久99久久免费精品蜜桃 | 一个人免费观看的www视频 | 久久精品中文闷骚内射 | 亚洲区欧美区综合区自拍区 | 青青草原综合久久大伊人精品 | 丝袜美腿亚洲一区二区 | 国产精品久久久 | 激情内射亚州一区二区三区爱妻 | 亚洲欧洲日本无在线码 | 免费网站看v片在线18禁无码 | 亚洲一区二区三区香蕉 | av无码电影一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 久久精品中文字幕大胸 | 国产69精品久久久久app下载 | 色综合久久久久综合一本到桃花网 | 亚洲娇小与黑人巨大交 | 5858s亚洲色大成网站www | 青青青爽视频在线观看 | 六月丁香婷婷色狠狠久久 | 女人被男人躁得好爽免费视频 | 久久久久久久女国产乱让韩 | 色婷婷av一区二区三区之红樱桃 | 乱人伦人妻中文字幕无码久久网 | 一本色道婷婷久久欧美 | 亚洲国产精品成人久久蜜臀 | 国产精品美女久久久久av爽李琼 | 最近中文2019字幕第二页 | 色 综合 欧美 亚洲 国产 | 成人无码精品1区2区3区免费看 | 国产免费久久久久久无码 | 高潮毛片无遮挡高清免费 | 午夜时刻免费入口 | 国产av人人夜夜澡人人爽麻豆 | 欧美xxxxx精品 | 亚洲国产日韩a在线播放 | 亚洲乱码中文字幕在线 | 国产无遮挡又黄又爽免费视频 | 天堂一区人妻无码 | 国产精品久久久久久久9999 | 亚洲成熟女人毛毛耸耸多 | 日日摸夜夜摸狠狠摸婷婷 | 少妇高潮一区二区三区99 | 欧美日韩视频无码一区二区三 | 日本护士毛茸茸高潮 | 无人区乱码一区二区三区 | 免费人成网站视频在线观看 | 国产欧美熟妇另类久久久 | 麻豆国产丝袜白领秘书在线观看 | 国产精品无码永久免费888 | 久久99精品国产麻豆蜜芽 | 中国女人内谢69xxxxxa片 | 亚洲一区二区观看播放 | 精品熟女少妇av免费观看 | 国产莉萝无码av在线播放 | 最近的中文字幕在线看视频 | 亚洲人成人无码网www国产 | 日韩欧美中文字幕在线三区 | 日本一区二区三区免费高清 | 俺去俺来也在线www色官网 | 亚洲国产精品成人久久蜜臀 | 久久午夜夜伦鲁鲁片无码免费 | 久久视频在线观看精品 | 99久久人妻精品免费一区 | 国产精品无码永久免费888 | 性史性农村dvd毛片 | 永久免费观看国产裸体美女 | 亚洲午夜福利在线观看 | 国产精品手机免费 | 国产午夜无码精品免费看 | 色综合久久88色综合天天 | 午夜无码人妻av大片色欲 | 免费网站看v片在线18禁无码 | 国产在线精品一区二区三区直播 | 中文字幕乱码人妻无码久久 | 国产99久久精品一区二区 | 成熟人妻av无码专区 | 中文字幕精品av一区二区五区 | 98国产精品综合一区二区三区 | 欧美怡红院免费全部视频 | 久久久久久九九精品久 | 亚洲午夜无码久久 | 暴力强奷在线播放无码 | 国内揄拍国内精品少妇国语 | 理论片87福利理论电影 | 又大又紧又粉嫩18p少妇 | 久久亚洲国产成人精品性色 | 麻豆国产人妻欲求不满谁演的 | 无套内射视频囯产 | 乌克兰少妇xxxx做受 | 亚洲色大成网站www | 亚洲爆乳精品无码一区二区三区 | 国产午夜精品一区二区三区嫩草 | 久久精品国产一区二区三区 | 久久人人97超碰a片精品 | 国产美女极度色诱视频www | 亚洲人成影院在线无码按摩店 | 啦啦啦www在线观看免费视频 | 亚洲国精产品一二二线 | 乱人伦人妻中文字幕无码 | 日日天日日夜日日摸 | 精品成在人线av无码免费看 | 国产成人无码区免费内射一片色欲 | 亚洲成在人网站无码天堂 | 欧洲精品码一区二区三区免费看 | 国产精品无码一区二区三区不卡 | 好爽又高潮了毛片免费下载 | 麻豆果冻传媒2021精品传媒一区下载 | 日韩精品乱码av一区二区 | 最新国产乱人伦偷精品免费网站 | 2019nv天堂香蕉在线观看 | 日韩欧美成人免费观看 | 亚洲中文字幕在线无码一区二区 | 成人免费视频在线观看 | 色 综合 欧美 亚洲 国产 | 日韩精品a片一区二区三区妖精 | 久久久精品国产sm最大网站 | 国产精品人妻一区二区三区四 | 丰满人妻被黑人猛烈进入 | 午夜福利一区二区三区在线观看 | 成年美女黄网站色大免费视频 | 两性色午夜免费视频 | 亚洲精品无码人妻无码 | 亚洲精品国偷拍自产在线麻豆 | 亚洲色成人中文字幕网站 | 无码一区二区三区在线观看 | 人妻体内射精一区二区三四 | 四十如虎的丰满熟妇啪啪 | 日韩精品一区二区av在线 | 亚洲国精产品一二二线 | 性欧美大战久久久久久久 | 成人欧美一区二区三区黑人免费 | 久久综合网欧美色妞网 | 国产成人精品一区二区在线小狼 | 强奷人妻日本中文字幕 | 欧美黑人巨大xxxxx | 免费观看又污又黄的网站 | yw尤物av无码国产在线观看 | 妺妺窝人体色www在线小说 | 一本久道高清无码视频 | 97精品人妻一区二区三区香蕉 | aⅴ在线视频男人的天堂 | ass日本丰满熟妇pics | 国产精品99爱免费视频 | 夜先锋av资源网站 | 国产av久久久久精东av | 国产精品久久久久无码av色戒 | 好男人社区资源 | 国产肉丝袜在线观看 | 精品亚洲成av人在线观看 | 亚洲男人av香蕉爽爽爽爽 | 久久久久成人片免费观看蜜芽 | 日日鲁鲁鲁夜夜爽爽狠狠 | 精品欧洲av无码一区二区三区 | 日韩精品无码一区二区中文字幕 | 好男人社区资源 | 欧美亚洲日韩国产人成在线播放 | 最新版天堂资源中文官网 | 中国大陆精品视频xxxx | 亚洲国产精品一区二区美利坚 | 人人妻人人澡人人爽精品欧美 | 国产做国产爱免费视频 | 国产一区二区三区精品视频 | 久久久中文字幕日本无吗 | 国内丰满熟女出轨videos | 在线а√天堂中文官网 | 国内丰满熟女出轨videos | 99精品无人区乱码1区2区3区 | 国产电影无码午夜在线播放 | 国产一区二区不卡老阿姨 | 国精品人妻无码一区二区三区蜜柚 | 内射白嫩少妇超碰 | 999久久久国产精品消防器材 | 动漫av一区二区在线观看 | 亚洲 激情 小说 另类 欧美 | 丰满妇女强制高潮18xxxx | 中文字幕日产无线码一区 | 国内少妇偷人精品视频免费 | 精品成在人线av无码免费看 | 成年女人永久免费看片 | 国产又爽又黄又刺激的视频 | 色婷婷综合中文久久一本 | 色综合久久久无码中文字幕 | 奇米影视7777久久精品 | 亚洲国产精品无码久久久久高潮 | 精品国产麻豆免费人成网站 | 久久久久久久人妻无码中文字幕爆 | 亚洲中文字幕无码中文字在线 | 无码任你躁久久久久久久 | 亚洲gv猛男gv无码男同 | 乱码av麻豆丝袜熟女系列 | 天堂亚洲2017在线观看 | 国产乱人伦av在线无码 | 精品成人av一区二区三区 | 亚洲狠狠婷婷综合久久 | 欧美精品国产综合久久 | 婷婷综合久久中文字幕蜜桃三电影 | 中文无码伦av中文字幕 | 久久久精品456亚洲影院 | 丰满诱人的人妻3 | 天堂а√在线中文在线 | 久久99精品久久久久婷婷 | 中文字幕乱码中文乱码51精品 | 国产精品人人爽人人做我的可爱 | 无码中文字幕色专区 | 日韩欧美成人免费观看 | 亚洲欧洲日本综合aⅴ在线 | 国产艳妇av在线观看果冻传媒 | 日韩av无码一区二区三区不卡 | 亚洲综合精品香蕉久久网 | 永久免费观看美女裸体的网站 | 麻豆蜜桃av蜜臀av色欲av | 亚洲の无码国产の无码步美 | 国产成人人人97超碰超爽8 | 欧美精品无码一区二区三区 | 奇米影视888欧美在线观看 | 亚洲中文字幕无码中文字在线 | 国产成人午夜福利在线播放 | 中文字幕无码av波多野吉衣 | 久久精品人人做人人综合 | 亚洲精品无码国产 | 青草青草久热国产精品 | 中文字幕无码日韩欧毛 | 国产亲子乱弄免费视频 | 在线欧美精品一区二区三区 | 日韩精品a片一区二区三区妖精 | 国产av一区二区精品久久凹凸 | 国产午夜亚洲精品不卡 | 97久久国产亚洲精品超碰热 | 精品无码一区二区三区爱欲 | 日本高清一区免费中文视频 | 欧美日韩一区二区综合 | 亚洲国产欧美在线成人 | 色妞www精品免费视频 | 国产无av码在线观看 |