﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Just Java IT</title><link>http://www.blogjava.net/stevech/</link><description>西门町学士关于Java的随便一说而已……</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 07:53:11 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 07:53:11 GMT</pubDate><ttl>60</ttl><item><title>走进JavaFX-(2)</title><link>http://www.blogjava.net/stevech/archive/2008/12/16/246532.html</link><dc:creator>西门町学士</dc:creator><author>西门町学士</author><pubDate>Mon, 15 Dec 2008 17:05:00 GMT</pubDate><guid>http://www.blogjava.net/stevech/archive/2008/12/16/246532.html</guid><wfw:comment>http://www.blogjava.net/stevech/comments/246532.html</wfw:comment><comments>http://www.blogjava.net/stevech/archive/2008/12/16/246532.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/stevech/comments/commentRss/246532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevech/services/trackbacks/246532.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我犹豫了好一阵才决定写JavaFX的语法部分。个人认为这是学习中最枯燥的部分。因为JavaFX的语法非常简单且直观，比如Sun提供的在线 Tutorial的GUI部分，即使你是第一次听说JavaFX这个东西，只要你稍有一点点编程经验，你也基本上能够毫无障碍地理解这个Tutorial 的内容了。<br>话虽如此，部分语法可能确实会造成一些理解困难，比如有的地方分隔符用逗号（,）分号（;）和空格都可以，def和var的区别，=>操作符，等等这些还得初看一遍语法才能理解（当然，基本上就没有必要看第二遍了吧）。因此，我也在此将JavaFX的语法照着Sun的语法 Tutorial快速地过一遍，为以后打下一个坚实（！）的基础，呵呵。&nbsp;&nbsp;<a href='http://www.blogjava.net/stevech/archive/2008/12/16/246532.html'>阅读全文</a><img src ="http://www.blogjava.net/stevech/aggbug/246532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevech/" target="_blank">西门町学士</a> 2008-12-16 01:05 <a href="http://www.blogjava.net/stevech/archive/2008/12/16/246532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>走进JavaFX-(1u1)</title><link>http://www.blogjava.net/stevech/archive/2008/12/12/246048.html</link><dc:creator>西门町学士</dc:creator><author>西门町学士</author><pubDate>Fri, 12 Dec 2008 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/stevech/archive/2008/12/12/246048.html</guid><wfw:comment>http://www.blogjava.net/stevech/comments/246048.html</wfw:comment><comments>http://www.blogjava.net/stevech/archive/2008/12/12/246048.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stevech/comments/commentRss/246048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevech/services/trackbacks/246048.html</trackback:ping><description><![CDATA[/**<br />
以前写了一个JavaFX入门例子，但由于JavaFX正式版中变化较大，那个例子已无法在正式版中运行，因此重写，标题叫1u1，也是遵守Sun的更新规范，代表update1，呵呵<br />
文：西门町学士<br />
*/<br />
08
年12月4日，Sun正式发布了JavaFX1.0。JavaFX在演进过程中发生了很多的变化，因此，我以前写的JavaFX的第一个
HelloWorld的例子已经无法在正式版下运行，于是在这里重写那个例子。而新的API我也还没有开始学习，只好大略地浏览了一遍API就草草写就，
因此，这个例子虽然在1.0版下正确运行，却未必就是最适合的写法，以后如发现问题再来update2吧，呵呵&#8230;&#8230;<br />
正式版中很多包的命名有了天翻
地覆的变化，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了。好了，废话不说了，贴新代码如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;sc.tmp;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javafx.stage.Stage;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javafx.scene.Scene;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javafx.scene.paint.Color;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javafx.ext.swing.SwingButton;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.swing.JOptionPane;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;stevech<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
Stage&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;title:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Application&nbsp;title</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000;">250</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000;">80</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;scene:&nbsp;Scene&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;Color.ORANGE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content:&nbsp;SwingButton&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Click<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action:&nbsp;function():Void&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JOptionPane.showMessageDialog(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Have&nbsp;Fun!\nThis&nbsp;is&nbsp;your&nbsp;first&nbsp;JavaFX&nbsp;app!</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;translateX:&nbsp;</span><span style="color: #000000;">90</span><span style="color: #000000;">&nbsp;translateY:&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;visible:&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;"><br />
}<br />
</span></div>
<br />
结果如图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/stevech/fx.PNG" width="413" height="260" /><br />
<img src ="http://www.blogjava.net/stevech/aggbug/246048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevech/" target="_blank">西门町学士</a> 2008-12-12 22:42 <a href="http://www.blogjava.net/stevech/archive/2008/12/12/246048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>走进JavaFX-(1)</title><link>http://www.blogjava.net/stevech/archive/2008/07/18/intoJavaFX.html</link><dc:creator>西门町学士</dc:creator><author>西门町学士</author><pubDate>Fri, 18 Jul 2008 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/stevech/archive/2008/07/18/intoJavaFX.html</guid><wfw:comment>http://www.blogjava.net/stevech/comments/215700.html</wfw:comment><comments>http://www.blogjava.net/stevech/archive/2008/07/18/intoJavaFX.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/stevech/comments/commentRss/215700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevech/services/trackbacks/215700.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JavaFX出来已经很长一段时间了。一直在计划跟进，可是因为比较懒，现在才慢慢地学习。这里就暂做做学习总结的地方吧。<br>虽然是总结，我还是打算写详细一点。本来我对JavaFX了解也不是很多，有的东西还要在网上查证了才能写（比较JavaFX是如何诞生，如何从F3变成 JavaFX的）。今天要写的主要是：1、JavaFX的前世今生；（了解了它的历史也就了解了它是什么，它的发展方向，呵呵）2、如何拥有 JavaFX；（知道从哪里去下载开发工具，如何配置它）3、Hello JavaFX World（当然，一个经典的Hello World是不能少的）&nbsp;&nbsp;<a href='http://www.blogjava.net/stevech/archive/2008/07/18/intoJavaFX.html'>阅读全文</a><img src ="http://www.blogjava.net/stevech/aggbug/215700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevech/" target="_blank">西门町学士</a> 2008-07-18 11:12 <a href="http://www.blogjava.net/stevech/archive/2008/07/18/intoJavaFX.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans无好书[顺便推荐两本Java书]</title><link>http://www.blogjava.net/stevech/archive/2007/06/10/123268.html</link><dc:creator>西门町学士</dc:creator><author>西门町学士</author><pubDate>Sun, 10 Jun 2007 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/stevech/archive/2007/06/10/123268.html</guid><wfw:comment>http://www.blogjava.net/stevech/comments/123268.html</wfw:comment><comments>http://www.blogjava.net/stevech/archive/2007/06/10/123268.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stevech/comments/commentRss/123268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevech/services/trackbacks/123268.html</trackback:ping><description><![CDATA[		首先声明，本文作者信手乱写，以前候捷写<span style="font-weight: bold;">无责任书评</span>，无责任这三个字，在我这儿也差不多——西门町学士 (注)<br><br>前两天逛书店，看到一本《<font size="-1"><font color="#cc0033">精通NetBeans</font>——Java桌面、Web、企业级程序开发</font>》 ，遂在书店里站了一个多小时（好厚啊！书厚脸皮也厚），基本把这本书看了一遍，整体感觉失望，内容完全配不上<font size="-1"><font color="#cc0033">精通NetBeans</font></font>这个标题。基本上就是在NetBeans环境里写一些很简单的JavaSE和JavaEE代码，而且代码质量也很不高。像Web部分，为了图简单，在JSP页面中写了大量的scriptlet，很不推荐开发人员看这种代码。这本书勉勉强强可以起名叫《<font size="-1"><font color="#cc0033">初涉NetBeans</font></font>》，看来要想更好地推介NetBeans，还需要更多的技术作者的努力。什么时候NetBeans的书能跟Delphi的书媲美了，估计NetBeans的大业差不多就定了吧，呵呵<br>不管用什么IDE，关键是看开发人员本人对语言和框架的功力，这里也推介两本书，都是老书了，但内容基本不落伍，提升功力更是不错。<br>一本是:Swing，Matthew Robinson 和 Pavel Vorobiev合写的，学士手上的很老了，上个世纪末的英文原版，但是真的非常非常经典，国内应该有更新的中文版的，做Swing的一定要看，很不错。<br>一
本关于JSP和Servlet方面的，学士是从TSS下载的免费电子版，Servlets and JavaServer Pages, The
J2EE technology Web Tier，Jayson Falkner 与 Kevin
Jones合著，（基于J2EE4，无JSF方面内容），国内好像没有中文版的。这也是一本好书，Java Web入门与提升均应多读此书。<br>这两本书最大的特点就是，呵呵，用侯捷的话说，叫<span style="font-weight: bold; text-decoration: underline;">深入浅出</span>。在讲一个技术的同时，也讲正确的编码和设计方法，既能让一个新手从正门登堂入室，也能让一个有经验的开发人员获得提升，以此大力推介之。<img src ="http://www.blogjava.net/stevech/aggbug/123268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevech/" target="_blank">西门町学士</a> 2007-06-10 23:45 <a href="http://www.blogjava.net/stevech/archive/2007/06/10/123268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又说Eclipse与NetBeans</title><link>http://www.blogjava.net/stevech/archive/2006/12/15/88064.html</link><dc:creator>西门町学士</dc:creator><author>西门町学士</author><pubDate>Fri, 15 Dec 2006 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/stevech/archive/2006/12/15/88064.html</guid><wfw:comment>http://www.blogjava.net/stevech/comments/88064.html</wfw:comment><comments>http://www.blogjava.net/stevech/archive/2006/12/15/88064.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/stevech/comments/commentRss/88064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevech/services/trackbacks/88064.html</trackback:ping><description><![CDATA[文：西门町学士<br /><br />Eclipse的阵营一向强大，最近又加入了一家重量级的公司：Google，相形之下，NetBeans的阵营显得有点那么“势单力薄”。<br />我本人则由于对Swing的喜爱及对SWT的不喜爱，一直（从NB3.0以来）使用NetBeans。<br />（以前的NetBeans确实不够好用，建个Project还得先mount一下，典型的Unix思维）双方这几年的发展，从架构和功能上来说，现在NetBeans和Eclipse已经是大同小异，没有谁比谁牛×。对于developers，用谁凭喜好。<br />可
对于想通过这两个平台来赚钱的企业来说，二者的区别可就太大了。看看Eclipse的阵营（双方的家长就不提了）：BEA, Borland,
Intel, Sybase, Adobe, Oracle, Google,
etc全是些IT届NB哄哄的大牛；再看看NetBeans的部队：一队的无名小卒，大名鼎鼎的也有：Amazon：卖书的；eBay：做生意的；HP：
卖PC的；还有卖手机的，做开源的，不一而足，感觉有点歪瓜裂枣似的。我就纳闷儿了：同样都是做Java IDE
的，受到的待遇区别咋就这么大呢！何况像Borland这样的本来JBuilder和NetBeans就很相近，为什么还得绕个弯儿去舔SWT的屁股？
（李維还在信心满满的说什么<span style="font-weight: bold;">Java開發王者</span>，反正我是不信<img alt="" src="http://blog.csdn.net/Editor/FCKeditor/editor/images/smiley/msn/thumbs_down.gif" />）<br />今
儿个感觉有点想明白了：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的怀抱~~<br />不管怎么说，我还是Swing的坚定支持者，支持Sun，支持NetBeans，最后，感谢James Golsing，感谢Groove Coverage（我是边听God is A Girl一边码字儿的），感谢你的眼睛不辞辛劳地看到这里！<img src ="http://www.blogjava.net/stevech/aggbug/88064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevech/" target="_blank">西门町学士</a> 2006-12-15 22:42 <a href="http://www.blogjava.net/stevech/archive/2006/12/15/88064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组的力量</title><link>http://www.blogjava.net/stevech/archive/2006/04/16/41384.html</link><dc:creator>西门町学士</dc:creator><author>西门町学士</author><pubDate>Sun, 16 Apr 2006 13:19:00 GMT</pubDate><guid>http://www.blogjava.net/stevech/archive/2006/04/16/41384.html</guid><wfw:comment>http://www.blogjava.net/stevech/comments/41384.html</wfw:comment><comments>http://www.blogjava.net/stevech/archive/2006/04/16/41384.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/stevech/comments/commentRss/41384.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevech/services/trackbacks/41384.html</trackback:ping><description><![CDATA[    假如我们要精确计算一个很大的数，比如说，256的阶乘（结果有500多位），怎么办？<br />你会说，很好办啊，从JDK 1.1起Java不是提供了一个java.math.BigInteger吗？不错，用BigInteger确实能解决问题。不过，如果没有Sun给的这个class，仅仅靠Java最基本的那些类型，我们有没有办法来进行计算呢？答案是，肯定是能嘛，要不然在BigInteger之前怎么办。<br />方法之一就是用数组来表示。比如说：<br />                        int[] data = new int[100];<br />    我们知道，一个int的最大值为2^31-1即2147483647（10位），如果我们把这100个int值串起来，我们就能表示一个1000位的数。这里我们就用这种方式来计算256的阶乘（256!）。<br />    我们先分配100个int的数组，由于是static，所以每个int的初始值都是0。<br />    然后每个int表示6位数，即最大值为999999。因为我们要做乘法，如果给int的位数过大，如9位，那么999999999乘上一个数，如100，它的值就大于了int的max值，造成溢出。所以int表示的位数需要根据需要仔细选择。（用long来表示也同样需要仔细权衡位数）<br />    再定义一个num来表示我们占用的数组的int个数<br />    在乘法的时候，对每个占用的int中的数都要乘，然后一个一个地判断每个int中的值是不是超出了6位：<br />                        if (data[j]) &gt; 1000000)<br />    如果超出了则需要进位：<br />                        data[k+1] += data[k]/1000000;<br />                        data[k] %= 1000000;<br />一个个判断，最后，如果最高位（即data[num]）中的数值也超过了6位，我们就需要占用一个新的int，同样地进位，当然也不要忘了给num加一。<br />                        if (data[num] &gt; 1000000) num++;<br />    最后，将我们的数组顺序输出即可。在输出的时候需要小心的是，如果int中的值小于6位，如25，别忘了补上0，即000025，否则你会得到错误的答案的。<br />    完整的代码如下：<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> tmp;<br /><br /></span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br /> *<br /> * </span><span style="color: rgb(128, 128, 128);">@author</span><span style="color: rgb(0, 128, 0);"> Stevech<br /> </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> BigNumbers {<br />    </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[] data </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">];<br />    <br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"> Creates a new instance of BigNumers </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> main(String[] args) {<br />        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> num </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 占用的个数</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        data[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 0和1的阶乘是1</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        <br />        </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">; i </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">257</span><span style="color: rgb(0, 0, 0);">; i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">) {<br />            </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> j </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">; j </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> num </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">; j</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">) {<br />                data[j] </span><span style="color: rgb(0, 0, 0);">*=</span><span style="color: rgb(0, 0, 0);"> i;        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 对每个int中的数都乘上 i</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">            }<br />            </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> j </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">; j </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> num </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">; j</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">) {<br />                </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (data[j] </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1000000</span><span style="color: rgb(0, 0, 0);">) {<br />                    </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> k </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> j; k </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> num </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">; k</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">) {<br />                        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (data[num] </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1000000</span><span style="color: rgb(0, 0, 0);">) num</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />                        data[k</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">] </span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);"> data[k]</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">1000000</span><span style="color: rgb(0, 0, 0);">;    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 进位</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">                        data[k] </span><span style="color: rgb(0, 0, 0);">%=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1000000</span><span style="color: rgb(0, 0, 0);">;                  </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 进位后的余数</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">                    }<br />                }<br />            }<br />        }<br />        System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">占用的int数：</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (num</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">\n值：</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        System.out.print(data[num]);<br />        </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> num</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">; i </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">; i</span><span style="color: rgb(0, 0, 0);">--</span><span style="color: rgb(0, 0, 0);">) {<br />            System.out.print(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> java.text.DecimalFormat(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">000000</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).format(data[i]));<br />        }<br />    }<br />}</span></div>输出结果为：<br /><font face="Courier New">占用的int数：85<br />值：<br />85781777534284265411908227168123262515778152027948561985965565037726945255314<br />75893774402913604514084503758853423365843061571968346936964753222892884974260256<br />79637332563368786442675207626794560187968867971521143307702077526646451464709187<br />32610083287632570281898077367178145417025052301860849531906813825748107025281755<br />94594769870346657127381392862052347568082188607012036110831520935019474371091017<br />26968262861606263662435022840944191408424615936000000000000000000000000000000000<br />000000000000000000000000000000</font><br /><img src ="http://www.blogjava.net/stevech/aggbug/41384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevech/" target="_blank">西门町学士</a> 2006-04-16 21:19 <a href="http://www.blogjava.net/stevech/archive/2006/04/16/41384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JTextField内容有效性验证几种方式</title><link>http://www.blogjava.net/stevech/archive/2006/04/09/40105.html</link><dc:creator>西门町学士</dc:creator><author>西门町学士</author><pubDate>Sun, 09 Apr 2006 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/stevech/archive/2006/04/09/40105.html</guid><wfw:comment>http://www.blogjava.net/stevech/comments/40105.html</wfw:comment><comments>http://www.blogjava.net/stevech/archive/2006/04/09/40105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevech/comments/commentRss/40105.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevech/services/trackbacks/40105.html</trackback:ping><description><![CDATA[
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">在使用</span>
				</font>Swing<font face="Lucida Sans Unicode"><span lang="zh-CN">的</span></font>JTextField<font face="Lucida Sans Unicode"><span lang="zh-CN">时，我们常常希望只接受那些符合我们要求的录入，如数字、电话号码、邮政编码、</span></font>E-mail<font face="Lucida Sans Unicode"><span lang="zh-CN">等。</span></font>JFC<font face="Lucida Sans Unicode"><span lang="zh-CN">工作组在这方面也做了很多工作，每一次新的</span></font>Java Se<font face="Lucida Sans Unicode"><span lang="zh-CN">发布，往往都提供了新的、更方便和强大的有效性验证方式，在这里列举几种不同的验证方式。</span></font></p>
		<ul>
				<li>
						<p style="margin-bottom: 0in;">
								<font face="Lucida Sans Unicode">
										<span lang="zh-CN">利用键盘和焦点事件</span>
								</font>
						</p>
				</li>
		</ul>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">这是最直觉的方式。利用</span>
				</font>KeyListener<font face="Lucida Sans Unicode"><span lang="zh-CN">来选择允许的字符，且添加</span></font>FocusListener<font face="Lucida Sans Unicode"><span lang="zh-CN">，使得</span></font></p>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">内容不符合要求时不允许焦点转移。这种方式很繁琐，</span>
				</font>Sun<font face="Lucida Sans Unicode"><span lang="zh-CN">的建议是不推荐使用这种方式。</span></font></p>
		<ul>
				<li>
						<p style="margin-bottom: 0in;">
								<font face="Lucida Sans Unicode">
										<span lang="zh-CN">使用自定义的</span>
								</font>Document</p>
				</li>
		</ul>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">我们知道，</span>
				</font>Swing<font face="Lucida Sans Unicode"><span lang="zh-CN">组件是基于</span></font>MVC<font face="Lucida Sans Unicode"><span lang="zh-CN">实现的。</span></font>JTextComponent<font face="Lucida Sans Unicode"><span lang="zh-CN">的</span></font>Model<font face="Lucida Sans Unicode"><span lang="zh-CN">是一个叫做</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">的</span></font>Interface<font face="Lucida Sans Unicode"><span lang="zh-CN">，我们可以通过限制</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">的内容来达到有效性验证的目的。</span></font>javax.swing.text<font face="Lucida Sans Unicode"><span lang="zh-CN">包中有多个不同的</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">的实现，</span></font>JTextField<font face="Lucida Sans Unicode"><span lang="zh-CN">使用的是</span></font>PlainDocument<font face="Lucida Sans Unicode"><span lang="zh-CN">。如果我们希望</span></font>JTextField<font face="Lucida Sans Unicode"><span lang="zh-CN">只接受数字，可以实现我们特定的</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">并使之替换默认的</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">：</span></font></p>
		<p style="margin-bottom: 0in;">
				<br />
		</p>
		<pre>   package sdn;<br /><br />   import javax.swing.text.*;<br /><br />   public class IntegerDocument extends PlainDocument {<br /><br />     int currentValue = 0;<br /><br />     public int getValue() {<br />       return currentValue;<br />     }<br /><br />     public void insertString(int offset, String string,<br />         AttributeSet attributes) throws BadLocationException {<br /><br />       if (string == null) {<br />         return;<br />       } else {<br />         String newValue;<br />         int length = getLength();<br />         if (length == 0) {<br />           newValue = string;<br />         } else {<br />           String currentContent = getText(0, length);<br />           StringBuffer currentBuffer = <br />                new StringBuffer(currentContent);<br />           currentBuffer.insert(offset, string);<br />           newValue = currentBuffer.toString();<br />         }<br />         currentValue = checkInput(newValue, offset);<br />         super.insertString(offset, string, attributes);<br />       }<br />     }<br />     public void remove(int offset, int length)<br />         throws BadLocationException {<br />       int currentLength = getLength();<br />       String currentContent = getText(0, currentLength);<br />       String before = currentContent.substring(0, offset);<br />       String after = currentContent.substring(length+offset,<br />         currentLength);<br />       String newValue = before + after;<br />       currentValue = checkInput(newValue, offset);<br />       super.remove(offset, length);<br />     }<br />     public int checkInput(String proposedValue, int offset)<br />         throws BadLocationException {<br />       if (proposedValue.length() &gt; 0) {<br /><strong>       try {</strong><br /><strong>           int newValue = Integer.parseInt(proposedValue);</strong><br /><strong>           return newValue;</strong><br /><strong>       } catch (NumberFormatException e) {</strong><br /><strong>           throw new BadLocationException(proposedValue, offset);</strong><br /><strong>       }</strong><br />       } else {<br />         return 0;<br />       }<br />     }<br />   }</pre>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">然后用</span>
				</font>IntegerDocument<font face="Lucida Sans Unicode"><span lang="zh-CN">去替换</span></font>JTextField<font face="Lucida Sans Unicode"><span lang="zh-CN">默认的</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">：</span></font></p>
		<pre>   package sdn;<br /><br />   import javax.swing.*;<br />   import javax.swing.text.*;<br />   import java.awt.*;<br />   import java.awt.event.*;<br /><br />   public class NumericInput {<br />     public static void main(String args[]) {<br />       Runnable runner = new Runnable() {<br />         public void run() {<br />           JFrame frame = new JFrame("Numeric Input");<br />           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />           frame.setLayout(new GridLayout(2, 2));<br /><br />           frame.add(new JLabel("Number"));<br />           JTextField fieldOne = new JTextField();<br /><strong>           Document doc= new IntegerDocument();</strong><br /><strong>           fieldOne.setDocument(doc);</strong><br />           frame.add(fieldOne);<br /><br />           frame.add(new JLabel("All"));<br />           JTextField fieldTwo = new JTextField();<br />           frame.add(fieldTwo);<br /><br />           frame.setSize(250, 90);<br />           frame.setVisible(true);<br />         }<br />       };<br />       EventQueue.invokeLater(runner);<br />     }<br />   }</pre>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">代码很简单，一目了然。这里说点题外话，</span>
				</font>Sun<font face="Lucida Sans Unicode"><span lang="zh-CN">建议的</span></font>Swing Application<font face="Lucida Sans Unicode"><span lang="zh-CN">的</span></font>main<font face="Lucida Sans Unicode"><span lang="zh-CN">函数写法如上所示：先建一个</span></font>Runnable<font face="Lucida Sans Unicode"><span lang="zh-CN">，然后把这个</span></font>Runnable<font face="Lucida Sans Unicode"><span lang="zh-CN">放到</span></font>event-dispatch thread<font face="Lucida Sans Unicode"><span lang="zh-CN">中去执行。另外，以前有的</span></font>Developer<font face="Lucida Sans Unicode"><span lang="zh-CN">（比如我）喜欢用</span></font>SwingUtilities.invokeLater(runner)<font face="Lucida Sans Unicode"><span lang="zh-CN">来将一个</span></font>thread<font face="Lucida Sans Unicode"><span lang="zh-CN">放到</span></font>event-dispatch thread<font face="Lucida Sans Unicode"><span lang="zh-CN">中，现在</span></font>Sun<font face="Lucida Sans Unicode"><span lang="zh-CN">也建议用</span></font>EventQueue.invokeLater(runner)<font face="Lucida Sans Unicode"><span lang="zh-CN">，因为</span></font>SwingUtilities<font face="Lucida Sans Unicode"><span lang="zh-CN">方法版本仅仅是对</span></font>EventQueue<font face="Lucida Sans Unicode"><span lang="zh-CN">方法版本的一个包装。</span></font></p>
		<ul>
				<li>
						<p style="margin-bottom: 0in;">
								<font face="Lucida Sans Unicode">
										<span lang="zh-CN">用</span>
								</font>InputVerifier<font face="Lucida Sans Unicode"><span lang="zh-CN">来实现</span></font></p>
				</li>
		</ul>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">在</span>
				</font>J2SE 1.3<font face="Lucida Sans Unicode"><span lang="zh-CN">中加入了一个名为</span></font>InputVerifier<font face="Lucida Sans Unicode"><span lang="zh-CN">的抽象类，可用于任何</span></font>JComponent<font face="Lucida Sans Unicode"><span lang="zh-CN">。其中定义了</span></font>boolean verifiy(JComponent input)<font face="Lucida Sans Unicode"><span lang="zh-CN">方法。如果组件中的文本是有效的，当焦点转移时（如按下</span></font>Tab<font face="Lucida Sans Unicode"><span lang="zh-CN">或</span></font>Shift-Tab<font face="Lucida Sans Unicode"><span lang="zh-CN">），</span></font>verify<font face="Lucida Sans Unicode"><span lang="zh-CN">方法返回</span></font>true<font face="Lucida Sans Unicode"><span lang="zh-CN">；否则返回</span></font>false<font face="Lucida Sans Unicode"><span lang="zh-CN">，使得焦点仍停留在当前组件上。我们仍以数字为例：</span></font></p>
		<pre>   package sdn;<br /><br />   import java.awt.*;<br />   import java.awt.event.*;<br />   import javax.swing.*;<br /><br />   public class NumericVerifier{<br />     public static void main(String args[]) {<br />       Runnable runner = new Runnable() {<br />         public void run() {<br />           JFrame frame = new JFrame("Numeric Verifier");<br />           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br /><br />           JPanel panel1 = new JPanel(new BorderLayout());<br />           JLabel label1 = new JLabel("Numeric-only");<br />           JTextField textField1 = new JTextField();<br />           panel1.add(label1, BorderLayout.WEST);<br />           panel1.add(textField1, BorderLayout.CENTER);<br /><br />           JPanel panel2 = new JPanel(new BorderLayout());<br />           JLabel label2 = new JLabel("Anything");<br />           JTextField textField2 = new JTextField();<br />           panel2.add(label2, BorderLayout.WEST);<br />           panel2.add(textField2, BorderLayout.CENTER);<br /><br />           JPanel panel3 = new JPanel(new BorderLayout());<br />           JLabel label3 = new JLabel("Numeric-only");<br />           JTextField textField3 = new JTextField();<br />           panel3.add(label3, BorderLayout.WEST);<br />           panel3.add(textField3, BorderLayout.CENTER);<br /><br /><strong>           InputVerifier verifier = new InputVerifier() {</strong><br /><strong>               public boolean verify(JComponent comp) {</strong><br /><strong>                   boolean returnValue;</strong><br /><strong>                   JTextField textField = (JTextField)comp;</strong><br /><strong>                   try {</strong><br /><strong>                       Integer.parseInt(textField.getText());</strong><br /><strong>                       returnValue = true;</strong><br /><strong>                   } catch (NumberFormatException e) {</strong><br /><strong>                       Toolkit.getDefaultToolkit().beep();</strong><br /><strong>                       returnValue = false;</strong><br /><strong>                   }</strong><br /><strong>                   return returnValue;</strong><br /><strong>               }</strong><br /><strong>           };</strong><br /><br /><strong>           textField1.setInputVerifier(verifier);</strong><br /><strong>           textField3.setInputVerifier(verifier);</strong><br /><br />           frame.add(panel1, BorderLayout.NORTH);<br />           frame.add(panel2, BorderLayout.CENTER);<br />           frame.add(panel3, BorderLayout.SOUTH);<br />           frame.setSize(300, 95);<br />          frame.setVisible(true);<br />         }<br />       };<br />       EventQueue.invokeLater(runner);<br />     }<br />   }</pre>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">这个例子的效果和上一个是不同的。自定义</span>
				</font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">的</span></font>App<font face="Lucida Sans Unicode"><span lang="zh-CN">中，用户将会发现任何非数字的字符都不会在</span></font>JTextField<font face="Lucida Sans Unicode"><span lang="zh-CN">中出现；而在使用</span></font>InputVerifier<font face="Lucida Sans Unicode"><span lang="zh-CN">的</span></font>App<font face="Lucida Sans Unicode"><span lang="zh-CN">中，用户在录入字符时不会发现任何异常，但是当他确认录入完成后，如果内容不符合有效性，焦点将不会转移！这两种情况都可能让一个没有经验的用户茫然，具体使用哪一种是一个见仁见智的问题。</span></font></p>
		<ul>
				<li>
						<p style="margin-bottom: 0in;">
								<font face="Lucida Sans Unicode">
										<span lang="zh-CN">使用</span>
								</font>Document 	Filter</p>
				</li>
		</ul>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">在</span>
				</font>J2SE 1.4<font face="Lucida Sans Unicode"><span lang="zh-CN">中，又加入了一个新的类：</span></font>DocumentFilter<font face="Lucida Sans Unicode"><span lang="zh-CN">。你无需再实现一个新的</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">，而是对现有的</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">过滤一遍。它的结果与实现自定义的</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">并无二样，仅仅是思路不同而已。</span></font></p>
		<pre>   package snd;<br />   import javax.swing.text.*;<br />   import java.awt.Toolkit;   <br /><br />   public class IntegerDocumentFilter extends DocumentFilter {<br /><br /><br />      int currentValue = 0;   <br /><br />      public IntegerDocumentFilter() {<br />      }<br /><br />      public void insertString(DocumentFilter.FilterBypass fb, <br />       int offset, String string, AttributeSet attr) <br />       throws BadLocationException {   <br /><br />        if (string == null) {<br />          return;<br />        } else {<br />          replace(fb, offset, 0, string, attr);<br />        }<br />       }   <br /><br />      public void remove(DocumentFilter.FilterBypass fb, <br />       int offset, int length)<br />       throws BadLocationException {<br /><br />        replace(fb, offset, length, "", null);<br />      }<br /><br />      public void replace(DocumentFilter.FilterBypass fb, <br />       int offset, int length, String text, AttributeSet attrs) <br />       throws BadLocationException {   <br /><br />        Document doc = fb.getDocument();<br />        int currentLength = doc.getLength();<br />        String currentContent = doc.getText(0, currentLength);<br />        String before = currentContent.substring(0, offset);<br />        String after = currentContent.substring(<br />             length+offset, currentLength);<br />        String newValue = before + <br />             (text == null ? "" : text) + after;<br />        currentValue = checkInput(newValue, offset);<br />        fb.replace(offset, length, text, attrs);<br />      }<br /><br />      private int checkInput(String proposedValue, int offset)<br />          throws BadLocationException {<br />        int newValue = 0;<br />        if (proposedValue.length() &gt; 0) {<br />          try {<br />            newValue = Integer.parseInt(proposedValue);<br />          } catch (NumberFormatException e) {<br />            throw new BadLocationException(<br />              proposedValue, offset);<br />          }<br />        }<br />        return newValue;<br />      }<br />   }</pre>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">再将这个</span>
				</font>Filter<font face="Lucida Sans Unicode"><span lang="zh-CN">应用于</span></font>Document<font face="Lucida Sans Unicode"><span lang="zh-CN">：</span></font></p>
		<pre>   package sdn;<br />   import javax.swing.*;<br />   import javax.swing.text.*;<br />   import java.awt.*;<br /><br />   public class NumericInputFilter {<br />     public static void main(String args[]) {<br />       Runnable runner = new Runnable() {<br />         public void run() {<br />           JFrame frame = new JFrame("Numeric Input Filter");<br />           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />           frame.setLayout(new GridLayout(2, 2));<br /><br />           frame.add(new JLabel("Number"));<br />           JTextField textFieldOne = new JTextField();<br /><strong>           Document doc= textFieldOne.getDocument();</strong><br /><strong>           DocumentFilter filterOne = </strong><strong>new IntegerDocumentFilter();</strong><br /><strong>           ((AbstractDocument)</strong><strong>doc).setDocumentFilter(filterOne);</strong><br /><strong>           textFieldOne.setDocument(doc);</strong><br />           frame.add(textFieldOne);<br /><br />           frame.add(new JLabel("All"));<br />           JTextField textFieldTwo = new JTextField();<br />           frame.add(textFieldTwo);<br /><br />           frame.setSize(250, 90);<br />           frame.setVisible(true);<br />         }<br />       };<br />       EventQueue.invokeLater(runner);<br />     }<br />   }</pre>
		<p style="margin-bottom: 0in;"> DocumentFilter<font face="Lucida Sans Unicode"><span lang="zh-CN">只能用于</span></font>Swing<font face="Lucida Sans Unicode"><span lang="zh-CN">中的与</span></font>text<font face="Lucida Sans Unicode"><span lang="zh-CN">有关的组件（而</span></font>InputVerifier<font face="Lucida Sans Unicode"><span lang="zh-CN">可用于任何组件）。除了这几种方法，在对于</span></font>TextField<font face="Lucida Sans Unicode"><span lang="zh-CN">而言，我们还有</span></font>JFormattedTextField<font face="Lucida Sans Unicode"><span lang="zh-CN">，很多时候用</span></font>JFormattedTextField<font face="Lucida Sans Unicode"><span lang="zh-CN">将是非常容易和简单的方式。</span></font></p>
		<p style="margin-bottom: 0in;">
				<font face="Lucida Sans Unicode">
						<span lang="zh-CN">
						</span>
				</font>
		</p>
注：这篇文章基本根据SDN的Core Java Tech Tips意译而来，代码基本跟其一致，另外还参考了M. Robinson &amp; P. Vorobiev的Swing, Chapter 11<img src ="http://www.blogjava.net/stevech/aggbug/40105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevech/" target="_blank">西门町学士</a> 2006-04-09 16:26 <a href="http://www.blogjava.net/stevech/archive/2006/04/09/40105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tiger pitfall</title><link>http://www.blogjava.net/stevech/archive/2006/03/16/35715.html</link><dc:creator>西门町学士</dc:creator><author>西门町学士</author><pubDate>Thu, 16 Mar 2006 14:03:00 GMT</pubDate><guid>http://www.blogjava.net/stevech/archive/2006/03/16/35715.html</guid><wfw:comment>http://www.blogjava.net/stevech/comments/35715.html</wfw:comment><comments>http://www.blogjava.net/stevech/archive/2006/03/16/35715.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/stevech/comments/commentRss/35715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevech/services/trackbacks/35715.html</trackback:ping><description><![CDATA[<span id="BlogViewId">在SDN踩到一个Tiger的pitfall：<br>package sdn;<br><br>import java.util.ArrayList;<br><br>public class BoxingEquality {<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /** Creates a new instance of BoxingEquality */<br>&nbsp;&nbsp;&nbsp; public BoxingEquality() {<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param args the command line arguments<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO code application logic here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList&lt;Integer&gt; list = new ArrayList&lt;Integer&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.printf("It is %b that i == j.\n", (i==j));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.printf("It is %b that list.get(0) == list.get(1).\n", (list.get(0)==list.get(1)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.printf("It is %b that list.get(0).equals(list.get(1)).", &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.get(0).equals(list.get(1)));<br>&nbsp;&nbsp;&nbsp; }&nbsp;<br>}<br><br>输出结果出乎意料：<br>It is true that i == j.<br>It is true that list.get(0) == list.get(1).&nbsp;&nbsp;&nbsp; // WHY???<br>It is true that list.get(0).equals(list.get(1)).<br><br>然而，仅仅将 i 和 j 的值改成1000：<br>int i = 1000;<br>int j = 1000;<br>就这一个改动后输出结果虽然符合了java的思维方式，但在这个context中却更显得怪异：<br>It is true that i == j.<br>It is false that list.get(0) == list.get(1). // Oops<br>It is true that list.get(0).equals(list.get(1)). <br><br>Sun给出的解释：<br>
The primitives are equal and the values of the boxed <code>int</code>s are equal. But this time the <code>int</code>s
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 <code>i</code> and <code>j</code> are 2, a single object is referenced from two different locations. When <code>i</code> and <code>j</code>
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.<br><br>呵呵，要不注意说不定还真中招了！</span><img src ="http://www.blogjava.net/stevech/aggbug/35715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevech/" target="_blank">西门町学士</a> 2006-03-16 22:03 <a href="http://www.blogjava.net/stevech/archive/2006/03/16/35715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>