Just Java IT

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

          2008年12月16日 #

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

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

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

          2008年12月12日 #

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

          /**
          以前寫了一個(gè)JavaFX入門例子,但由于JavaFX正式版中變化較大,那個(gè)例子已無法在正式版中運(yùn)行,因此重寫,標(biāo)題叫1u1,也是遵守Sun的更新規(guī)范,代表update1,呵呵
          文:西門町學(xué)士
          */
          08 年12月4日,Sun正式發(fā)布了JavaFX1.0。JavaFX在演進(jìn)過程中發(fā)生了很多的變化,因此,我以前寫的JavaFX的第一個(gè) HelloWorld的例子已經(jīng)無法在正式版下運(yùn)行,于是在這里重寫那個(gè)例子。而新的API我也還沒有開始學(xué)習(xí),只好大略地瀏覽了一遍API就草草寫就, 因此,這個(gè)例子雖然在1.0版下正確運(yùn)行,卻未必就是最適合的寫法,以后如發(fā)現(xiàn)問題再來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中沒有找到對(duì)應(yīng)的 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
          }

          結(jié)果如圖:

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

          2008年7月18日 #

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

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

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

          2007年6月10日 #

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

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

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

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

          2006年12月15日 #

          又說Eclipse與NetBeans

          文:西門町學(xué)士

          Eclipse的陣營一向強(qiáng)大,最近又加入了一家重量級(jí)的公司:Google,相形之下,NetBeans的陣營顯得有點(diǎn)那么“勢單力薄”。
          我本人則由于對(duì)Swing的喜愛及對(duì)SWT的不喜愛,一直(從NB3.0以來)使用NetBeans。
          (以前的NetBeans確實(shí)不夠好用,建個(gè)Project還得先mount一下,典型的Unix思維)雙方這幾年的發(fā)展,從架構(gòu)和功能上來說,現(xiàn)在NetBeans和Eclipse已經(jīng)是大同小異,沒有誰比誰?!痢?duì)于developers,用誰憑喜好。
          可 對(duì)于想通過這兩個(gè)平臺(tái)來賺錢的企業(yè)來說,二者的區(qū)別可就太大了。看看Eclipse的陣營(雙方的家長就不提了):BEA, Borland, Intel, Sybase, Adobe, Oracle, Google, etc全是些IT屆NB哄哄的大牛;再看看NetBeans的部隊(duì):一隊(duì)的無名小卒,大名鼎鼎的也有:Amazon:賣書的;eBay:做生意的;HP: 賣PC的;還有賣手機(jī)的,做開源的,不一而足,感覺有點(diǎn)歪瓜裂棗似的。我就納悶兒了:同樣都是做Java IDE 的,受到的待遇區(qū)別咋就這么大呢!何況像Borland這樣的本來JBuilder和NetBeans就很相近,為什么還得繞個(gè)彎兒去舔SWT的屁股? (李維還在信心滿滿的說什么Java開發(fā)王者,反正我是不信
          今 兒個(gè)感覺有點(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)送,咱們開發(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)的,像見了娘親一向撲向Eclipse的懷抱~~
          不管怎么說,我還是Swing的堅(jiān)定支持者,支持Sun,支持NetBeans,最后,感謝James Golsing,感謝Groove Coverage(我是邊聽God is A Girl一邊碼字兒的),感謝你的眼睛不辭辛勞地看到這里!

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

          2006年4月16日 #

          數(shù)組的力量

          ??? 假如我們要精確計(jì)算一個(gè)很大的數(shù),比如說,256的階乘(結(jié)果有500多位),怎么辦?
          你會(huì)說,很好辦啊,從JDK 1.1起Java不是提供了一個(gè)java.math.BigInteger嗎?不錯(cuò),用BigInteger確實(shí)能解決問題。不過,如果沒有Sun給的這個(gè)class,僅僅靠Java最基本的那些類型,我們有沒有辦法來進(jìn)行計(jì)算呢?答案是,肯定是能嘛,要不然在BigInteger之前怎么辦。
          方法之一就是用數(shù)組來表示。比如說:
          ??????????????????????? int[] data = new int[100];
          ??? 我們知道,一個(gè)int的最大值為2^31-1即2147483647(10位),如果我們把這100個(gè)int值串起來,我們就能表示一個(gè)1000位的數(shù)。這里我們就用這種方式來計(jì)算256的階乘(256!)。
          ??? 我們先分配100個(gè)int的數(shù)組,由于是static,所以每個(gè)int的初始值都是0。
          ??? 然后每個(gè)int表示6位數(shù),即最大值為999999。因?yàn)槲覀円龀朔?,如果給int的位數(shù)過大,如9位,那么999999999乘上一個(gè)數(shù),如100,它的值就大于了int的max值,造成溢出。所以int表示的位數(shù)需要根據(jù)需要仔細(xì)選擇。(用long來表示也同樣需要仔細(xì)權(quán)衡位數(shù))
          ??? 再定義一個(gè)num來表示我們占用的數(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ù)值也超過了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é)士 閱讀(1956) | 評(píng)論 (3)編輯 收藏

          2006年4月9日 #

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

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

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

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

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

          • 使用自定義的 Document

          我們知道, Swing組件是基于MVC實(shí)現(xiàn)的。JTextComponentModel是一個(gè)叫做DocumentInterface,我們可以通過限制Document的內(nè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);
          }
          }

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

          • InputVerifier來實(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è)沒有經(jīng)驗(yàn)的用戶茫然,具體使用哪一種是一個(gè)見仁見智的問題。

          • 使用 Document Filter

          J2SE 1.4中,又加入了一個(gè)新的類:DocumentFilter。你無需再實(shí)現(xiàn)一個(gè)新的Document,而是對(duì)現(xiàn)有的Document過濾一遍。它的結(jié)果與實(shí)現(xiàn)自定義的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;
          }
          }

          再將這個(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將是非常容易和簡單的方式。

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

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

          2006年3月16日 #

          Tiger pitfall

          在SDN踩到一個(gè)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)));
              } 
          }

          輸出結(jié)果出乎意料:
          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;
          就這一個(gè)改動(dòng)后輸出結(jié)果雖然符合了java的思維方式,但在這個(gè)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 西門町學(xué)士 閱讀(341) | 評(píng)論 (4)編輯 收藏

          僅列出標(biāo)題  
          主站蜘蛛池模板: 临沂市| 福建省| 陆河县| 辽阳县| 文化| 读书| 开阳县| 上虞市| 平原县| 伊通| 泽州县| 石台县| 茶陵县| 天门市| 普兰县| 攀枝花市| 普格县| 东源县| 仙游县| 商都县| 台东县| 剑川县| 孟州市| 南京市| 聂荣县| 昭觉县| 鄂尔多斯市| 库车县| 大田县| 米林县| 当涂县| 札达县| 牡丹江市| 兴仁县| 大同县| 峡江县| 九寨沟县| 安新县| 巢湖市| 平潭县| 浠水县|