<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Just Java IT

    西門町學士關于Java的隨便一說而已……

    2006年3月16日 #

    走進JavaFX-(2)

         摘要: 我猶豫了好一陣才決定寫JavaFX的語法部分。個人認為這是學習中最枯燥的部分。因為JavaFX的語法非常簡單且直觀,比如Sun提供的在線 Tutorial的GUI部分,即使你是第一次聽說JavaFX這個東西,只要你稍有一點點編程經驗,你也基本上能夠毫無障礙地理解這個Tutorial 的內容了。
    話雖如此,部分語法可能確實會造成一些理解困難,比如有的地方分隔符用逗號(,)分號(;)和空格都可以,def和var的區別,=>操作符,等等這些還得初看一遍語法才能理解(當然,基本上就沒有必要看第二遍了吧)。因此,我也在此將JavaFX的語法照著Sun的語法 Tutorial快速地過一遍,為以后打下一個堅實(!)的基礎,呵呵。  閱讀全文

    posted @ 2008-12-16 01:05 西門町學士 閱讀(1817) | 評論 (4)編輯 收藏

    走進JavaFX-(1u1)

    /**
    以前寫了一個JavaFX入門例子,但由于JavaFX正式版中變化較大,那個例子已無法在正式版中運行,因此重寫,標題叫1u1,也是遵守Sun的更新規范,代表update1,呵呵
    文:西門町學士
    */
    08 年12月4日,Sun正式發布了JavaFX1.0。JavaFX在演進過程中發生了很多的變化,因此,我以前寫的JavaFX的第一個 HelloWorld的例子已經無法在正式版下運行,于是在這里重寫那個例子。而新的API我也還沒有開始學習,只好大略地瀏覽了一遍API就草草寫就, 因此,這個例子雖然在1.0版下正確運行,卻未必就是最適合的寫法,以后如發現問題再來update2吧,呵呵……
    正式版中很多包的命名有了天翻 地覆的變化,class的位置和名稱很多也面目全非。比如GUI這塊就經歷了由javafx.ui變化成javafx.gui再變化成 javafx.scene和javafx.application再進化成javafx.scene和javafx.stage,而跟Swing相關的組 件也統統加上了Swing前綴。有的class我已經找不到了,比如以前的javafx.ui.MessageDialog,我在1.0中沒有找到對應的 class,只好直接叫用javax.swing.JOptionPane了。好了,廢話不說了,貼新代碼如下:
    package sc.tmp;

    import javafx.stage.Stage;
    import javafx.scene.Scene;
    import javafx.scene.paint.Color;
    import javafx.ext.swing.SwingButton;
    import javax.swing.JOptionPane;

    /**
     * 
    @author stevech
     
    */
    Stage {
        title: 
    "Application title"
        width: 
    250
        height: 
    80
        scene: Scene {
            fill: Color.ORANGE
            content: SwingButton {
                text: 
    "Click"
                action: function():Void {
                    JOptionPane.showMessageDialog(
    null"Have Fun!\nThis is your first JavaFX app!")
                }
                translateX: 
    90 translateY: 10
            }
        }
        visible: 
    true
    }

    結果如圖:

    posted @ 2008-12-12 22:42 西門町學士 閱讀(1469) | 評論 (1)編輯 收藏

    走進JavaFX-(1)

         摘要: JavaFX出來已經很長一段時間了。一直在計劃跟進,可是因為比較懶,現在才慢慢地學習。這里就暫做做學習總結的地方吧。
    雖然是總結,我還是打算寫詳細一點。本來我對JavaFX了解也不是很多,有的東西還要在網上查證了才能寫(比較JavaFX是如何誕生,如何從F3變成 JavaFX的)。今天要寫的主要是:1、JavaFX的前世今生;(了解了它的歷史也就了解了它是什么,它的發展方向,呵呵)2、如何擁有 JavaFX;(知道從哪里去下載開發工具,如何配置它)3、Hello JavaFX World(當然,一個經典的Hello World是不能少的)  閱讀全文

    posted @ 2008-07-18 11:12 西門町學士 閱讀(1847) | 評論 (6)編輯 收藏

    NetBeans無好書[順便推薦兩本Java書]

    首先聲明,本文作者信手亂寫,以前候捷寫無責任書評,無責任這三個字,在我這兒也差不多——西門町學士 (注)

    前兩天逛書店,看到一本《精通NetBeans——Java桌面、Web、企業級程序開發》 ,遂在書店里站了一個多小時(好厚啊!書厚臉皮也厚),基本把這本書看了一遍,整體感覺失望,內容完全配不上精通NetBeans這個標題。基本上就是在NetBeans環境里寫一些很簡單的JavaSE和JavaEE代碼,而且代碼質量也很不高。像Web部分,為了圖簡單,在JSP頁面中寫了大量的scriptlet,很不推薦開發人員看這種代碼。這本書勉勉強強可以起名叫《初涉NetBeans》,看來要想更好地推介NetBeans,還需要更多的技術作者的努力。什么時候NetBeans的書能跟Delphi的書媲美了,估計NetBeans的大業差不多就定了吧,呵呵
    不管用什么IDE,關鍵是看開發人員本人對語言和框架的功力,這里也推介兩本書,都是老書了,但內容基本不落伍,提升功力更是不錯。
    一本是:Swing,Matthew Robinson 和 Pavel Vorobiev合寫的,學士手上的很老了,上個世紀末的英文原版,但是真的非常非常經典,國內應該有更新的中文版的,做Swing的一定要看,很不錯。
    一 本關于JSP和Servlet方面的,學士是從TSS下載的免費電子版,Servlets and JavaServer Pages, The J2EE technology Web Tier,Jayson Falkner 與 Kevin Jones合著,(基于J2EE4,無JSF方面內容),國內好像沒有中文版的。這也是一本好書,Java Web入門與提升均應多讀此書。
    這兩本書最大的特點就是,呵呵,用侯捷的話說,叫深入淺出。在講一個技術的同時,也講正確的編碼和設計方法,既能讓一個新手從正門登堂入室,也能讓一個有經驗的開發人員獲得提升,以此大力推介之。

    posted @ 2007-06-10 23:45 西門町學士 閱讀(909) | 評論 (1)編輯 收藏

    又說Eclipse與NetBeans

    文:西門町學士

    Eclipse的陣營一向強大,最近又加入了一家重量級的公司:Google,相形之下,NetBeans的陣營顯得有點那么“勢單力薄”。
    我本人則由于對Swing的喜愛及對SWT的不喜愛,一直(從NB3.0以來)使用NetBeans。
    (以前的NetBeans確實不夠好用,建個Project還得先mount一下,典型的Unix思維)雙方這幾年的發展,從架構和功能上來說,現在NetBeans和Eclipse已經是大同小異,沒有誰比誰牛×。對于developers,用誰憑喜好。
    可 對于想通過這兩個平臺來賺錢的企業來說,二者的區別可就太大了。看看Eclipse的陣營(雙方的家長就不提了):BEA, Borland, Intel, Sybase, Adobe, Oracle, Google, etc全是些IT屆NB哄哄的大牛;再看看NetBeans的部隊:一隊的無名小卒,大名鼎鼎的也有:Amazon:賣書的;eBay:做生意的;HP: 賣PC的;還有賣手機的,做開源的,不一而足,感覺有點歪瓜裂棗似的。我就納悶兒了:同樣都是做Java IDE 的,受到的待遇區別咋就這么大呢!何況像Borland這樣的本來JBuilder和NetBeans就很相近,為什么還得繞個彎兒去舔SWT的屁股? (李維還在信心滿滿的說什么Java開發王者,反正我是不信
    今 兒個感覺有點想明白了:Eclipse是搭個基本架子,剩下的這些公司在上面做自己的東東然后就可以拿去賣錢了,像MyEclipse、Borland都 是這么個想法;而NetBeans呢,Sun好像是把它定位成送給Developers的禮物(那里面裝的當然就會是Sun所領導的Java技術,而不會 是那個覬覦者IBM的Java技術),IDE free, Web pack free, mobility pack free, Enterprise pack free, 等等等等通通free,免費大贈送,咱們開發者當然是高興了,既不要錢,又是最新技術,還有個Sun蓋的“正統”大章。可對于那些公司就不一樣了,老子吃 的就是這碗飯,你全送人了我喝西北風啊?還活不活啊我?你以為我像JBoss那樣傻,不賣產品賣服務?JBoss不就是發現這碗飯不好吃才把 Rickard Oberg這個頑固不化的家伙給踹出門的嗎。所以這些公司才紛紛對NetBeans離的遠遠的,像見了娘親一向撲向Eclipse的懷抱~~
    不管怎么說,我還是Swing的堅定支持者,支持Sun,支持NetBeans,最后,感謝James Golsing,感謝Groove Coverage(我是邊聽God is A Girl一邊碼字兒的),感謝你的眼睛不辭辛勞地看到這里!

    posted @ 2006-12-15 22:42 西門町學士 閱讀(1152) | 評論 (4)編輯 收藏

    數組的力量

    ??? 假如我們要精確計算一個很大的數,比如說,256的階乘(結果有500多位),怎么辦?
    你會說,很好辦啊,從JDK 1.1起Java不是提供了一個java.math.BigInteger嗎?不錯,用BigInteger確實能解決問題。不過,如果沒有Sun給的這個class,僅僅靠Java最基本的那些類型,我們有沒有辦法來進行計算呢?答案是,肯定是能嘛,要不然在BigInteger之前怎么辦。
    方法之一就是用數組來表示。比如說:
    ??????????????????????? int[] data = new int[100];
    ??? 我們知道,一個int的最大值為2^31-1即2147483647(10位),如果我們把這100個int值串起來,我們就能表示一個1000位的數。這里我們就用這種方式來計算256的階乘(256!)。
    ??? 我們先分配100個int的數組,由于是static,所以每個int的初始值都是0。
    ??? 然后每個int表示6位數,即最大值為999999。因為我們要做乘法,如果給int的位數過大,如9位,那么999999999乘上一個數,如100,它的值就大于了int的max值,造成溢出。所以int表示的位數需要根據需要仔細選擇。(用long來表示也同樣需要仔細權衡位數)
    ??? 再定義一個num來表示我們占用的數組的int個數
    ??? 在乘法的時候,對每個占用的int中的數都要乘,然后一個一個地判斷每個int中的值是不是超出了6位:
    ??????????????????????? if (data[j]) > 1000000)
    ??? 如果超出了則需要進位:
    ??????????????????????? data[k+1] += data[k]/1000000;
    ??????????????????????? data[k] %= 1000000;
    一個個判斷,最后,如果最高位(即data[num])中的數值也超過了6位,我們就需要占用一個新的int,同樣地進位,當然也不要忘了給num加一。
    ??????????????????????? if (data[num] > 1000000) num++;
    ??? 最后,將我們的數組順序輸出即可。在輸出的時候需要小心的是,如果int中的值小于6位,如25,別忘了補上0,即000025,否則你會得到錯誤的答案的。
    ??? 完整的代碼如下:

    package?tmp;

    /**
    ?*
    ?*?
    @author?Stevech
    ?
    */
    public?class?BigNumbers?{
    ????
    static?int[]?data?=?new?int[100];
    ????
    ????
    /**?Creates?a?new?instance?of?BigNumers?*/
    ????
    public?static?void?main(String[]?args)?{
    ????????
    int?num?=?0;????//?占用的個數
    ????????data[0]?=?1;????//?0和1的階乘是1
    ????????
    ????????
    for?(int?i?=?2;?i?<?257;?i++)?{
    ????????????
    for?(int?j?=?0;?j?<?num?+?1;?j++)?{
    ????????????????data[j]?
    *=?i;????????//?對每個int中的數都乘上?i
    ????????????}
    ????????????
    for?(int?j?=?0;?j?<?num?+?1;?j++)?{
    ????????????????
    if?(data[j]?>?1000000)?{
    ????????????????????
    for?(int?k?=?j;?k?<?num?+?1;?k++)?{
    ????????????????????????
    if?(data[num]?>?1000000)?num++;
    ????????????????????????data[k
    +1]?+=?data[k]/1000000;????//?進位
    ????????????????????????data[k]?%=?1000000;??????????????????//?進位后的余數
    ????????????????????}
    ????????????????}
    ????????????}
    ????????}
    ????????System.out.println(
    "占用的int數:"?+?(num+1)?+?"\n值:");
    ????????System.out.print(data[num]);
    ????????
    for?(int?i?=?num-1;?i?>?-1;?i--)?{
    ????????????System.out.print(
    new?java.text.DecimalFormat("000000").format(data[i]));
    ????????}
    ????}
    }
    輸出結果為:
    占用的int數:85
    值:
    85781777534284265411908227168123262515778152027948561985965565037726945255314
    75893774402913604514084503758853423365843061571968346936964753222892884974260256
    79637332563368786442675207626794560187968867971521143307702077526646451464709187
    32610083287632570281898077367178145417025052301860849531906813825748107025281755
    94594769870346657127381392862052347568082188607012036110831520935019474371091017
    26968262861606263662435022840944191408424615936000000000000000000000000000000000
    000000000000000000000000000000

    posted @ 2006-04-16 21:19 西門町學士 閱讀(1948) | 評論 (3)編輯 收藏

    JTextField內容有效性驗證幾種方式

    在使用 SwingJTextField時,我們常常希望只接受那些符合我們要求的錄入,如數字、電話號碼、郵政編碼、E-mail等。JFC工作組在這方面也做了很多工作,每一次新的Java Se發布,往往都提供了新的、更方便和強大的有效性驗證方式,在這里列舉幾種不同的驗證方式。

    • 利用鍵盤和焦點事件

    這是最直覺的方式。利用 KeyListener來選擇允許的字符,且添加FocusListener,使得

    內容不符合要求時不允許焦點轉移。這種方式很繁瑣, Sun的建議是不推薦使用這種方式。

    • 使用自定義的 Document

    我們知道, Swing組件是基于MVC實現的。JTextComponentModel是一個叫做DocumentInterface,我們可以通過限制Document的內容來達到有效性驗證的目的。javax.swing.text包中有多個不同的Document的實現,JTextField使用的是PlainDocument。如果我們希望JTextField只接受數字,可以實現我們特定的Document并使之替換默認的Document


       package sdn;

    import javax.swing.text.*;

    public class IntegerDocument extends PlainDocument {

    int currentValue = 0;

    public int getValue() {
    return currentValue;
    }

    public void insertString(int offset, String string,
    AttributeSet attributes) throws BadLocationException {

    if (string == null) {
    return;
    } else {
    String newValue;
    int length = getLength();
    if (length == 0) {
    newValue = string;
    } else {
    String currentContent = getText(0, length);
    StringBuffer currentBuffer =
    new StringBuffer(currentContent);
    currentBuffer.insert(offset, string);
    newValue = currentBuffer.toString();
    }
    currentValue = checkInput(newValue, offset);
    super.insertString(offset, string, attributes);
    }
    }
    public void remove(int offset, int length)
    throws BadLocationException {
    int currentLength = getLength();
    String currentContent = getText(0, currentLength);
    String before = currentContent.substring(0, offset);
    String after = currentContent.substring(length+offset,
    currentLength);
    String newValue = before + after;
    currentValue = checkInput(newValue, offset);
    super.remove(offset, length);
    }
    public int checkInput(String proposedValue, int offset)
    throws BadLocationException {
    if (proposedValue.length() > 0) {
    try {
    int newValue = Integer.parseInt(proposedValue);
    return newValue;
    } catch (NumberFormatException e) {
    throw new BadLocationException(proposedValue, offset);
    }
    } else {
    return 0;
    }
    }
    }

    然后用 IntegerDocument去替換JTextField默認的Document

       package sdn;

    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.*;
    import java.awt.event.*;

    public class NumericInput {
    public static void main(String args[]) {
    Runnable runner = new Runnable() {
    public void run() {
    JFrame frame = new JFrame("Numeric Input");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new GridLayout(2, 2));

    frame.add(new JLabel("Number"));
    JTextField fieldOne = new JTextField();
    Document doc= new IntegerDocument();
    fieldOne.setDocument(doc);
    frame.add(fieldOne);

    frame.add(new JLabel("All"));
    JTextField fieldTwo = new JTextField();
    frame.add(fieldTwo);

    frame.setSize(250, 90);
    frame.setVisible(true);
    }
    };
    EventQueue.invokeLater(runner);
    }
    }

    代碼很簡單,一目了然。這里說點題外話, Sun建議的Swing Applicationmain函數寫法如上所示:先建一個Runnable,然后把這個Runnable放到event-dispatch thread中去執行。另外,以前有的Developer(比如我)喜歡用SwingUtilities.invokeLater(runner)來將一個thread放到event-dispatch thread中,現在Sun也建議用EventQueue.invokeLater(runner),因為SwingUtilities方法版本僅僅是對EventQueue方法版本的一個包裝。

    • InputVerifier來實現

    J2SE 1.3中加入了一個名為InputVerifier的抽象類,可用于任何JComponent。其中定義了boolean verifiy(JComponent input)方法。如果組件中的文本是有效的,當焦點轉移時(如按下TabShift-Tab),verify方法返回true;否則返回false,使得焦點仍停留在當前組件上。我們仍以數字為例:

       package sdn;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class NumericVerifier{
    public static void main(String args[]) {
    Runnable runner = new Runnable() {
    public void run() {
    JFrame frame = new JFrame("Numeric Verifier");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel1 = new JPanel(new BorderLayout());
    JLabel label1 = new JLabel("Numeric-only");
    JTextField textField1 = new JTextField();
    panel1.add(label1, BorderLayout.WEST);
    panel1.add(textField1, BorderLayout.CENTER);

    JPanel panel2 = new JPanel(new BorderLayout());
    JLabel label2 = new JLabel("Anything");
    JTextField textField2 = new JTextField();
    panel2.add(label2, BorderLayout.WEST);
    panel2.add(textField2, BorderLayout.CENTER);

    JPanel panel3 = new JPanel(new BorderLayout());
    JLabel label3 = new JLabel("Numeric-only");
    JTextField textField3 = new JTextField();
    panel3.add(label3, BorderLayout.WEST);
    panel3.add(textField3, BorderLayout.CENTER);

    InputVerifier verifier = new InputVerifier() {
    public boolean verify(JComponent comp) {
    boolean returnValue;
    JTextField textField = (JTextField)comp;
    try {
    Integer.parseInt(textField.getText());
    returnValue = true;
    } catch (NumberFormatException e) {
    Toolkit.getDefaultToolkit().beep();
    returnValue = false;
    }
    return returnValue;
    }
    };

    textField1.setInputVerifier(verifier);
    textField3.setInputVerifier(verifier);

    frame.add(panel1, BorderLayout.NORTH);
    frame.add(panel2, BorderLayout.CENTER);
    frame.add(panel3, BorderLayout.SOUTH);
    frame.setSize(300, 95);
    frame.setVisible(true);
    }
    };
    EventQueue.invokeLater(runner);
    }
    }

    這個例子的效果和上一個是不同的。自定義 DocumentApp中,用戶將會發現任何非數字的字符都不會在JTextField中出現;而在使用InputVerifierApp中,用戶在錄入字符時不會發現任何異常,但是當他確認錄入完成后,如果內容不符合有效性,焦點將不會轉移!這兩種情況都可能讓一個沒有經驗的用戶茫然,具體使用哪一種是一個見仁見智的問題。

    • 使用 Document Filter

    J2SE 1.4中,又加入了一個新的類:DocumentFilter。你無需再實現一個新的Document,而是對現有的Document過濾一遍。它的結果與實現自定義的Document并無二樣,僅僅是思路不同而已。

       package snd;
    import javax.swing.text.*;
    import java.awt.Toolkit;

    public class IntegerDocumentFilter extends DocumentFilter {


    int currentValue = 0;

    public IntegerDocumentFilter() {
    }

    public void insertString(DocumentFilter.FilterBypass fb,
    int offset, String string, AttributeSet attr)
    throws BadLocationException {

    if (string == null) {
    return;
    } else {
    replace(fb, offset, 0, string, attr);
    }
    }

    public void remove(DocumentFilter.FilterBypass fb,
    int offset, int length)
    throws BadLocationException {

    replace(fb, offset, length, "", null);
    }

    public void replace(DocumentFilter.FilterBypass fb,
    int offset, int length, String text, AttributeSet attrs)
    throws BadLocationException {

    Document doc = fb.getDocument();
    int currentLength = doc.getLength();
    String currentContent = doc.getText(0, currentLength);
    String before = currentContent.substring(0, offset);
    String after = currentContent.substring(
    length+offset, currentLength);
    String newValue = before +
    (text == null ? "" : text) + after;
    currentValue = checkInput(newValue, offset);
    fb.replace(offset, length, text, attrs);
    }

    private int checkInput(String proposedValue, int offset)
    throws BadLocationException {
    int newValue = 0;
    if (proposedValue.length() > 0) {
    try {
    newValue = Integer.parseInt(proposedValue);
    } catch (NumberFormatException e) {
    throw new BadLocationException(
    proposedValue, offset);
    }
    }
    return newValue;
    }
    }

    再將這個 Filter應用于Document

       package sdn;
    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.*;

    public class NumericInputFilter {
    public static void main(String args[]) {
    Runnable runner = new Runnable() {
    public void run() {
    JFrame frame = new JFrame("Numeric Input Filter");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new GridLayout(2, 2));

    frame.add(new JLabel("Number"));
    JTextField textFieldOne = new JTextField();
    Document doc= textFieldOne.getDocument();
    DocumentFilter filterOne = new IntegerDocumentFilter();
    ((AbstractDocument)doc).setDocumentFilter(filterOne);
    textFieldOne.setDocument(doc);
    frame.add(textFieldOne);

    frame.add(new JLabel("All"));
    JTextField textFieldTwo = new JTextField();
    frame.add(textFieldTwo);

    frame.setSize(250, 90);
    frame.setVisible(true);
    }
    };
    EventQueue.invokeLater(runner);
    }
    }

    DocumentFilter只能用于Swing中的與text有關的組件(而InputVerifier可用于任何組件)。除了這幾種方法,在對于TextField而言,我們還有JFormattedTextField,很多時候用JFormattedTextField將是非常容易和簡單的方式。

    注:這篇文章基本根據SDN的Core Java Tech Tips意譯而來,代碼基本跟其一致,另外還參考了M. Robinson & P. Vorobiev的Swing, Chapter 11

    posted @ 2006-04-09 16:26 西門町學士 閱讀(2364) | 評論 (0)編輯 收藏

    Tiger pitfall

    在SDN踩到一個Tiger的pitfall:
    package sdn;

    import java.util.ArrayList;

    public class BoxingEquality {
       
        /** Creates a new instance of BoxingEquality */
        public BoxingEquality() {
        }
       
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            int i = 1;
            int j = 1;
            ArrayList<Integer> list = new ArrayList<Integer>();
            list.add(i);
            list.add(j);
            System.out.printf("It is %b that i == j.\n", (i==j));
            System.out.printf("It is %b that list.get(0) == list.get(1).\n", (list.get(0)==list.get(1)));
            System.out.printf("It is %b that list.get(0).equals(list.get(1)).",            list.get(0).equals(list.get(1)));
        } 
    }

    輸出結果出乎意料:
    It is true that i == j.
    It is true that list.get(0) == list.get(1).    // WHY???
    It is true that list.get(0).equals(list.get(1)).

    然而,僅僅將 i 和 j 的值改成1000:
    int i = 1000;
    int j = 1000;
    就這一個改動后輸出結果雖然符合了java的思維方式,但在這個context中卻更顯得怪異:
    It is true that i == j.
    It is false that list.get(0) == list.get(1). // Oops
    It is true that list.get(0).equals(list.get(1)).

    Sun給出的解釋:
    The primitives are equal and the values of the boxed ints are equal. But this time the ints point to different objects. What you have discovered is that for small integral values, the objects are cached in a pool much like Strings. When i and j are 2, a single object is referenced from two different locations. When i and j are 2000, two separate objects are referenced. Autoboxing is guaranteed to return the same object for integral values in the range [-128, 127], but an implementation may, at its discretion, cache values outside of that range. It would be bad style to rely on this caching in your code.

    呵呵,要不注意說不定還真中招了!

    posted @ 2006-03-16 22:03 西門町學士 閱讀(335) | 評論 (4)編輯 收藏

    主站蜘蛛池模板: 亚洲日韩精品无码专区| 拍拍拍无挡视频免费观看1000| 亚洲精品视频免费观看| 永久免费AV无码网站国产| 亚洲区视频在线观看| 成人亚洲综合天堂| 8x成人永久免费视频| 国产一区二区三区亚洲综合| 亚洲AV日韩精品久久久久| 日本特黄特黄刺激大片免费| 你懂的免费在线观看网站| 亚洲人成网站在线在线观看| 亚洲国产精品va在线播放| 天堂在线免费观看中文版| 最近免费中文字幕MV在线视频3| 中国亚洲呦女专区| 亚洲V无码一区二区三区四区观看| 国产在线观看片a免费观看| 岛国精品一区免费视频在线观看 | 午夜视频在线免费观看| 亚洲精华国产精华精华液网站| 亚洲国产成人久久综合碰碰动漫3d| 国产精品免费看香蕉| 亚洲人成在线免费观看| 99在线免费视频| 免费中文字幕视频| 亚洲熟妇无码八V在线播放| 亚洲精品乱码久久久久久下载 | 妞干网手机免费视频| 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 亚洲乱码一二三四区国产| 亚洲中文久久精品无码ww16| 成人午夜大片免费7777| 综合在线免费视频| 久久国产精品一区免费下载| 国产精品内射视频免费| 理论亚洲区美一区二区三区| 亚洲Av高清一区二区三区| 久久久久亚洲AV无码观看| 亚洲爆乳精品无码一区二区三区| 亚洲精品无码av天堂|