﻿<?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-Do you drink java?</title><link>http://www.blogjava.net/leon/</link><description>&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;像写情书一样coding</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 18:58:42 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 18:58:42 GMT</pubDate><ttl>60</ttl><item><title>发发牢骚</title><link>http://www.blogjava.net/leon/archive/2006/11/23/83075.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Thu, 23 Nov 2006 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/leon/archive/2006/11/23/83075.html</guid><wfw:comment>http://www.blogjava.net/leon/comments/83075.html</wfw:comment><comments>http://www.blogjava.net/leon/archive/2006/11/23/83075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leon/comments/commentRss/83075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leon/services/trackbacks/83075.html</trackback:ping><description><![CDATA[IE7访问我的部落格页面布局异常！<br /><br />Firefox2.0添加新随笔JS脚本异常！！<br /><br />|/__<br /><br /><br />换了风格<img src ="http://www.blogjava.net/leon/aggbug/83075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leon/" target="_blank">leon</a> 2006-11-23 16:49 <a href="http://www.blogjava.net/leon/archive/2006/11/23/83075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Swing]在 JFileChooser 中进行文件验证的小技巧</title><link>http://www.blogjava.net/leon/archive/2006/11/23/83023.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Thu, 23 Nov 2006 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/leon/archive/2006/11/23/83023.html</guid><wfw:comment>http://www.blogjava.net/leon/comments/83023.html</wfw:comment><comments>http://www.blogjava.net/leon/archive/2006/11/23/83023.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/leon/comments/commentRss/83023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leon/services/trackbacks/83023.html</trackback:ping><description><![CDATA[
		<p>我们在做GUI编程的时候经常需要用到JFileChooser组件构造一个文件选取对话框来为用户提供打开文件、保存文件等操作。<br /><br />通常的做法是调用JFileChooser.showXXX()方法显示文件选取对话框并且选择一个文件后，点击<font face="Courier New"><font face="Times New Roman">Approve 按钮（默认情况下标有 "Open" 或 "Save"）</font>，</font>当对话框关闭后使用JFileChooser.getSelectedFile()方法得到选取的文件（或使用JFileChooser.getSelectedFiles()取得选取的文件数组），然后再对被选取的文件有效性进行验证（例如，文件的文件名是否合法、选取的路径下是否已有同名文件存在等等），如果验证不通过，需要再次打开文件选择对话框进行选取。<br /><br />显然，验证没有通过的情况下，文件选取对话框被反复的打开和关闭，影响用户体验。<br /><br />我现在介绍一个方法，在点击了文件选取对话框上的<font face="Courier New"><font face="Times New Roman">Approve 按钮</font>后，</font><font face="Times New Roman">文件选取对话框关闭前对选取的文件进行验证，如果验证没有通过，那么对话框不关闭，直接进行下一次选择。<br /><br />查看JFileChooser的API，可以发现这样一个方法 <u><font color="#000000"><strong>public void approveSelection()</strong></font></u> ，这个方法会在用户单击 Approve 按钮时由 UI 调用此方法。导致使用等于 <code>APPROVE_SELECTION</code> 的命令字符串激发一个操作事件。<br /><br />那么，我们现在可以选择继承JFileChooser再覆写这个方法，将对选中文件的有效性验证写入这个方法中，只有当验证通过时才调用超类的approveSelection() 完成文件选取，否则直接返回，继续选择新的文件。<br /><br />下面是我写的一个demo以供参考：<br /><br />import java.io.File;<br />import javax.swing.JOptionPane;</font></p>
		<p>
				<font face="Times New Roman">/**<br /> * 在 JFileChooser 中进行文件验证的小技巧<br /> * @author Chen Wei<br /> * @email <a href="mailto:chenwei.mobi@gmail.com">chenwei.mobi@gmail.com</a><br /> */<br />public class JFileChooserDemo extends javax.swing.JFileChooser{<br />    <br />    public void approveSelection(){<br />        File file = getSelectedFile();<br />        <br />        // 验证文件名是否合法<br />        if (!validateFileName(file.getName())) {<br />            JOptionPane.showMessageDialog(getParent(), "文件名不能包含下列任何字符之一：\n \\ / : * ? \" &lt; &gt; |");<br />            return;<br />        }else{<br />            super.approveSelection();<br />        }<br />    }<br />    <br />    /**<br />     * 验证输入字符串参数是否为有效文件名。<br />     * @param name 待验证的文件名字符串。<br />     * @return 通过验证，文件名无效返回 false，有效返回 true。<br />     */<br />    public static boolean validateFileName(String name) {<br />        if (name.indexOf('\\') != -1 || name.indexOf('/') != -1 ||<br />            name.indexOf(':') != -1 || name.indexOf('*') != -1 ||<br />            name.indexOf('?') != -1 || name.indexOf('"') != -1 ||<br />            name.indexOf('&lt;') != -1 || name.indexOf('&gt;') != -1 ||<br />            name.indexOf('|') != -1) {</font>
		</p>
		<p>
				<font face="Times New Roman">            return false;<br />        } else {<br />            return true;<br />        }<br />    }<br />    <br />    public static void main(String[] args){<br />        JFileChooserDemo chooser = new JFileChooserDemo();<br />        chooser.showOpenDialog(null);<br />    }<br />}</font>
				<br />
				<br />程序运行截图：<br /><img title="JFileChooserDemo.jpg" height="360" alt="JFileChooserDemo.jpg" src="http://www.blogjava.net/images/blogjava_net/leon/program/JFileChooserDemo.jpg" width="508" border="0" /></p>
