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

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

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

    隨筆-46  評(píng)論-64  文章-2  trackbacks-0
      2007年10月26日
         摘要: 廢話不多說(shuō),先看看我們最終達(dá)到的效果.? 源碼下載在文章最后。Style1:Style2:上面的tag cloud實(shí)現(xiàn)思想如下:1. Server端提供Tag的相關(guān)信息,包括TagName,Posts等,使用JSON格式傳輸數(shù)據(jù)??? 這個(gè)例子中,我使用Servlet,使用json-lib將Bean轉(zhuǎn)成JSON字符串。當(dāng)然Tag的相關(guān)信息這里只是演示,真實(shí)環(huán)境中可能就需要從數(shù)據(jù)庫(kù)取出來(lái)再處理了。?...  閱讀全文
    posted @ 2008-09-28 16:10 jht 閱讀(3161) | 評(píng)論 (3)編輯 收藏
    1. response.setHeader("Cache-Control","no-cache");

    This is used to prevent the browser from caching your dynamic content generated by a JSP or Servlet.

    You set this attribute in the HTTP header of the response object which would tell the browser not to cache this content. So everytime you request the page again, the browser would make a new request, instead of showing you a cached page.

    2.使用服務(wù)器端控制AJAX頁(yè)面緩存:
    ??? response.setHeader( "Pragma", "no-cache" );
    ??? response.addHeader( "Cache-Control", "must-revalidate" );
    ??? response.addHeader( "Cache-Control", "no-cache" );
    ??? response.addHeader( "Cache-Control", "no-store" );
    ??? response.setDateHeader("Expires", 0);
    單純的使用 xmlhttp.setRequestHeader("Cache-Control","no-cache")無(wú)效。

    3.Cache-Control頭域
      Cache-Control指定請(qǐng)求和響應(yīng)遵循的緩存機(jī)制。在請(qǐng)求消息或響應(yīng)消息中設(shè)置Cache-Control并不會(huì)修改另一個(gè)消息處理過(guò)程中的緩存處理過(guò)程。請(qǐng)求時(shí)的緩存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應(yīng)消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各個(gè)消息中的指令含義如下:
      Public指示響應(yīng)可被任何緩存區(qū)緩存。
      Private指示對(duì)于單個(gè)用戶的整個(gè)或部分響應(yīng)消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當(dāng)用戶的部分響應(yīng)消息,此響應(yīng)消息對(duì)于其他用戶的請(qǐng)求無(wú)效。
      no-cache指示請(qǐng)求或響應(yīng)消息不能緩存
      no-store用于防止重要的信息被無(wú)意的發(fā)布。在請(qǐng)求消息中發(fā)送將使得請(qǐng)求和響應(yīng)消息都不使用緩存。
      max-age指示客戶機(jī)可以接收生存期不大于指定時(shí)間(以秒為單位)的響應(yīng)。
      min-fresh指示客戶機(jī)可以接收響應(yīng)時(shí)間小于當(dāng)前時(shí)間加上指定時(shí)間的響應(yīng)。
      max-stale指示客戶機(jī)可以接收超出超時(shí)期間的響應(yīng)消息。如果指定max-stale消息的值,那么客戶機(jī)可以接收超出超時(shí)期指定值之內(nèi)的響應(yīng)消息。

    Read more:
    ???http://www.jiehoo.com/browser-cache-problem.htm?(作者: Cherami?原載: 瀏覽器緩存)
    ???再論怎么有效利用瀏覽器緩存之怎么避免瀏覽器緩存靜態(tài)文件
    ???HTTP協(xié)議header頭域- PetitPrince - 博客園
    posted @ 2008-09-27 10:23 jht 閱讀(16592) | 評(píng)論 (3)編輯 收藏
    < link?id = " css " ?rel = StyleSheet?type = " text/css " ?href = " ./button.css " ? />

    < script?type = " text/javascript " >
    ?
    var ?cssArray? = ? new ?Array( " button.css " , " button1.css " , " button2.css " , " button3.css " , " button4.css " , " button5.css " , " button6.css " );
    ?
    var ?index? = ? 0 ;
    ?
    function ?changeCssFile()
    ?
    {
    ??
    var ?css? = ?document.getElementById( " css " );
    ??index
    ++ ;
    ??
    if (index < cssArray.length)
    ??
    {
    ???css.href?
    = ?cssArray[index];
    ??}

    ??
    else
    ??
    {
    ???index?
    = 0 ;
    ???css.href?
    = ?cssArray[index];
    ??}

    ?}

    </ script >

    ? < a? class ="button" ?href ="#" ?onclick ="changeCssFile()" >
    ??
    < span? id ="buttonText" > Change?another?style </ span >
    ?
    </ a >
    posted @ 2008-09-25 12:26 jht 閱讀(767) | 評(píng)論 (0)編輯 收藏
    A:瀏覽器問(wèn)題,可能會(huì)把透明區(qū)域顯示成有灰度的區(qū)域,解決辦法,轉(zhuǎn)成gif格式吧,支持比較好

    see: GIF or PNG? - Quality Web Tips
    posted @ 2008-09-24 23:02 jht 閱讀(1190) | 評(píng)論 (1)編輯 收藏
    比如說(shuō)下面的這個(gè)header.jsp中有中文,那么包含這個(gè)文件的網(wǎng)頁(yè)可能就會(huì)出現(xiàn)亂碼
    <jsp:include page="header.jsp"></jsp:include>

    解決辦法是在header.jsp里加上下面這段話:
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    posted @ 2008-09-23 12:46 jht 閱讀(462) | 評(píng)論 (0)編輯 收藏
         摘要: log4j 支持運(yùn)行時(shí)修改日志的相關(guān)配置,看了一下他的source code, 用FileWatchdog這個(gè)類來(lái)做的,代碼也很簡(jiǎn)單,通過(guò)循環(huán)在一定時(shí)間間隔讀取配置文件,如果文件變更,調(diào)用一個(gè)doOnChange()方法。如果自己要做一個(gè)支持運(yùn)行時(shí)修改配置的系統(tǒng)可參考上面的做法。下面是一段支持運(yùn)行時(shí)修改配置的系統(tǒng)Prototype代碼,和log4j的做法稍有不同,使用Observer模式,使其更加...  閱讀全文
    posted @ 2008-09-04 14:49 jht 閱讀(1321) | 評(píng)論 (0)編輯 收藏

    可以用下面這個(gè)方法來(lái)做到

    import ?org.apache.log4j.Logger;
    import ?org.apache.log4j.PropertyConfigurator;

    public ? class ?DemoRunTimeChangeLog4J? {

    ?
    private ? static ? final ?Logger?logger? = ?Logger.getLogger(DemoRunTimeChangeLog4J. class );

    ?
    public ? static ? void ?main(String[]?args)? {
    ??PropertyConfigurator.configureAndWatch(
    " src/log4j.configureAndWatch " , 60000 );
    ??
    ??
    while ?( true )? {
    ???
    if ?(logger.isDebugEnabled())? {
    ????logger.debug(
    " DEBUG?MESSAGE " );
    ???}


    ???logger.info(
    " Info?Message " );

    ???
    try ? {
    ????Thread.sleep(
    5000 );
    ???}
    ? catch ?(InterruptedException?e)? {
    ???}

    ??}

    ?}

    }


    posted @ 2008-09-03 17:35 jht 閱讀(635) | 評(píng)論 (0)編輯 收藏
    自定義TagLib的時(shí)候碰到這個(gè)錯(cuò)誤,原因是編輯tld文件的時(shí)候沒(méi)有使用DTD或者Schema文件驗(yàn)證,拼寫錯(cuò)誤導(dǎo)致最終報(bào)這個(gè)錯(cuò)誤消息

    如果遇到同樣問(wèn)題的同學(xué),不妨檢查一下自己的tld文件對(duì)不對(duì)。

    BTW: tld類的異常需要處理好
    posted @ 2008-08-19 15:53 jht 閱讀(7766) | 評(píng)論 (1)編輯 收藏
    這個(gè)問(wèn)題可能由兩個(gè)地方導(dǎo)致

    1. 你的POJO類不是一個(gè)JavaBean,最可能的原因是沒(méi)有一個(gè)無(wú)參構(gòu)造函數(shù)
    2. 在dwr.xml里這個(gè)類的<convert>指定的不對(duì),或者是沒(méi)有指定
    posted @ 2008-08-11 11:21 jht 閱讀(4204) | 評(píng)論 (4)編輯 收藏
    數(shù)獨(dú)游戲小程序

    數(shù)獨(dú)的游戲規(guī)則很簡(jiǎn)單:在九個(gè)九宮格里,填入1到9的數(shù)字,讓每個(gè)數(shù)字在每個(gè)行、列及九宮格里都 只出現(xiàn)一次就可以過(guò)關(guān)了!?雖然游戲的規(guī)則十分簡(jiǎn)單,但很多人在沒(méi)有計(jì)算機(jī)輔助時(shí),常常會(huì)不小心造成違規(guī)狀況。

    下面是我做的一個(gè)數(shù)獨(dú)小程序 1.0 版本,目前功能如下:

    選擇外觀;
    數(shù)獨(dú)自動(dòng)出題;
    數(shù)獨(dú)自動(dòng)解題;
    游戲計(jì)時(shí)功能;
    開(kāi)啟解答輔助功能,出錯(cuò)提示;
    開(kāi)啟解答輔助功能,輔助線;

    程序基于Java Swing,運(yùn)行需要JRE1.6以上版本。
    ?
    可雙擊執(zhí)行的JAR包,點(diǎn)此下載。(Napkin的LookAndFeel蠻好玩,我就一起弄在里面了)
    程序的源碼,點(diǎn)此下載。(有興趣修改源碼的朋友可以DIY出自己喜歡的版本。)

    或者也可以從 http://groups.google.com/group/afun?這個(gè)group的files里面找到上面的兩個(gè)文件。

    對(duì)數(shù)獨(dú)有興趣的朋友可以玩一下這個(gè)小工具,歡迎留下寶貴意見(jiàn),讓這個(gè)小程序更完善。 可能我會(huì)另開(kāi)一篇日志說(shuō)一下Source Code相關(guān)的東西。
    ?
    Figure: 填值的出錯(cuò)提示
    Figure: 填值的出錯(cuò)提示2
    演示如何使用輔助線功能:
    首先選中Enable help system選項(xiàng), 然后選擇按鈕 1 ,這時(shí)候關(guān)于 1 的輔助線開(kāi)啟,把不能填1的單元格都畫了線,畫線規(guī)則是,1所在的行畫桃紅色橫線,1所在的列畫橙色豎線,1所在的九宮格畫粉色X線,如下圖,這時(shí)候我們發(fā)現(xiàn),在第五行只有第二列這一單元格格沒(méi)有被畫上線,那么這一個(gè)肯定只能填上1。
    這時(shí)候我們就可以把1填入到 第五行第二列,這時(shí)輔助線會(huì)自動(dòng)更新。如下圖,此時(shí)沒(méi)有可以確定填入1的單元格了,我們可以換一個(gè)數(shù)看輔助線。
    ?OK,我們選擇3,這時(shí)候輔助線如下,我們發(fā)現(xiàn)第五行第四格可以確定填入3這個(gè)值。
    填入3之后的圖如下:
    解答成功之后,會(huì)彈出恭喜解答成功的對(duì)話框。
    自動(dòng)解答功能可能出現(xiàn)的異常情況
    當(dāng)題目比較復(fù)雜的時(shí)候,可能會(huì)彈出如下的提示異常的對(duì)話框,這是因?yàn)榻獯饠?shù)獨(dú)用了遞歸的解法,難度大時(shí)遞歸深度很深,導(dǎo)致棧溢出,可以通過(guò)運(yùn)行JVM時(shí)指定線程棧大小的方法來(lái)解決這個(gè)問(wèn)題。
    posted @ 2008-08-02 17:32 jht 閱讀(2714) | 評(píng)論 (4)編輯 收藏
    new & valueof & 直接賦值的區(qū)別
    首先來(lái)看下面這段代碼
    public static void main(String[] args) {
    ??String s1 = "s1";
    ??String s2 = new String("s2");
    ??String s3 = String.valueOf(12345);
    }
    ?
    編譯成class文件之后,使用eclipse class file viewer查看
    ?
    ? // Method descriptor #15 ([Ljava/lang/String;)V
    ? // Stack: 3, Locals: 4
    ? public static void main(java.lang.String[] args);
    ???? 0? ldc <String "s1"> [16]
    ???? 2? astore_1 [s1]

    ???? 3? new java.lang.String [18]
    ???? 6? dup
    ???? 7? ldc <String "s2"> [20]
    ???? 9? invokespecial java.lang.String(java.lang.String) [22]
    ??? 12? astore_2 [s2]
    ??? 13? sipush 12345
    ??? 16? invokestatic java.lang.String.valueOf(int) : java.lang.String [25]
    ??? 19? astore_3 [s3]

    ??? 20? return
    ????? Line numbers:
    ??????? [pc: 0, line: 12]
    ??????? [pc: 3, line: 13]
    ??????? [pc: 13, line: 14]
    ??????? [pc: 20, line: 20]
    ????? Local variable table:
    ??????? [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[]
    ??????? [pc: 3, pc: 21] local: s1 index: 1 type: java.lang.String
    ??????? [pc: 13, pc: 21] local: s2 index: 2 type: java.lang.String
    ??????? [pc: 20, pc: 21] local: s3 index: 3 type: java.lang.String
    }
    ?
    對(duì)于第一行代碼 String s1 = "s1"; 編譯成字節(jié)碼之后,對(duì)應(yīng)兩條指令,
    1. ldc指令從運(yùn)行時(shí)常量池push一個(gè)值到Frame的操作數(shù)棧上面,這個(gè)值在這里就是"s1"字符串的引用,
    2. astore指令將objectref存儲(chǔ)到局部變量,這里也就是存儲(chǔ)到局部變量s1。
    ?
    對(duì)于第二行代碼???String s2 = new String("s2");編譯成字節(jié)碼之后,對(duì)于的指令也用高亮標(biāo)注出來(lái)了,這里把操作數(shù)棧的情況畫了出來(lái),希望能幫助理解。橙色標(biāo)注的為棧頂元素。
    1. new指令會(huì)在堆上創(chuàng)建對(duì)象,操作數(shù)棧里壓入創(chuàng)建的objectref,
      ?
      objectref
      ...
    2. dup指令復(fù)制操作數(shù)棧頂?shù)脑兀?
      objectref
      objectref
      ...
    3. ldc指令依然是從常量池push一個(gè)值到Frame的操作數(shù)棧上,這個(gè)值是"s2"字符串的引用。?
      "s2"_ref
      objectref
      objectref
      ...
    4. invokespecial 指令調(diào)用一個(gè)方法,這里就是調(diào)用String的構(gòu)造函數(shù),調(diào)用完成之后棧上還有一個(gè)objectref?
      objectref
      ...
    5. astore指令將objectref存儲(chǔ)到局部變量,這里也就是存儲(chǔ)到局部變量s2。?
      ????????????
      ...
    ?
    對(duì)于第三行代碼??String s3 = String.valueOf(12345); 編譯成字節(jié)碼之后對(duì)應(yīng)的指令,
    1. sipush 將 12345 壓棧
    2. invokestatic 調(diào)用 String.valueof(int) 方法
    3. astore 將棧頂?shù)膶?duì)象引用存儲(chǔ)到本地變量s3 (這里不再深究這個(gè)棧頂元素是怎么來(lái)的了)
    ?
    PMD檢查代碼的時(shí)候,有這樣的warning: Avoid instantiating?String objects.Call String.valueOf() instead. PMD給出的原因是In JDK 1.5, calling new String() causes memory allocation. String.valueOf() is more memory friendly.
    ?
    經(jīng)過(guò)上面的分解,我們應(yīng)該知道原因了,以后寫代碼的時(shí)候,初始化一個(gè)字符串,??String s1 = "s1"; 這樣的代碼肯定比??String s2 = new String("s2");代碼強(qiáng),將其他類型的值轉(zhuǎn)換成String的時(shí)候,valueof方法比new方法效率也高。

    ?
    備注:
    A frame is used to store data and partial results(局部變量,操作數(shù)棧), as well as to perform dynamic linking , return values for methods, and dispatch exceptions.
    ?
    ldc指令的操作數(shù)棧: ...->...,value (value是int,float 或者 string 類型的引用)
    astore的操作數(shù)棧: ...,objectref->...
    new指令的操作數(shù)棧: ...->...,objectref
    dup指令的操作數(shù)棧: ...,value->...,value,value
    invokespecial的操作數(shù)棧: ...,objectref, [agr1,[arg2...]]->...
    invloestatic的操作數(shù)棧:..., [arg1, [arg2...]]?-> ...

    ?
    如果要理解的更透徹建議閱讀以下參考資料:
    posted @ 2008-07-28 14:27 jht 閱讀(1704) | 評(píng)論 (1)編輯 收藏

    java.awt.Component.requestFocusInWindow

    posted @ 2008-07-22 14:34 jht 閱讀(386) | 評(píng)論 (1)編輯 收藏
    http://m.tkk7.com/Files/jht/MyScreenSnap_2.0.zip

    截圖程序,設(shè)計(jì)目標(biāo):簡(jiǎn)單易用

    支持全屏截圖和選擇截圖,運(yùn)行需要JRE1.5以上版本

    在1.0版http://m.tkk7.com/Files/jht/MyScreenSnap.zip的基礎(chǔ)上,

    ?? * 修改了一下主界面,增加圖片保存為BMP,GIF,JPG,PNG格式的功能

    ?? * 參考了千里冰封的代碼,加上了調(diào)整選擇區(qū)域的功能

    Source Code已經(jīng)包含在壓縮包里面了,有興趣的可以down下來(lái)改改。

    下面是1.0版本和2.0版本的兩個(gè)界面。

    1.0vs2.0.png
    posted @ 2008-07-02 09:17 jht 閱讀(331) | 評(píng)論 (1)編輯 收藏
    其實(shí)是個(gè)簡(jiǎn)單的小問(wèn)題,僅在此做個(gè)記錄。

    遇到這個(gè)問(wèn)題的不妨讀一下這篇文章先:Access查詢和過(guò)濾條件 http://www.fontstuff.com/access/acctut06.htm

    我遇到的報(bào)錯(cuò)語(yǔ)句如下:

    update?monitor_table?set?logoffTime?='2008-04-06?16:58:54',?keyClickCount?='17'?where?userName?='abcd'?and?logonTime?='2008-04-06?16:56:36'?

    讀了上面的文章,知道 MS Access的時(shí)間分隔符號(hào)為 # ,而 MS SQL Server的時(shí)間分隔符為 '

    所以正確的語(yǔ)句應(yīng)該是:

    update?monitor_table?set?logoffTime?='2008-04-06?16:58:54',?keyClickCount?='17'?where?userName?='abcd'?and?logonTime?=#2008-04-06?16:56:36#?

    posted @ 2008-05-19 15:39 jht 閱讀(1912) | 評(píng)論 (1)編輯 收藏
    http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96616/arxml24.htm
    posted @ 2008-05-19 15:38 jht 閱讀(192) | 評(píng)論 (0)編輯 收藏
    如題,有人真的遇到過(guò)這個(gè)問(wèn)題,開(kāi)始被問(wèn)到的時(shí)候還真覺(jué)得奇怪,心想不會(huì)啊,從JDK5開(kāi)始就支持這個(gè)枚舉類型了啊,為什么呢?

    開(kāi)始還懷疑他的JDK版本太低導(dǎo)致的,但是一看是JDK1.6的,迷惑了幾秒。。。

    然后我打開(kāi)了Eclipse的Java編譯選項(xiàng),發(fā)現(xiàn)原來(lái)遇到這個(gè)問(wèn)題的人的Java編譯級(jí)別設(shè)置的是1.4,如下圖,當(dāng)然就會(huì)出問(wèn)題了。

    compile_setting.png

    呵呵,雖然,這是個(gè)小問(wèn)題,但是如果遇到了還真夠新手郁悶一陣的。
    posted @ 2008-04-02 20:56 jht 閱讀(899) | 評(píng)論 (2)編輯 收藏

    作者簡(jiǎn)介

    徐皓,北京航空航天大學(xué)計(jì)算機(jī)系本科生,你可以通過(guò)ertri@163.com與他聯(lián)系。

    正文

    不靈敏的圖形用戶界面會(huì)降低應(yīng)用程序的可用性。當(dāng)以下現(xiàn)象出現(xiàn)的時(shí)候,我們通常說(shuō)這個(gè)用戶界面反應(yīng)不靈敏。

    1. 不響應(yīng)事件的現(xiàn)象;
    2. 沒(méi)有更新的現(xiàn)象
    [@more@]

    這些現(xiàn)象在很大程度上與事件的處理方法相關(guān),而在編寫Swing應(yīng)用程序的時(shí)候,我們幾乎必然要編寫方法去響應(yīng)鼠標(biāo)點(diǎn)擊按鈕,鍵盤回車等事件。在這些方法中我們要編寫一些代碼,在運(yùn)行時(shí)去觸發(fā)一些動(dòng)作。常見(jiàn)動(dòng)作包括查找,更新數(shù)據(jù)庫(kù)等。在這篇文章中通過(guò)對(duì)一個(gè)實(shí)例的分析,介紹了一些基本概念,常見(jiàn)的錯(cuò)誤以及提出了一個(gè)解決方案。

    event-dispatching thread

    我們一定要記住,事件響應(yīng)方法的代碼都是在event-dispatching thread中執(zhí)行的,除非你啟用另一個(gè)線程。

    那么,什么是event-dispatching thread呢?在《Java Tutorial》[1]中,作者給出了一條單一線程規(guī)則:一旦一個(gè)Swing組件被實(shí)現(xiàn)(realized),所有的有可能影響或依賴于這個(gè)組件的狀態(tài)的代碼都應(yīng)該在event-dispatching thread中被執(zhí)行。而實(shí)現(xiàn)一個(gè)組件有兩種方式:

    1. 對(duì)頂層組件調(diào)用show(), pack(), 或者setVisible(true);
    2. 將一個(gè)組件加到一個(gè)已經(jīng)被實(shí)現(xiàn)的容器中。

    單一線程規(guī)則的根源是由于Swing組件庫(kù)的大部分方法是對(duì)多線程不安全的,盡管存在一些例外。這些例外的情況可以在《Java Tutorial》[1]的相關(guān)章節(jié)找到,這里不再展開(kāi)。

    為了支持單一線程模型,Swing組件庫(kù)提供了一個(gè)專門來(lái)完成這些與Swing組件相關(guān)的操作的線程,而這一線程就是event-dispatching thread。我們的事件響應(yīng)方法通常都是由這一線程調(diào)用的,除非你自己編寫代碼來(lái)調(diào)用這些事件響應(yīng)方法。在這里初學(xué)者經(jīng)常犯的一個(gè)錯(cuò)誤就是在事件響應(yīng)方法中完成過(guò)多的與修改組件沒(méi)有直接聯(lián)系的代碼。其最有可能的效果就是導(dǎo)致組件反應(yīng)緩慢。比如以下響應(yīng)按鈕事件的代碼:

    String str = null;
    this.textArea.setText("Please wait...");
    try {
    //do something that is really time consuming
    str = "Hello, world!";
    Thread.sleep(1000L);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    this.textArea.setText(str); ? ?

    執(zhí)行之后的效果就是按鈕似乎定住了一段時(shí)間,直到Done.出現(xiàn)之后才彈起來(lái)。原因就是Swing組件的更新和事件的響應(yīng)都是在event-dispatching thread中完成的,而事件響應(yīng)的時(shí)候,event-dispatching thread被事件響應(yīng)方法占據(jù),所以組件不會(huì)被更新。而直到事件響應(yīng)方法退出時(shí)才有可能去更新Swing組件。

    為了解決這個(gè)問(wèn)題,有人也許會(huì)試圖通過(guò)調(diào)用repaint()方法來(lái)更新組件:

    final String[] str = new String[1];
    this.jTextArea1.setText("Please wait...");
    this.repaint();

    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    str[0] = "Done.";

    jTextArea1.setText(str[0]);

    但是這一個(gè)方法沒(méi)有起到預(yù)期的作用,按鈕仍然定住一段時(shí)間,在察看了repaint()方法的源代碼之后就知道原因了。

    PaintEvent e = new PaintEvent(this, PaintEvent.UPDATE,
    new Rectangle(x, y, width, height));
    Toolkit.getEventQueue().postEvent(e); ? ? ? ?

    repaint()方法實(shí)際上是在事件隊(duì)列里加了一個(gè)UPDATE的事件,而沒(méi)有直接去重畫組件,而且這一個(gè)事件只能等待當(dāng)前的事件響應(yīng)方法結(jié)束之后才能被分配。因此只有繞過(guò)分配機(jī)制直接調(diào)用paint方法才能達(dá)到目的。

    final String[] str = new String[1];
    this.jTextArea1.setText("Please wait...");
    this.paint(this.getGraphics());

    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    str[0] = "Done.";

    jTextArea1.setText(str[0]);

    這樣卻是實(shí)現(xiàn)了更新,但是還存在著以下的問(wèn)題。雖然從感覺(jué)上,按鈕已經(jīng)彈起來(lái)了,但是在Done.出現(xiàn)之前,我們卻無(wú)法按下這個(gè)按鈕。可以說(shuō)按鈕還是定住了,只不過(guò)定在了彈起的狀態(tài)。調(diào)用重繪方法無(wú)法從根本上解決問(wèn)題,因此我們需要尋求其他的方法。

    使用多線程

    有效的解決方法是使用多線程。首先看一看一個(gè)更好的解決方案,這一方案是在參考《Rethinking Swing Threading》[3]的一個(gè)程序片段完成的:

    final String[] str = new String[1];
    this.jTextArea1.setText("Please wait...");
    this.repaint();

    new Thread() {
    public void run() {
    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    str[0] = "Done.";
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    jTextArea1.setText(str[0]);
    }
    });
    }
    }.start();

    在這個(gè)程序中,要花費(fèi)大量時(shí)間的操作被放到另一個(gè)線程當(dāng)中,從而使事件響應(yīng)方法能快速返回,event-dispatching thread就可以更新UI和響應(yīng)其它事件了。注意到這個(gè)程序使用了invokeLater()方法。invokeLater()方法的作用是讓event-dispatching thread去運(yùn)行制定的代碼。當(dāng)然也可以不使用invokeLater()方法,但是這樣就違背了單一線程原則,同時(shí)帶來(lái)了一定程度的相對(duì)多線程的不安全性。到現(xiàn)在,解決方案似乎是完美的了,但是我們看一看在原來(lái)的程序添加下面的代碼,盡管我們通常不這樣做。

    public void paint(java.awt.Graphics g) {
    super.paint(g);
    g.drawRect(1, 1, 100, 100);
    }

    我們會(huì)發(fā)現(xiàn)以前畫的矩形被覆蓋了一部分,原因是由于我們沒(méi)用重畫這一個(gè)矩形,因此在結(jié)尾加上對(duì)repaint()方法的調(diào)用。

    final String[] str = new String[1];
    this.jTextArea1.setText("Please wait...");
    this.repaint();

    new Thread() {
    public void run() {
    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    str[0] = "Done.";
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    jTextArea1.setText(str[0]);
    repaint();
    }
    });
    }
    }.start();

    如果你認(rèn)為這段代碼過(guò)于缺乏可讀性,通過(guò)在《Java Tutorial》[1]里面介紹的SwingWorker來(lái)簡(jiǎn)化編程的方法。可以通過(guò)實(shí)現(xiàn)一個(gè)construct()方法來(lái)實(shí)現(xiàn)花費(fèi)大量時(shí)間的操作和重寫finished()方法來(lái)完成組件更新的工作。

    this.jTextArea1.setText("Please wait...");

    final SwingWorker worker = new SwingWorker() {
    public Object construct() {
    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    return "Done.";
    }
    public void finished() {
    jTextArea1.setText(getValue().toString());
    repaint();
    }
    };
    worker.start();

    在《Rethinking Swing Threading》[3],作者將以上的編程方式稱為同步方式。另外作者提出了一個(gè)通過(guò)消息機(jī)制來(lái)實(shí)現(xiàn)相同功能的更清晰,但是需要編寫更多代碼的"異步"的方法。

    結(jié)論

    總之,我們?cè)诰帉懯褂肧wing組件的程序是要記住以下幾點(diǎn):

    1、不要過(guò)多地占用event-dispatching thread;

    2、與更新組件相關(guān)的代碼要使用event-dispatching thread去執(zhí)行;

    3、要更新組件。

    編寫反應(yīng)靈敏的圖形用戶界面還需要考慮很多問(wèn)題,以上只是最基本的一部分。歡迎有興趣的讀者來(lái)信進(jìn)行討論。

    posted @ 2008-03-13 17:53 jht 閱讀(574) | 評(píng)論 (0)編輯 收藏

    打開(kāi)注冊(cè)表編輯器,進(jìn)入主鍵[HKEY_CURRENT_USER\Software\Microsoft\Command Processor],將“CompletionChar”鍵值設(shè)置為9。  

    posted @ 2008-01-30 16:40 jht 閱讀(708) | 評(píng)論 (0)編輯 收藏
    在Struts中我們用html:errors標(biāo)簽在JSP頁(yè)面上輸出驗(yàn)證過(guò)程中產(chǎn)生的錯(cuò)誤信息,錯(cuò)誤信息一般來(lái)自于消息資源文件(xxx.properties文件,一般位于classes目錄下,文本文件),當(dāng)然錯(cuò)誤信息也可以是不是資源文件中的文本消息,而是自定義的文本。接下來(lái)將詳細(xì)講述。

      先來(lái)看一個(gè)簡(jiǎn)單例子

    1、資源文件錯(cuò)誤信息來(lái)源(其格式為 key = value )
    ???
    ?? error.test = this is a test error.

    2、JSP頁(yè)面中用于顯示錯(cuò)誤信息標(biāo)簽
    ??
    ?? <html:errors property="testerror"/>

    3、ActionFormBean的validate()方法中產(chǎn)生錯(cuò)誤信息

    ?? ActionErrors error = new ActionErrors();

    ?? error.add("testerror",new ActionMessage("error.test"))
    ??
    ?? return error;

    ?

      這個(gè)例子的功能就是在ActionForm Bean的validate()方法中產(chǎn)生一條名為:testerror的錯(cuò)誤信息,錯(cuò)誤信息息是資源文件中key為error.test的值。然后在頁(yè)面上用html:errors標(biāo)簽輸出testerror這條錯(cuò)誤信息。

      這是最常用的一種功能,所有的錯(cuò)誤信息都在資源文件里面。

      有人會(huì)問(wèn),錯(cuò)誤信息只能存放在資源文件中嗎,其實(shí)不是這樣。不需要資源文件也可以產(chǎn)生錯(cuò)誤信息

      我們?cè)賮?lái)看一下ActionMessage的另一種構(gòu)造方法:

      ActionMessage(String key,boolean isresource)

      如果isresource值為true,則表示key是資源文件中的key,產(chǎn)生的消息就是與key相對(duì)應(yīng)的消息
      如果isresource值為false,則表示key為一條普通的消息。

      如果上面的error.add改為error.add("testerror",new ActonMessage("這是一條自定義消息",false",));那么頁(yè)面上顯示的將是:這是一條自定義消息.


      另外還可以用ActionMessage產(chǎn)生復(fù)合消息,比如我們要輸出:xxx不能用作用戶名,其中xxx是一個(gè)變量。

      首先我們?cè)谫Y源文件中加一個(gè)條復(fù)合消息

      testmsg = {0}不能用作用戶名。這里{0}是要被替換的參數(shù)。

      我們?cè)賮?lái)看一下ActionMessage的另一中構(gòu)造方法
      ActionMessage(String key,Object value0);

      也就是說(shuō)用value0的值來(lái)替換{0}

      我們修改error.add為error.add("testerror",new ActonMessage("testmsg","毛澤東"))

      那么JSP頁(yè)面上將顯示:毛澤東不能用作用戶名。


      當(dāng)然在一條復(fù)合消息中也可帶多個(gè)參數(shù),參數(shù)依次為{0},{1},{2}或更多
      例如:loginUser = 用戶名:{0} 姓名:{1} 登錄次數(shù):{2}.....
      那么在產(chǎn)生錯(cuò)誤消息時(shí)就用new ActionMessage(String key,Object value0,Object value1,Object? value2.....)或者使用對(duì)象數(shù)組new ActionMessage(String key,Object[] values)
      

      String[] detail = {"Admin","王晶","12"};
      error.add("testerror",new ActionMessage("loginUser",detail))


    Note:

    Cannot find message resources under key org.apache.struts.action.MESSAGE? 錯(cuò)誤的原因是沒(méi)有配置資源文件

    解決辦法: 在struts-config.xml 中加入如下的一段

    <message-resources parameter="application" null="false"></message-resources>


    posted @ 2008-01-14 22:20 jht 閱讀(1150) | 評(píng)論 (1)編輯 收藏

    備忘:

    >?sqlplus?( < username > [/ < password > ][@ < connect_identifier > ]?|?/)?[AS?SYSDBA?|?AS?SYSOPER]?|?/NOLOG
    ?SQL? > ??? desc ??user_source;
    ?Name???????????????????????????????????????
    Null ??????Type
    ??
    -- ?---------------------------------------?--------?----------------------------?
    ??NAME???????????????????????????????????????????????? VARCHAR2 ?(? 30 ?)
    ?TYPE????????????????????????????????????????????????
    VARCHAR2 ?(? 12 ?)
    ?LINE????????????????????????????????????????????????
    NUMBER ?
    ??
    TEXT ????????????????????????????????????????????????? VARCHAR2 ?(? 4000 ?)

    SQL?
    > ??? select ??? TEXT ??? from ??user_source?? where ??TYPE? = ? ' ?PROCEDURE? ' ??? and ??NAME? = ? ' ?Your_Procedure_name? ' ?;

    no?rows?selected

    SQL?
    > ?? var ?out_var? number
    exec ?Your_Procedure_name?( '' , '' , '' ,:out_var)
    print ?out_var

    posted @ 2007-11-28 14:00 jht 閱讀(2739) | 評(píng)論 (0)編輯 收藏
    ct protect -r -chmod 775 directory-or-file-name #Set directory/file/element protection.
    posted @ 2007-11-06 12:07 jht 閱讀(563) | 評(píng)論 (0)編輯 收藏

    問(wèn)題,向腳步傳遞參數(shù)的時(shí)候如何取得一個(gè)一個(gè)的option

    辦法一: 就是一個(gè)一個(gè)讀 用$#取得變量個(gè)數(shù),然后讀$1 $2 $3,不是很方便

    查了一下命令手冊(cè):發(fā)現(xiàn)用getopts命令更方便,man page不是很好懂

    直接看 Example.sh:

    # !/ bin / sh

    while ?getopts?'a:b:c'?myoption
    ????
    do
    ????
    case ?$myoption? in
    ????????a)?ls?
    - al
    ????????;;????
    ????????b)?ls?
    - l?$OPTARG????
    ????????;;
    ????????c)?ls?
    - l????
    ????esac
    ????done


    用法和效果:
    Example.sh -a stringa
    就會(huì)執(zhí)行 ls -al 這個(gè)命令, stringa 其實(shí)不起左右,但是這個(gè)參數(shù)還是要的

    Example.sh -b -lrt
    那就會(huì)執(zhí)行 ls -l -lrt 傳進(jìn)去的參數(shù)起作用了

    當(dāng)然也可以這樣
    Example.sh -a 123 -b -lrt z, 這個(gè)作用就是兩個(gè)命令都執(zhí)行了


    可以用變量保存這些OPTARG參數(shù),在while循環(huán)外面接著使用

    posted @ 2007-10-30 14:46 jht 閱讀(2195) | 評(píng)論 (0)編輯 收藏
    Hibernate 提供了一個(gè)hibernate.properties的模板,稍加修改就能得到自己想要的配置效果

    下面這一段XML配置文件中關(guān)于數(shù)據(jù)庫(kù)連接方式的配置,可以在hibernate.properties中完成
    <?xml?version="1.0"?encoding="UTF-8"?>
    <!DOCTYPE?hibernate-configuration?PUBLIC
    ????????"-//Hibernate/Hibernate?Configuration?DTD?3.0//EN"
    ????????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
    >
    <hibernate-configuration>
    ????
    <session-factory?name="sf">
    ????
    <!--?
    ????????<property?name="hibernate.connection.driver_class">
    ????????????org.hsqldb.jdbcDriver
    ????????</property>
    ????????<property?name="hibernate.connection.url">
    ????????????jdbc:hsqldb:hsql://localhost/HibernateMapping
    ????????</property>
    ????????<property?name="hibernate.connection.username">sa</property>
    ????????<property?name="hibernate.dialect">
    ????????????org.hibernate.dialect.HSQLDialect
    ????????</property>
    ?????
    -->
    ????????
    <mapping?package="cn.heapstack.models"?/>
    ????????
    <mapping?class="cn.heapstack.models.User"?/>
    ????????
    <mapping?class="cn.heapstack.models.UserInfo"?/>
    ????
    </session-factory>

    ????
    </hibernate-configuration>
    ##?HypersonicSQL
    #$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    hibernate.dialect?org.hibernate.dialect.HSQLDialect
    hibernate.connection.driver_class?org.hsqldb.jdbcDriver
    hibernate.connection.username?sa
    hibernate.connection.password
    hibernate.connection.url?jdbc:hsqldb:hsql://localhost/HibernateMapping
    #$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$



    代碼示例:
    Configuration?cfg?=?new?AnnotationConfiguration().configure("./hibernate.cfg.xml");
    SessionFactory?sf?
    =?cfg.buildSessionFactory();
    Session?session?
    =?sf.openSession();
    org.hibernate.Transaction?tx
    =?session.beginTransaction();
    tx.commit();
    session.close();
    posted @ 2007-10-26 14:40 jht 閱讀(297) | 評(píng)論 (1)編輯 收藏
    主站蜘蛛池模板: 亚洲av无码专区在线电影| 美女羞羞喷液视频免费| 日韩亚洲综合精品国产| 丰满人妻一区二区三区免费视频| 91青青青国产在观免费影视| 日本免费中文字幕在线看| 中文亚洲AV片不卡在线观看| 亚洲AV无码精品蜜桃| 一级成人毛片免费观看| 黄色网址免费观看| 精品国产日韩亚洲一区| tom影院亚洲国产一区二区| v片免费在线观看| 在线永久看片免费的视频| 亚洲精品无码成人片在线观看| 亚洲天堂电影在线观看| 又粗又长又爽又长黄免费视频 | 国产免费的野战视频| 亚洲国产中文v高清在线观看| 亚洲天堂电影在线观看| 97国免费在线视频| 在线永久免费观看黄网站| 久久精品国产亚洲av日韩| 一级看片免费视频囗交| 成人午夜免费福利| 久久精品九九亚洲精品| 中国国语毛片免费观看视频| 日本无卡码免费一区二区三区| 久久久久亚洲AV无码永不| 一级一黄在线观看视频免费| 女人毛片a级大学毛片免费| 亚洲黄色在线观看网站| 91视频免费网站| 亚洲AV无码一区二区三区国产| 亚洲视频一区二区三区四区| 免费国产成人午夜在线观看| 国产成人亚洲精品91专区手机| 国产亚洲视频在线观看| 成年女人午夜毛片免费看| 亚洲性69影院在线观看| 久久久久国产精品免费看|