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

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

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

    如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

    CowNew開源團(tuán)隊(duì)

    http://www.cownew.com 郵件請聯(lián)系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

    #

         摘要: 下面的例子中第一個進(jìn)度條是一個“確定模式”的滾動條,進(jìn)度中顯示了當(dāng)前的工作完成百分比,第二個進(jìn)度條可以通過按鈕切換“不確定模式”與“確定模式”: package com.cownew.Char19; import java.awt.Rectangle; import javax.swing.JButton; impor...  閱讀全文
    posted @ 2007-05-30 20:18 CowNew開源團(tuán)隊(duì) 閱讀(2849) | 評論 (3)編輯 收藏

        王開源的事情已經(jīng)過去一段時間了,看過太多對這件事情的評論,這些評論或者是口出污言穢語的謾罵或者是狂熱的非理性的力挺(在這件事的初期屬于后者)。很多人對開源的評論也使得我這個投身于開源一年多的新人感到過迷茫。這件事過去好久,我一直在思索一個問題:開源在目前中國的意義究竟是什么,開源在中國這種大環(huán)境下究竟應(yīng)該如何發(fā)展。
        開源在國外現(xiàn)在是火的一塌糊涂,Linux、Eclipse、Hibernate、Spring、Python、Ruby、MySQL等等或大或小的開源產(chǎn)品的發(fā)展大大推動了軟件開發(fā)這個行業(yè)的高速發(fā)展,apache、sourceforge等開源社區(qū)中也是百花齊放,開源產(chǎn)品的開發(fā)者、推動者、推廣者也得到了各自想得到的回報(bào),更不用說使用這些開源產(chǎn)品進(jìn)行開發(fā)的用戶得到的開發(fā)效率的提升。反觀國內(nèi)開源的發(fā)展則相對滯后很多:違背Linux開源協(xié)議進(jìn)行商業(yè)化Linux開發(fā)的廠家被開源社區(qū)罵的狗血噴頭;屈指可數(shù)的幾個開源愛好者組織的開源團(tuán)隊(duì)在個人的意志與信念的堅(jiān)守下苦苦支撐著,很多因?yàn)榉N種原因中途夭折;商業(yè)公司對開源社區(qū)的幾次推廣行動也胎死腹中,比如CSDN的開源社區(qū)、Apusic的Operamasks;更有甚者打著開源的旗號卻從事著根本與開源不搭邊的事情。國內(nèi)大部分人對開源更是有著很深的誤解:“你憑什么叫人家開源,不就是想看看Windows的代碼嗎?”、“人家商業(yè)公司做出來的產(chǎn)品是你們幾個技術(shù)瘋子做出來的東西能比的嗎?”、“把別人寫好的東西拿來抄一抄改一改我的任務(wù)就完成了,錢就到手了,開源真好”、“我做的項(xiàng)目用了很多開源的東西,很牛吧!”。
        我認(rèn)為開源對于整個軟件行業(yè)有如下幾個作用:使用開源產(chǎn)品搭建出的產(chǎn)品有更好的安全性和可控性;開源的產(chǎn)品能得到開發(fā)社區(qū)的廣泛支持,從而使得產(chǎn)品能夠成熟的更快;使用開源產(chǎn)品搭建出的產(chǎn)品有更好的安全性和可控性;開發(fā)、學(xué)習(xí)開源產(chǎn)品能夠提升開發(fā)人員的技術(shù)水平。
        對于第一個作用這里不做過多解釋,相信大部分人都能理解。
        開源產(chǎn)品是在全世界所有技術(shù)牛人的手下開發(fā)出來的,并且有千萬雙眼睛盯著它,眾多的使用者可以完善它,這使得開源產(chǎn)品的成熟速度也十分驚人,Linux、Eclipse的成熟就是最典型的證明。各種開源產(chǎn)品層出不窮,相似功能的產(chǎn)品就有幾十種甚至上百種,一個開源產(chǎn)品如果想要在這些產(chǎn)品中脫穎而出,不僅需要強(qiáng)大的技術(shù)做支撐,更需要非常強(qiáng)的商業(yè)化推廣,否則做出來的產(chǎn)品只能成為少數(shù)技術(shù)人員把玩的玩物。如果沒有IBM對Eclipse的巨額投入,Eclipse會發(fā)展成現(xiàn)在的規(guī)模嗎?這些開源項(xiàng)目的后面通常都是有一個非常強(qiáng)大的開源基金會在做支撐。遺憾的是,目前國內(nèi)還沒有一家公司能夠進(jìn)行對開源社區(qū)如此大的投入,因此國內(nèi)大部分的開源團(tuán)隊(duì)都是在自己開發(fā)著自己的開源產(chǎn)品,放到網(wǎng)站上供他人下載,然后夢想著自己的開源產(chǎn)品能夠有一天會像Hibernate、Struts一樣成為風(fēng)靡全球的產(chǎn)品,但是如果沒有強(qiáng)大的商業(yè)推廣的話這肯定是一場白日夢。
        鑒于此,我認(rèn)為目前國內(nèi)的開源產(chǎn)品商業(yè)化的可能性是非常小的,因此開源的對于廣大開發(fā)人員的意義更多的在于使用和學(xué)習(xí),而且我們使用開源產(chǎn)品快速的搭建出滿足需求的產(chǎn)品,這本身也是對開源的學(xué)習(xí)過程。這里提到的“學(xué)習(xí)”包含下面幾個含義:學(xué)習(xí)開源產(chǎn)品的使用;學(xué)習(xí)開源產(chǎn)品的實(shí)現(xiàn)原理;學(xué)習(xí)模仿開源產(chǎn)品;學(xué)習(xí)開源社區(qū)的運(yùn)營。
        (1)學(xué)習(xí)開源產(chǎn)品的使用:成熟的開源產(chǎn)品是非常優(yōu)秀的,如果能夠?qū)W會它們的使用,這對于開源人員來說就是一種很大的收獲,因?yàn)橥ㄟ^使用這些產(chǎn)品就能認(rèn)識到這些產(chǎn)品的功能、特性以及優(yōu)缺點(diǎn)。
        (2)學(xué)習(xí)開源產(chǎn)品的實(shí)現(xiàn)原理:開源產(chǎn)品的代碼都是開放的,我們可以深入產(chǎn)品的內(nèi)部學(xué)習(xí)其實(shí)現(xiàn)原理,從而提高自身的開發(fā)水平。不得不承認(rèn)的是國內(nèi)開發(fā)人員的技術(shù)水平還是非常低的,通過學(xué)習(xí)開源產(chǎn)品的代碼,就可以提高整體的技術(shù)水平,從這個層面來講哪怕是非開源的源代碼開放產(chǎn)品(比如Borland的VCL)對我們也是同樣有幫助的。值得高興的是,國內(nèi)很多開發(fā)人員已經(jīng)開始嘗試著深入開源產(chǎn)品的內(nèi)部去探尋這些產(chǎn)品的實(shí)現(xiàn)原理,并把它們的學(xué)習(xí)成果與更多人分享。開源對開發(fā)人員的提升也是顯而易見的,最明顯的就是微軟開發(fā)社區(qū)中開發(fā)人員的普遍技術(shù)水平是低于Java等開源社區(qū)中開發(fā)人員的普遍技術(shù)水平的(注意,這里說的是“普遍技術(shù)水平”,請微軟社區(qū)中的高人不要動怒)。中國計(jì)算機(jī)業(yè)的發(fā)展必須依靠核心技術(shù),而提高技術(shù)水平是擁有核心技術(shù)的大前提!
        (3)學(xué)習(xí)模仿開源產(chǎn)品:弄懂了開源產(chǎn)品的實(shí)現(xiàn)原理以后就可以嘗試模仿它們開發(fā)自己的產(chǎn)品,這和“重復(fù)造輪子”是沒有關(guān)系的,模仿是學(xué)習(xí)他人技術(shù)的最佳途徑。因此大家應(yīng)該多多的“造輪子”,越多越好,哪怕造完就扔掉也是可以的。
        (4)學(xué)習(xí)開源社區(qū)的運(yùn)營:國外很多開源人員都有在開源社區(qū)中開發(fā)的經(jīng)驗(yàn),因此他們對于開源這種協(xié)同開發(fā)方式就有更多的經(jīng)驗(yàn),因此我們可以加入他們的開發(fā)團(tuán)隊(duì),可以幫他們做文檔、界面的本地化,更可以參與產(chǎn)品功能的完善,從而學(xué)習(xí)他們的協(xié)作方式,更可以和他們做朋友,了解更多“外面的世界”。國內(nèi)很多朋友都參與了開源產(chǎn)品的文檔中文化、產(chǎn)品的推廣等工作,這都是有深遠(yuǎn)意義的。我們CowNew開源團(tuán)隊(duì)參與JodeEclipse、DWPL等國外項(xiàng)目就是基于這一點(diǎn)考慮的。
         相信經(jīng)過一段時間學(xué)習(xí)之后,我們的開發(fā)人員將有能力開發(fā)出世界級的產(chǎn)品,如果我們的民族企業(yè)能夠得到長遠(yuǎn)的發(fā)展,并且在商業(yè)上幫助國產(chǎn)開源真正走向強(qiáng)大,從而使得中國的開源社區(qū)也能躋身“世界開源之林”!
        上邊是我一點(diǎn)愚蠢的看法,僅供各位看管參考。希望開源能夠在中國發(fā)展、壯大,希望中國早日成為軟件強(qiáng)國!
       
    posted @ 2007-05-20 18:08 CowNew開源團(tuán)隊(duì) 閱讀(2121) | 評論 (11)編輯 收藏

    今天要使用mysql做一個功能的實(shí)驗(yàn),但是發(fā)現(xiàn)寫進(jìn)去的中文變成了亂碼,可是數(shù)據(jù)庫的編碼都改成gbk了,而且jdbc連接字符串和my.ini的default-character-set配置項(xiàng)也改成了gbk,但是連接的時候還是亂碼,通過mysql的原生客戶端連接則不會出現(xiàn)這種情況。最終的解決方法是將所有的字符集都改成utf-8。
    用gbk、gb2312 之類的時候都可能會出現(xiàn)問題,而utf-8作為一個標(biāo)準(zhǔn)的多語言字符集則解決亂碼的終極方案。所以推薦大家在其他遇到中文的情況下也使用utf-8。
    posted @ 2007-05-19 11:59 CowNew開源團(tuán)隊(duì) 閱讀(608) | 評論 (0)編輯 收藏

    Eclipse的插件機(jī)制是個非常好的東西,架構(gòu)也非常靈活。我們開發(fā)的插件有時候需要提供一些擴(kuò)展機(jī)制,允許他人擴(kuò)展,但是如果是提供的標(biāo)準(zhǔn)的Eclipse擴(kuò)展點(diǎn)的話無疑加大了開發(fā)擴(kuò)展功能的難度,開發(fā)人員必須熟悉Eclipse插件開發(fā)才可以。在最近做的幾個IDE中,為了避免這個問題,我都采用了最原始的插件擴(kuò)展方式,也就是擴(kuò)展功能的開發(fā)人員把擴(kuò)展插件的jar包或者.class文件放到某個目錄下即可,這些擴(kuò)展功能也只需實(shí)現(xiàn)某個接口即可,由我的插件來進(jìn)行加載。這樣在擴(kuò)展功能開發(fā)人員看來,寫擴(kuò)展功能就是寫一個實(shí)現(xiàn)了某個接口的Java類,無需了解Eclipse插件開發(fā)的知識了,當(dāng)然這帶來的缺點(diǎn)就是靈活性降低了。
    posted @ 2007-05-19 00:32 CowNew開源團(tuán)隊(duì) 閱讀(534) | 評論 (0)編輯 收藏

       做系統(tǒng)設(shè)計(jì)的時候有時會碰到一些無法在父類(或者接口)中抽取通用行為的特性,遇到這種情況就可以采用StringConfigure模式,這個模式我取的名字,不知道是否已經(jīng)有先人做了總結(jié),如果哪位朋友知道這種模式的正確名稱,希望不吝賜教。
       以JDBC中取得數(shù)據(jù)庫連接為例,我們可以抽象出數(shù)據(jù)庫的一些公共行為,比如連接數(shù)據(jù)庫都要求提供用戶名和密碼,因此在JDBC中提供設(shè)定連接的用戶名和密碼的方法。但是另外的一些行為則不一定是所有數(shù)據(jù)庫都具備的,比如對于網(wǎng)絡(luò)型數(shù)據(jù)庫才需要指定網(wǎng)絡(luò)地址,而文件型數(shù)據(jù)庫則不需要,再比如在MySQL中需要指定字符集,而其他數(shù)據(jù)庫則不一定需要。如果為了照顧這些特性,為JDBC提供setHostIP、setDBFilePath、setCharSet等方法的話無疑會使得接口變得復(fù)雜,會出現(xiàn)很多用不到的方法,并且這些方法也無法覆蓋所有未來可能出現(xiàn)的情況,比如某個數(shù)據(jù)庫又增加了允許用戶定制連接超時的方法,那么JDBC也要為他提供相應(yīng)的setTimeOut方法。為了解決這個問題,JDBC提出了連接字符串的概念,這樣各個數(shù)據(jù)庫的JDBC驅(qū)動只要規(guī)定好連接字符串的格式即可,用戶把所有的配置信息寫到連接字符串中,如果用戶修改為其他數(shù)據(jù)庫的話只需修改連接字符串即可,不用修改其他的調(diào)用。
       使用StringConfigure模式的好處是使得系統(tǒng)中的個性化配置在一個參數(shù)中完成,這樣保證系統(tǒng)的不同模塊的行為的一致性,缺點(diǎn)是配置字符串的格式要由各個實(shí)現(xiàn)模塊來規(guī)定,各個不同實(shí)現(xiàn)模塊的格式不一致,造成了一定的學(xué)習(xí)成本,而且無法在開發(fā)期發(fā)現(xiàn)配置字符串的問題。
       這里再來講一個StringConfigure模式的應(yīng)用的例子。現(xiàn)在我們要開發(fā)一套對IC卡讀寫器的類庫,應(yīng)用開發(fā)人員只要調(diào)用不同的IC卡讀寫子類即可實(shí)現(xiàn)操作不同的IC卡讀寫器。各種不同的IC卡讀寫器有兩個共同的抽象行為:讀卡和寫卡,即readCard和writeCard,但是各個不同的讀卡器還有自己的特性,比如有的讀卡器需要指定采用ISO格式還是IBM格式來讀寫磁卡,有的讀卡器需要指定讀寫操作的分隔符,這些特性不是各個讀寫器共有的,因此我們采用StringConfigure模式進(jìn)行設(shè)計(jì),開發(fā)如下的接口:
    interface IICCarder
    {
      public void writeCard(String data);
      public String readCard();
      public void configure(String configStr);
    }

       比如需要指定讀寫格式的讀寫器就可以如下實(shí)現(xiàn):
    class SomeCarder implements IICarder
    {
        private FormatEnum format;
        public void writeCard(String data)
        {
           if(format==FormatEnum.IBM)
           {
                 .........
           }
           else...........
        }
        public String readCard()
        {.............
        }
        public void configure(String configStr)
        {
            if(configStr.equls("IBM"))
            {
               format=FormatEnum.IBM
            }
            else if(configStr.equls("ISO"))
            {
               format=FormatEnum.ISO
            }
        }
    }

    開發(fā)人員使用的時候只要如下調(diào)用
    IICarder c = new SomeCarder();
    c.configure("IBM");
    print c.readCard();
    如果采用配置文件的話更可以把配置參數(shù)寫到配置文件中,這樣就可以避免修改代碼。

    posted @ 2007-05-19 00:22 CowNew開源團(tuán)隊(duì) 閱讀(1145) | 評論 (2)編輯 收藏

    CowNew 成為JodeEclipse的管理員,今后JodeEclipse以后將會由CowNew來進(jìn)行維護(hù),對于JodeEclipse有哪些需求,可以在這里提出。預(yù)計(jì)近期為jode eclipse增加調(diào)試和批量反編譯的功能。有興趣的朋友也可以加入開發(fā)隊(duì)伍。

    JodeEclipse的網(wǎng)站:http://sourceforge.net/projects/jodeeclipse
    posted @ 2007-05-17 19:16 CowNew開源團(tuán)隊(duì) 閱讀(385) | 評論 (2)編輯 收藏

    最近在和technoetic的Steve Bate接觸,已經(jīng)達(dá)成初步的合作意向,technoetic將會接收jode eclipse的管理權(quán),以后將會由CowNew來進(jìn)行jode eclipse的bug修復(fù)和新功能添加,預(yù)計(jì)近期為jode eclipse增加調(diào)試和批量反編譯的功能。此外計(jì)劃為cownewstudio增加生成DDL的功能。有興趣的隊(duì)友可以來領(lǐng)任務(wù)。
    posted @ 2007-05-14 22:26 CowNew開源團(tuán)隊(duì) 閱讀(321) | 評論 (1)編輯 收藏

    Jodeclipse 是Jode的Eclipse插件,是一個非常好的反編譯插件,不過Jodeclipse 在eclipse3.2上有bug,每次反編譯的時候都會報(bào)一個錯誤,雖然不影響反編譯結(jié)果,但是非常影響使用。因此我從Jodeclipse 的CVS上CheckOut出了代碼,做了修復(fù),編譯以后的二進(jìn)制包從此處下載:
    http://www.tkk7.com/Files/huanzhugege/net.sourceforge.jode_1.0.5.rar

    安裝方法:
    直接解壓到eclipse的plugins目錄下。

    已經(jīng)將修改后的代碼提交給jodeclipse的管理員。
    開源萬歲!!!
    posted @ 2007-05-13 17:05 CowNew開源團(tuán)隊(duì) 閱讀(8705) | 評論 (16)編輯 收藏

     

    下面的代碼就演示了為JTextArea、JList增加滾動條的代碼:

    package com.cownew.Char19;

    import javax.swing.SwingUtilities;

    import java.awt.BorderLayout;

    import javax.swing.DefaultListModel;

    import javax.swing.JPanel;

    import javax.swing.JFrame;

    import javax.swing.JTextArea;

    import javax.swing.ListModel;

    import java.awt.Rectangle;

    import javax.swing.JList;

    import javax.swing.JScrollPane;

    public class ScrollPaneTest1 extends JFrame

    {

    private JPanel jContentPane = null;

    private JTextArea jTextArea = null;

    private JList jList = null;

    private JScrollPane jScrollPane = null;

    private JScrollPane jScrollPane1 = null;

    private JList jList1 = null;

    private JTextArea jTextArea1 = null;

    private JTextArea getJTextArea()

    {

    if (jTextArea == null)

    {

    jTextArea = new JTextArea();

    jTextArea.setBounds(new Rectangle(12, 7, 95, 71));

    }

    return jTextArea;

    }

    private JList getJList()

    {

    if (jList == null)

    {

    jList = new JList();

    jList.setBounds(new Rectangle(8, 92, 106, 71));

    DefaultListModel listModel = new DefaultListModel();

    listModel.addElement("22222");

    listModel.addElement("33333333");

    listModel.addElement("55555555555555");

    listModel.addElement("8888888888");

    listModel.addElement("88888888");

    listModel.addElement("999999999");

    jList.setModel(listModel);

    }

    return jList;

    }

    private JScrollPane getJScrollPane()

    {

    if (jScrollPane == null)

    {

    jScrollPane = new JScrollPane();

    jScrollPane.setBounds(new Rectangle(143, 7, 122, 75));

    jScrollPane.setViewportView(getJTextArea1());

    }

    return jScrollPane;

    }

    private JScrollPane getJScrollPane1()

    {

    if (jScrollPane1 == null)

    {

    jScrollPane1 = new JScrollPane();

    jScrollPane1.setBounds(new Rectangle(142, 96, 128, 68));

    jScrollPane1.setViewportView(getJList1());

    }

    return jScrollPane1;

    }

    private JList getJList1()

    {

    if (jList1 == null)

    {

    jList1 = new JList();

    DefaultListModel listModel = new DefaultListModel();

    listModel.addElement("22222");

    listModel.addElement("33333333");

    listModel.addElement("8888888888888888888888888888");

    listModel.addElement("8888888888");

    listModel.addElement("88888888");

    listModel.addElement("999999999");

    jList1.setModel(listModel);

    }

    return jList1;

    }

    private JTextArea getJTextArea1()

    {

    if (jTextArea1 == null)

    {

    jTextArea1 = new JTextArea();

    }

    return jTextArea1;

    }

    public static void main(String[] args)

    {

    SwingUtilities.invokeLater(new Runnable() {

    public void run()

    {

    ScrollPaneTest1 thisClass = new ScrollPaneTest1();

    thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    thisClass.setVisible(true);

    }

    });

    }

    public ScrollPaneTest1()

    {

    super();

    initialize();

    }

    private void initialize()

    {

    this.setSize(300, 200);

    this.setContentPane(getJContentPane());

    this.setTitle("JFrame");

    }

    private JPanel getJContentPane()

    {

    if (jContentPane == null)

    {

    jContentPane = new JPanel();

    jContentPane.setLayout(null);

    jContentPane.add(getJTextArea(), null);

    jContentPane.add(getJList(), null);

    jContentPane.add(getJScrollPane(), null);

    jContentPane.add(getJScrollPane1(), null);

    }

    return jContentPane;

    }

    }

    運(yùn)行效果圖:

    圖 17.9

    JScrollPane還能為組合界面增加滾動條:

    package com.cownew.Char19;

    import java.awt.Dimension;

    import java.awt.Rectangle;

    import javax.swing.JButton;

    import javax.swing.JCheckBox;

    import javax.swing.JFrame;

    import javax.swing.JPanel;

    import javax.swing.JScrollPane;

    import javax.swing.JSlider;

    import javax.swing.JTextField;

    import javax.swing.SwingUtilities;

    public class ScrollPaneTest2 extends JFrame

    {

    private JPanel jContentPane = null;

    private JScrollPane jScrollPane = null;

    private JPanel jPanel = null;

    private JButton jButton = null;

    private JButton jButton1 = null;

    private JCheckBox jCheckBox = null;

    private JTextField jTextField = null;

    private JSlider jSlider = null;

    private JScrollPane getJScrollPane()

    {

    if (jScrollPane == null)

    {

    jScrollPane = new JScrollPane();

    jScrollPane.setBounds(new Rectangle(28, 17, 142, 114));

    jScrollPane.setViewportView(getJPanel());

    }

    return jScrollPane;

    }

    private JPanel getJPanel()

    {

    if (jPanel == null)

    {

    jPanel = new JPanel();

    jPanel.setLayout(null);

    jPanel.add(getJButton(), null);

    jPanel.add(getJButton1(), null);

    jPanel.add(getJCheckBox(), null);

    jPanel.add(getJTextField(), null);

    jPanel.add(getJSlider(), null);

    jPanel.setPreferredSize(new Dimension(300,200));

    }

    return jPanel;

    }

    private JButton getJButton()

    {

    if (jButton == null)

    {

    jButton = new JButton();

    jButton.setBounds(new Rectangle(6, 10, 74, 28));

    }

    return jButton;

    }

    private JButton getJButton1()

    {

    if (jButton1 == null)

    {

    jButton1 = new JButton();

    jButton1.setBounds(new Rectangle(102, 9, 82, 30));

    }

    return jButton1;

    }

    private JCheckBox getJCheckBox()

    {

    if (jCheckBox == null)

    {

    jCheckBox = new JCheckBox();

    jCheckBox.setBounds(new Rectangle(17, 56, 93, 21));

    jCheckBox.setText("aaaaabbb");

    }

    return jCheckBox;

    }

    private JTextField getJTextField()

    {

    if (jTextField == null)

    {

    jTextField = new JTextField();

    jTextField.setBounds(new Rectangle(126, 57, 99, 22));

    }

    return jTextField;

    }

    private JSlider getJSlider()

    {

    if (jSlider == null)

    {

    jSlider = new JSlider();

    jSlider.setBounds(new Rectangle(20, 111, 205, 25));

    }

    return jSlider;

    }

    public static void main(String[] args)

    {

    SwingUtilities.invokeLater(new Runnable() {

    public void run()

    {

    ScrollPaneTest2 thisClass = new ScrollPaneTest2();

    thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    thisClass.setVisible(true);

    }

    });

    }

    public ScrollPaneTest2()

    {

    super();

    initialize();

    }

    private void initialize()

    {

    this.setSize(221, 177);

    this.setContentPane(getJContentPane());

    this.setTitle("JFrame");

    }

    private JPanel getJContentPane()

    {

    if (jContentPane == null)

    {

    jContentPane = new JPanel();

    jContentPane.setLayout(null);

    jContentPane.add(getJScrollPane(), null);

    }

    return jContentPane;

    }

    }

    運(yùn)行效果圖:

    圖 17.10

    對于這種組合界面必須為界面設(shè)定一個最佳尺寸(PreferredSize),這樣JScrollPane才知道如何顯示滾動條:jPanel.setPreferredSize(new Dimension(300,200))。

    JScrollPane中的ViewPort是一種特殊的對象,通過它就可以查看基層組件,滾動條其實(shí)就是沿著組件移動“視點(diǎn)”,這樣就可以查看隱藏的部分。

    posted @ 2007-04-29 12:32 CowNew開源團(tuán)隊(duì) 閱讀(5918) | 評論 (0)編輯 收藏

     

    首先演示一個NumberFormatter的例子,在這個例子中要求用戶輸入一個數(shù)字,單擊按鈕后將用戶輸入的數(shù)字乘2以后重新賦值給輸入框。用戶輸入的數(shù)字必須大于0,小于100。

    package com.cownew.Char19;

    import java.awt.Font;

    import java.awt.Rectangle;

    import java.math.BigDecimal;

    import javax.swing.JButton;

    import javax.swing.JDialog;

    import javax.swing.JFormattedTextField;

    import javax.swing.JOptionPane;

    import javax.swing.JPanel;

    import javax.swing.text.NumberFormatter;

    import javax.swing.JTextField;

    public class NumberFormaterDialog1 extends JDialog

    {

    private JPanel jContentPane = null;

    private JFormattedTextField numTxtField = null;

    private JButton jButton = null;

    private JTextField jTextField = null;

    private JFormattedTextField getNumTxtField()

    {

    if (numTxtField == null)

    {

    NumberFormatter numFormater = new NumberFormatter();

    numFormater.setMaximum(new BigDecimal(100));

    numFormater.setMinimum(new BigDecimal(0));

    numTxtField = new JFormattedTextField(numFormater);

    numTxtField.setBounds(new Rectangle(56, 38, 154, 24));

    }

    return numTxtField;

    }

    private JButton getJButton()

    {

    if (jButton == null)

    {

    jButton = new JButton();

    jButton.setBounds(new Rectangle(78, 80, 81, 36));

    jButton.setFont(new Font("Dialog", Font.PLAIN, 18));

    jButton.setText("計(jì)算");

    jButton.addActionListener(new java.awt.event.ActionListener() {

    public void actionPerformed(java.awt.event.ActionEvent e)

    {

    BigDecimal oldValue = (BigDecimal) getNumTxtField()

    .getValue();

    if (oldValue != null)

    {

    getNumTxtField().setValue(

    oldValue.multiply(new BigDecimal(2)));

    }

    else

    {

    JOptionPane.showMessageDialog(

    NumberFormaterDialog1.this,"值非法");

    }

    }

    });

    }

    return jButton;

    }

    private JTextField getJTextField()

    {

    if (jTextField == null)

    {

    jTextField = new JTextField();

    jTextField.setBounds(new Rectangle(176, 83, 76, 22));

    }

    return jTextField;

    }

    public static void main(String[] args)

    {

    NumberFormaterDialog1 dlg = new NumberFormaterDialog1();

    dlg.show();

    }

    public NumberFormaterDialog1()

    {

    super();

    initialize();

    }

    private void initialize()

    {

    this.setSize(300, 200);

    this.setContentPane(getJContentPane());

    this.setTitle("JFrame");

    }

    private JPanel getJContentPane()

    {

    if (jContentPane == null)

    {

    jContentPane = new JPanel();

    jContentPane.setLayout(null);

    jContentPane.add(getNumTxtField(), null);

    jContentPane.add(getJButton(), null);

    jContentPane.add(getJTextField(), null);

    }

    return jContentPane;

    }

    }

    當(dāng)我們輸入-3這個無效值的時候是允許輸入的,但是當(dāng)鼠標(biāo)焦點(diǎn)移動到另外的控件的時候,“-3”就會消失。這個行為可以通過NumberFormatter 的setAllowsInvalid方法來改變:

    圖 17.5

    圖 17.6

    如果輸入“10”這個合法的數(shù)字,單擊“計(jì)算”按鈕即可算出正確的值:

    圖 17.7

    圖 17.8

    案例系統(tǒng)中的com.cownew.ctk.ui.swing.JNumberTextField就是為了方便使用而從JFormattedTextField派生的一個數(shù)字輸入控件。

    DateFormatter的使用也是類似的,也允許設(shè)置最大最小值,實(shí)際上只要從InternationalFormatter派生的類,并且數(shù)據(jù)類型實(shí)現(xiàn)了Comparable接口都可以設(shè)置極值。

    MaskFormatter允許開發(fā)人員使用掩碼指定更加復(fù)雜的校驗(yàn)規(guī)則。掩碼是一串特殊的字符串,每個字符的含義如下表所示:

    字符

    說明

    #

    匹配任何數(shù)字字符

    '

    轉(zhuǎn)義符,用來將格式字符當(dāng)成普通字符用

    U

    任意大寫字母

    L

    任意小寫字母

    A

    任意數(shù)字或者字母

    ?

    任何字母

    *

    任何字符

    H

    任何十六進(jìn)制字符 (0-9, a-f or A-F).

    實(shí)例化時指定其掩碼即可:

    MaskFormatter formatter = new MaskFormatter("0x***");

    formatter.setValidCharacters("0123456789abcdefABCDEF");

    還允許為掩碼設(shè)定占位符,這樣可用性更好:

    MaskFormatter formatter = new MaskFormatter("###-####");

    formatter.setPlaceholderCharacter('_');

    formatter.getDisplayValue(tf, "123");

    posted @ 2007-04-26 09:29 CowNew開源團(tuán)隊(duì) 閱讀(1605) | 評論 (0)編輯 收藏

    僅列出標(biāo)題
    共30頁: First 上一頁 11 12 13 14 15 16 17 18 19 下一頁 Last 
    主站蜘蛛池模板: 亚洲一区精品中文字幕| 99久久精品国产免费| 亚洲色中文字幕无码AV| 成全高清在线观看免费| 午夜免费福利网站| 人妖系列免费网站观看| 亚洲视频在线观看| 美女黄网站人色视频免费国产 | 国产在线jyzzjyzz免费麻豆| 亚洲av日韩精品久久久久久a| 免费下载成人电影| 亚洲欧洲中文日产| 国产人成免费视频| 日韩插啊免费视频在线观看| 亚洲6080yy久久无码产自国产 | 亚洲成年人电影在线观看| 日韩视频在线免费观看| 亚洲精品国产日韩| 激情97综合亚洲色婷婷五| 久久午夜免费视频| 最新国产乱人伦偷精品免费网站| 亚洲最大福利视频| 久久精品亚洲中文字幕无码网站| 拨牐拨牐x8免费| 国产自国产自愉自愉免费24区| 亚洲中文字幕无码中文| 国产成人亚洲综合无码精品| 国产成人3p视频免费观看| aⅴ在线免费观看| 久久久久久久久久久免费精品| 亚洲综合激情五月丁香六月| 亚洲丁香色婷婷综合欲色啪| 1000部拍拍拍18免费网站| 亚洲视频在线免费| 爱情岛亚洲论坛在线观看| 亚洲欧洲国产综合| 亚洲人成网www| 亚洲精品无码鲁网中文电影| 免费jjzz在线播放国产| 最近中文字幕无吗高清免费视频| 久久久久国产精品免费看|