<img src ="http://www.blogjava.net/leon/aggbug/83023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leon/" target="_blank">leon</a> 2006-11-23 14:15 <a href="http://www.blogjava.net/leon/archive/2006/11/23/83023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[news]chenwei.mobi</title><link>http://www.blogjava.net/leon/archive/2006/10/30/78091.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Mon, 30 Oct 2006 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/leon/archive/2006/10/30/78091.html</guid><wfw:comment>http://www.blogjava.net/leon/comments/78091.html</wfw:comment><comments>http://www.blogjava.net/leon/archive/2006/10/30/78091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leon/comments/commentRss/78091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leon/services/trackbacks/78091.html</trackback:ping><description><![CDATA[		<font color="#ff0000">本博搬家到CSDN，网址 http://blog.csdn.net/chenweionline ,可以通过</font>
<a href="http://www.chenwei.mobi/">www.chenwei.mobi</a>
<font color="#ff0000">访问！</font><img src ="http://www.blogjava.net/leon/aggbug/78091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leon/" target="_blank">leon</a> 2006-10-30 17:16 <a href="http://www.blogjava.net/leon/archive/2006/10/30/78091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[tips]使用Java将中文字符转换成Unicode编码</title><link>http://www.blogjava.net/leon/archive/2006/10/28/77846.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Sat, 28 Oct 2006 12:53:00 GMT</pubDate><guid>http://www.blogjava.net/leon/archive/2006/10/28/77846.html</guid><wfw:comment>http://www.blogjava.net/leon/comments/77846.html</wfw:comment><comments>http://www.blogjava.net/leon/archive/2006/10/28/77846.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/leon/comments/commentRss/77846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leon/services/trackbacks/77846.html</trackback:ping><description><![CDATA[
		<p>这两天操作XML使用到了Jdom，在创建XML文件并输出到硬盘的时候遇到一个中文编码的问题：Jdom默认输出的XML编码是UTF-8，但是文档中如果出现中文字符那么该中文字符就会变成乱码，造成XML文件无法被正确解析。</p>
		<p>UTF-8应该是可以用来表示中文的吧？我不知道这是不是Jdom的一个BUG（Jdom 1.0，beta了10次的产物哦！）。我google了一下，大家解决这个问题的办法无非是把Jdom的输出字符集改为GBK或者GB2312，但是这样就会有一些副作用，如果在没有特定字符集（GBK或者GB2312）的操作系统上不是依然不能正确解析吗？一个比较好的解决办法是先把中文转换成Unicode编码在直接输出，程序解析XML后的时候再把Unicode编码转回中文就没有问题了。</p>
		<p>于是我查看了JDK的文档，截至Java 5好像都没有做类似转换的类可以直接使用，但是我发现一个类 java.util.Properties，它的源代码里有两个私有（private）方法 loadConvert (char[] in, int off, int len, char[] convtBuf) 和 saveConvert(String theString, boolean escapeSpace) 其实就是做特殊字符和Unicode编码字符间转换的，我把它们提取出来，单独包装到一个类里就可以使用了。</p>
		<p>下面是我包装的类 CharacterSetToolkit</p>
		<p>/*<br /> * CharacterSetToolkit.java<br /> *<br /> * Created on 2006年10月27日, 下午2:06<br /> *<br /> * To change this template, choose Tools | Template Manager<br /> * and open the template in the editor.<br /> */</p>
		<p>package mobi.chenwei.lang;</p>
		<p>/**<br /> * 进行字符操作的工具类<br /> * @author Chen Wei<br /> * @email <a href="mailto:chenwei.mobi@gmail.com">chenwei.mobi@gmail.com</a><br /> */<br />public class CharacterSetToolkit {<br />    <br />    /** Creates a new instance of CharacterSetToolkit */<br />    public CharacterSetToolkit() {<br />    }<br />    <br />    private static final char[] hexDigit = {<br />        '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'<br />    };<br />    <br />    private static char toHex(int nibble) {<br />        return hexDigit[(nibble &amp; 0xF)];<br />    }<br />    <br />    /**<br />     * 将字符串编码成 Unicode 。<br />     * @param theString 待转换成Unicode编码的字符串。<br />     * @param escapeSpace 是否忽略空格。<br />     * @return 返回转换后Unicode编码的字符串。<br />     */<br />    public static String toUnicode(String theString, boolean escapeSpace) {<br />        int len = theString.length();<br />        int bufLen = len * 2;<br />        if (bufLen &lt; 0) {<br />            bufLen = Integer.MAX_VALUE;<br />        }<br />        StringBuffer outBuffer = new StringBuffer(bufLen);</p>
		<p>        for(int x=0; x&lt;len; x++) {<br />            char aChar = theString.charAt(x);<br />            // Handle common case first, selecting largest block that<br />            // avoids the specials below<br />            if ((aChar &gt; 61) &amp;&amp; (aChar &lt; 127)) {<br />                if (aChar == '\\') {<br />                    outBuffer.append('\\'); outBuffer.append('\\');<br />                    continue;<br />                }<br />                outBuffer.append(aChar);<br />                continue;<br />            }<br />            switch(aChar) {<br />                case ' ':<br />                    if (x == 0 || escapeSpace) <br />                        outBuffer.append('\\');<br />                    outBuffer.append(' ');<br />                    break;<br />                case '\t':outBuffer.append('\\'); outBuffer.append('t');<br />                          break;<br />                case '\n':outBuffer.append('\\'); outBuffer.append('n');<br />                          break;<br />                case '\r':outBuffer.append('\\'); outBuffer.append('r');<br />                          break;<br />                case '\f':outBuffer.append('\\'); outBuffer.append('f');<br />                          break;<br />                case '=': // Fall through<br />                case ':': // Fall through<br />                case '#': // Fall through<br />                case '!':<br />                    outBuffer.append('\\'); outBuffer.append(aChar);<br />                    break;<br />                default:<br />                    if ((aChar &lt; 0x0020) || (aChar &gt; 0x007e)) {<br />                        outBuffer.append('\\');<br />                        outBuffer.append('u');<br />                        outBuffer.append(toHex((aChar &gt;&gt; 12) &amp; 0xF));<br />                        outBuffer.append(toHex((aChar &gt;&gt;  8) &amp; 0xF));<br />                        outBuffer.append(toHex((aChar &gt;&gt;  4) &amp; 0xF));<br />                        outBuffer.append(toHex( aChar        &amp; 0xF));<br />                    } else {<br />                        outBuffer.append(aChar);<br />                    }<br />            }<br />        }<br />        return outBuffer.toString();<br />    }<br />    <br />    /**<br />     * 从 Unicode 码转换成编码前的特殊字符串。<br />     * @param in Unicode编码的字符数组。<br />     * @param off 转换的起始偏移量。<br />     * @param len 转换的字符长度。<br />     * @param convtBuf 转换的缓存字符数组。<br />     * @return 完成转换，返回编码前的特殊字符串。<br />     */<br />    public String fromUnicode(char[] in, int off, int len, char[] convtBuf) {<br />        if (convtBuf.length &lt; len) {<br />            int newLen = len * 2;<br />            if (newLen &lt; 0) {<br />                newLen = Integer.MAX_VALUE;<br />            }<br />            convtBuf = new char[newLen];<br />        }<br />        char aChar;<br />        char[] out = convtBuf;<br />        int outLen = 0;<br />        int end = off + len;</p>
		<p>        while (off &lt; end) {<br />            aChar = in[off++];<br />            if (aChar == '\\') {<br />                aChar = in[off++];<br />                if (aChar == 'u') {<br />                    // Read the xxxx<br />                    int value = 0;<br />                    for (int i = 0; i &lt; 4; i++) {<br />                        aChar = in[off++];<br />                        switch (aChar) {<br />                        case '0':<br />                        case '1':<br />                        case '2':<br />                        case '3':<br />                        case '4':<br />                        case '5':<br />                        case '6':<br />                        case '7':<br />                        case '8':<br />                        case '9':<br />                            value = (value &lt;&lt; 4) + aChar - '0';<br />                            break;<br />                        case 'a':<br />                        case 'b':<br />                        case 'c':<br />                        case 'd':<br />                        case 'e':<br />                        case 'f':<br />                            value = (value &lt;&lt; 4) + 10 + aChar - 'a';<br />                            break;<br />                        case 'A':<br />                        case 'B':<br />                        case 'C':<br />                        case 'D':<br />                        case 'E':<br />                        case 'F':<br />                            value = (value &lt;&lt; 4) + 10 + aChar - 'A';<br />                            break;<br />                        default:<br />                            throw new IllegalArgumentException(<br />                                    "Malformed <a href="file://\\uxxxx">\\uxxxx</a> encoding.");<br />                        }<br />                    }<br />                    out[outLen++] = (char) value;<br />                } else {<br />                    if (aChar == 't') {<br />                        aChar = '\t';<br />                    } else if (aChar == 'r') {<br />                        aChar = '\r';<br />                    } else if (aChar == 'n') {<br />                        aChar = '\n';<br />                    } else if (aChar == 'f') {<br />                        aChar = '\f';<br />                    }<br />                    out[outLen++] = aChar;<br />                }<br />            } else {<br />                out[outLen++] = (char) aChar;<br />            }<br />        }<br />        return new String(out, 0, outLen);<br />    }<br />}<br /></p>
<img src ="http://www.blogjava.net/leon/aggbug/77846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leon/" target="_blank">leon</a> 2006-10-28 20:53 <a href="http://www.blogjava.net/leon/archive/2006/10/28/77846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[ad]city8升级预告</title><link>http://www.blogjava.net/leon/archive/2006/09/23/71459.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Sat, 23 Sep 2006 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/leon/archive/2006/09/23/71459.html</guid><wfw:comment>http://www.blogjava.net/leon/comments/71459.html</wfw:comment><comments>http://www.blogjava.net/leon/archive/2006/09/23/71459.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/leon/comments/commentRss/71459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leon/services/trackbacks/71459.html</trackback:ping><description><![CDATA[
		<p>9月26日（下周二），city8(<a href="http://www.city8.com">www.city8.com</a>)将进行一次升级。</p>
		<p>更新内容：</p>
		<p>1、上海的中环、外环以内的数据添加，这样一来整个上海的数据就全了，大家想去哪，就可以看到哪了。</p>
		<p> 2、三维实景窗口变大，看高楼不那么累了：）</p>
		<p>3、操作按钮重新设计，这样大家可以方便实现在街道中行走、全屏浏览等很酷的体验。</p>
		<p>4、实景地图分享：可以方便在地图添加文字表述，如“我的家”，并通过msn，qq，blog，论坛等方式与他人分享</p>
		<p>界面先睹为快：</p>
		<p>首页：<br /><a title="homepage" href="http://blog.city8.com/?pp_album=main&amp;pp_cat=&amp;pp_image=homepage.JPG"><img class="pp_image" height="325" alt="homepage" src="http://blog.city8.com/wp-content/photos/homepage.JPG" width="450" /></a><br /><br />搜索结果页面：<br /><a title="main search" href="http://blog.city8.com/?pp_album=main&amp;pp_cat=&amp;pp_image=main_search.JPG"><img class="pp_image" height="300" alt="main search" src="http://blog.city8.com/wp-content/photos/main_search.JPG" width="450" /></a></p>
<img src ="http://www.blogjava.net/leon/aggbug/71459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leon/" target="_blank">leon</a> 2006-09-23 14:25 <a href="http://www.blogjava.net/leon/archive/2006/09/23/71459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>