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

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

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

    Just Java IT

    西門町學(xué)士關(guān)于Java的隨便一說(shuō)而已……

    2006年4月9日 #

    走進(jìn)JavaFX-(2)

         摘要: 我猶豫了好一陣才決定寫(xiě)JavaFX的語(yǔ)法部分。個(gè)人認(rèn)為這是學(xué)習(xí)中最枯燥的部分。因?yàn)镴avaFX的語(yǔ)法非常簡(jiǎn)單且直觀,比如Sun提供的在線 Tutorial的GUI部分,即使你是第一次聽(tīng)說(shuō)JavaFX這個(gè)東西,只要你稍有一點(diǎn)點(diǎn)編程經(jīng)驗(yàn),你也基本上能夠毫無(wú)障礙地理解這個(gè)Tutorial 的內(nèi)容了。
    話雖如此,部分語(yǔ)法可能確實(shí)會(huì)造成一些理解困難,比如有的地方分隔符用逗號(hào)(,)分號(hào)(;)和空格都可以,def和var的區(qū)別,=>操作符,等等這些還得初看一遍語(yǔ)法才能理解(當(dāng)然,基本上就沒(méi)有必要看第二遍了吧)。因此,我也在此將JavaFX的語(yǔ)法照著Sun的語(yǔ)法 Tutorial快速地過(guò)一遍,為以后打下一個(gè)堅(jiān)實(shí)(?。┑幕A(chǔ),呵呵。  閱讀全文

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

    走進(jìn)JavaFX-(1u1)

    /**
    以前寫(xiě)了一個(gè)JavaFX入門例子,但由于JavaFX正式版中變化較大,那個(gè)例子已無(wú)法在正式版中運(yùn)行,因此重寫(xiě),標(biāo)題叫1u1,也是遵守Sun的更新規(guī)范,代表update1,呵呵
    文:西門町學(xué)士
    */
    08 年12月4日,Sun正式發(fā)布了JavaFX1.0。JavaFX在演進(jìn)過(guò)程中發(fā)生了很多的變化,因此,我以前寫(xiě)的JavaFX的第一個(gè) HelloWorld的例子已經(jīng)無(wú)法在正式版下運(yùn)行,于是在這里重寫(xiě)那個(gè)例子。而新的API我也還沒(méi)有開(kāi)始學(xué)習(xí),只好大略地瀏覽了一遍API就草草寫(xiě)就, 因此,這個(gè)例子雖然在1.0版下正確運(yùn)行,卻未必就是最適合的寫(xiě)法,以后如發(fā)現(xiàn)問(wèn)題再來(lái)update2吧,呵呵……
    正式版中很多包的命名有了天翻 地覆的變化,class的位置和名稱很多也面目全非。比如GUI這塊就經(jīng)歷了由javafx.ui變化成javafx.gui再變化成 javafx.scene和javafx.application再進(jìn)化成javafx.scene和javafx.stage,而跟Swing相關(guān)的組 件也統(tǒng)統(tǒng)加上了Swing前綴。有的class我已經(jīng)找不到了,比如以前的javafx.ui.MessageDialog,我在1.0中沒(méi)有找到對(duì)應(yīng)的 class,只好直接叫用javax.swing.JOptionPane了。好了,廢話不說(shuō)了,貼新代碼如下:
    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
    }

    結(jié)果如圖:

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

    走進(jìn)JavaFX-(1)

         摘要: JavaFX出來(lái)已經(jīng)很長(zhǎng)一段時(shí)間了。一直在計(jì)劃跟進(jìn),可是因?yàn)楸容^懶,現(xiàn)在才慢慢地學(xué)習(xí)。這里就暫做做學(xué)習(xí)總結(jié)的地方吧。
    雖然是總結(jié),我還是打算寫(xiě)詳細(xì)一點(diǎn)。本來(lái)我對(duì)JavaFX了解也不是很多,有的東西還要在網(wǎng)上查證了才能寫(xiě)(比較JavaFX是如何誕生,如何從F3變成 JavaFX的)。今天要寫(xiě)的主要是:1、JavaFX的前世今生;(了解了它的歷史也就了解了它是什么,它的發(fā)展方向,呵呵)2、如何擁有 JavaFX;(知道從哪里去下載開(kāi)發(fā)工具,如何配置它)3、Hello JavaFX World(當(dāng)然,一個(gè)經(jīng)典的Hello World是不能少的)  閱讀全文

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

    NetBeans無(wú)好書(shū)[順便推薦兩本Java書(shū)]

    首先聲明,本文作者信手亂寫(xiě),以前候捷寫(xiě)無(wú)責(zé)任書(shū)評(píng),無(wú)責(zé)任這三個(gè)字,在我這兒也差不多——西門町學(xué)士 (注)

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

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

    又說(shuō)Eclipse與NetBeans

    文:西門町學(xué)士

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

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

    數(shù)組的力量

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

    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;????//?占用的個(gè)數(shù)
    ????????data[0]?=?1;????//?0和1的階乘是1
    ????????
    ????????
    for?(int?i?=?2;?i?<?257;?i++)?{
    ????????????
    for?(int?j?=?0;?j?<?num?+?1;?j++)?{
    ????????????????data[j]?
    *=?i;????????//?對(duì)每個(gè)int中的數(shù)都乘上?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;????//?進(jìn)位
    ????????????????????????data[k]?%=?1000000;??????????????????//?進(jìn)位后的余數(shù)
    ????????????????????}
    ????????????????}
    ????????????}
    ????????}
    ????????System.out.println(
    "占用的int數(shù):"?+?(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]));
    ????????}
    ????}
    }
    輸出結(jié)果為:
    占用的int數(shù):85
    值:
    85781777534284265411908227168123262515778152027948561985965565037726945255314
    75893774402913604514084503758853423365843061571968346936964753222892884974260256
    79637332563368786442675207626794560187968867971521143307702077526646451464709187
    32610083287632570281898077367178145417025052301860849531906813825748107025281755
    94594769870346657127381392862052347568082188607012036110831520935019474371091017
    26968262861606263662435022840944191408424615936000000000000000000000000000000000
    000000000000000000000000000000

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

    JTextField內(nèi)容有效性驗(yàn)證幾種方式

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

    • 利用鍵盤(pán)和焦點(diǎn)事件

    這是最直覺(jué)的方式。利用 KeyListener來(lái)選擇允許的字符,且添加FocusListener,使得

    內(nèi)容不符合要求時(shí)不允許焦點(diǎn)轉(zhuǎn)移。這種方式很繁瑣, Sun的建議是不推薦使用這種方式。

    • 使用自定義的 Document

    我們知道, Swing組件是基于MVC實(shí)現(xiàn)的。JTextComponentModel是一個(gè)叫做DocumentInterface,我們可以通過(guò)限制Document的內(nèi)容來(lái)達(dá)到有效性驗(yàn)證的目的。javax.swing.text包中有多個(gè)不同的Document的實(shí)現(xiàn),JTextField使用的是PlainDocument。如果我們希望JTextField只接受數(shù)字,可以實(shí)現(xiàn)我們特定的Document并使之替換默認(rèn)的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默認(rèn)的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);
    }
    }

    代碼很簡(jiǎn)單,一目了然。這里說(shuō)點(diǎn)題外話, Sun建議的Swing Applicationmain函數(shù)寫(xiě)法如上所示:先建一個(gè)Runnable,然后把這個(gè)Runnable放到event-dispatch thread中去執(zhí)行。另外,以前有的Developer(比如我)喜歡用SwingUtilities.invokeLater(runner)來(lái)將一個(gè)thread放到event-dispatch thread中,現(xiàn)在Sun也建議用EventQueue.invokeLater(runner),因?yàn)?/span>SwingUtilities方法版本僅僅是對(duì)EventQueue方法版本的一個(gè)包裝。

    • InputVerifier來(lái)實(shí)現(xiàn)

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

       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);
    }
    }

    這個(gè)例子的效果和上一個(gè)是不同的。自定義 DocumentApp中,用戶將會(huì)發(fā)現(xiàn)任何非數(shù)字的字符都不會(huì)在JTextField中出現(xiàn);而在使用InputVerifierApp中,用戶在錄入字符時(shí)不會(huì)發(fā)現(xiàn)任何異常,但是當(dāng)他確認(rèn)錄入完成后,如果內(nèi)容不符合有效性,焦點(diǎn)將不會(huì)轉(zhuǎn)移!這兩種情況都可能讓一個(gè)沒(méi)有經(jīng)驗(yàn)的用戶茫然,具體使用哪一種是一個(gè)見(jiàn)仁見(jiàn)智的問(wèn)題。

    • 使用 Document Filter

    J2SE 1.4中,又加入了一個(gè)新的類:DocumentFilter。你無(wú)需再實(shí)現(xiàn)一個(gè)新的Document,而是對(duì)現(xiàn)有的Document過(guò)濾一遍。它的結(jié)果與實(shí)現(xiàn)自定義的Document并無(wú)二樣,僅僅是思路不同而已。

       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;
    }
    }

    再將這個(gè) Filter應(yīng)用于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有關(guān)的組件(而InputVerifier可用于任何組件)。除了這幾種方法,在對(duì)于TextField而言,我們還有JFormattedTextField,很多時(shí)候用JFormattedTextField將是非常容易和簡(jiǎn)單的方式。

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

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

    主站蜘蛛池模板: 亚洲第一se情网站| 午夜在线a亚洲v天堂网2019| 亚洲无线电影官网| 亚洲国产成人超福利久久精品| 亚洲国产美女视频| 噜噜综合亚洲AV中文无码| 日日躁狠狠躁狠狠爱免费视频| 在线免费观看h片| 麻豆国产精品免费视频| 午夜神器成在线人成在线人免费 | 中文字幕免费在线看| 青青草原1769久久免费播放| 成人免费黄色网址| 亚洲?V乱码久久精品蜜桃| 亚洲va无码手机在线电影| 亚洲中字慕日产2021| 免费夜色污私人影院网站电影| 怡红院免费的全部视频| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 亚洲AV综合色区无码另类小说| 亚洲午夜精品国产电影在线观看| 亚洲av日韩专区在线观看| a级毛片免费观看视频| 亚洲网站免费观看| 亚洲精品国产精品乱码不卡| 亚洲春黄在线观看| 一级特级aaaa毛片免费观看| 亚洲免费一级视频| 亚洲福利中文字幕在线网址| 亚洲视频国产视频| 大片免费观看92在线视频线视频| 最近免费中文字幕大全高清大全1| 狠狠色伊人亚洲综合网站色| 一级特黄录像免费播放中文版| 91久久精品国产免费直播| 亚洲av无码乱码在线观看野外| 1区1区3区4区产品亚洲| 日本中文字幕免费看| 无码区日韩特区永久免费系列| 亚洲日韩在线第一页| 亚洲国产精品一区二区三区在线观看|