??xml version="1.0" encoding="utf-8" standalone="yes"?>
Firefox2.0d新随WJS脚本异常Q!
|/__
换了风格
]]>
通常的做法是调用JFileChooser.showXXX()Ҏ昄文g选取对话框ƈ且选择一个文件后Q点?font face="Courier New">Approve 按钮Q默认情况下标有 "Open" ?"Save"Q?/font>Q?/font>当对话框关闭后用JFileChooser.getSelectedFile()Ҏ得到选取的文Ӟ或用JFileChooser.getSelectedFiles()取得选取的文件数l)Q然后再对被选取的文件有效性进行验证(例如Q文件的文g名是否合法、选取的\径下是否已有同名文g存在{等Q,如果验证不通过Q需要再ơ打开文g选择对话框进行选取?br />
昄Q验证没有通过的情况下Q文仉取对话框被反复的打开和关闭,影响用户体验?br />
我现在介l一个方法,在点M文g选取对话框上?font face="Courier New">Approve 按钮后,文g选取对话框关闭前寚w取的文件进行验证,如果验证没有通过Q那么对话框不关闭,直接q行下一ơ选择?br />
查看JFileChooser的APIQ可以发现这样一个方?public void approveSelection() Q这个方法会在用户单?Approve 按钮时由 UI 调用此方法。导致用等?APPROVE_SELECTION
的命令字W串Ȁ发一个操作事件?br />
那么Q我们现在可以选择l承JFileChooser再覆写这个方法,对选中文g的有效性验证写入这个方法中Q只有当验证通过时才调用类的approveSelection() 完成文g选取Q否则直接返回,l箋选择新的文g?br />
下面是我写的一个demo以供参考:
import java.io.File;
import javax.swing.JOptionPane;
/**
* ?JFileChooser 中进行文仉证的技?br /> * @author Chen Wei
* @email chenwei.mobi@gmail.com
*/
public class JFileChooserDemo extends javax.swing.JFileChooser{
public void approveSelection(){
File file = getSelectedFile();
// 验证文g名是否合?br /> if (!validateFileName(file.getName())) {
JOptionPane.showMessageDialog(getParent(), "文g名不能包含下列Q何字W之一Q\n \\ / : * ? \" < > |");
return;
}else{
super.approveSelection();
}
}
/**
* 验证输入字符串参数是否ؓ有效文g名?br /> * @param name 待验证的文g名字W串?br /> * @return 通过验证Q文件名无效q回 falseQ有效返?true?br /> */
public static boolean validateFileName(String name) {
if (name.indexOf('\\') != -1 || name.indexOf('/') != -1 ||
name.indexOf(':') != -1 || name.indexOf('*') != -1 ||
name.indexOf('?') != -1 || name.indexOf('"') != -1 ||
name.indexOf('<') != -1 || name.indexOf('>') != -1 ||
name.indexOf('|') != -1) {
return false;
} else {
return true;
}
}
public static void main(String[] args){
JFileChooserDemo chooser = new JFileChooserDemo();
chooser.showOpenDialog(null);
}
}
E序q行截图Q?br />
UTF-8应该是可以用来表CZ文的吧?我不知道q是不是Jdom的一个BUGQJdom 1.0Qbeta?0ơ的产物哦!Q。我google了一下,大家解决q个问题的办法无非是把Jdom的输出字W集改ؓGBK或者GB2312Q但是这样就会有一些副作用Q如果在没有特定字符集(GBK或者GB2312Q的操作pȝ上不是依然不能正解析吗Q一个比较好的解军_法是先把中文转换成Unicode~码在直接输出,E序解析XML后的时候再把Unicode~码转回中文没有问题了?/p>
于是我查看了JDK的文,截至Java 5好像都没有做cM转换的类可以直接使用Q但是我发现一个类 java.util.PropertiesQ它的源代码里有两个U有QprivateQ方?loadConvert (char[] in, int off, int len, char[] convtBuf) ?saveConvert(String theString, boolean escapeSpace) 其实是做特D字W和Unicode~码字符间{换的Q我把它们提取出来,单独包装C个类里就可以使用了?/p>
下面是我包装的类 CharacterSetToolkit
/*
* CharacterSetToolkit.java
*
* Created on 2006q?0?7? 下午2:06
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package mobi.chenwei.lang;
/**
* q行字符操作的工L
* @author Chen Wei
* @email chenwei.mobi@gmail.com
*/
public class CharacterSetToolkit {
/** Creates a new instance of CharacterSetToolkit */
public CharacterSetToolkit() {
}
private static final char[] hexDigit = {
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
};
private static char toHex(int nibble) {
return hexDigit[(nibble & 0xF)];
}
/**
* 字W串~码?Unicode ?br /> * @param theString 待{换成Unicode~码的字W串?br /> * @param escapeSpace 是否忽略I格?br /> * @return q回转换后Unicode~码的字W串?br /> */
public static String toUnicode(String theString, boolean escapeSpace) {
int len = theString.length();
int bufLen = len * 2;
if (bufLen < 0) {
bufLen = Integer.MAX_VALUE;
}
StringBuffer outBuffer = new StringBuffer(bufLen);
for(int x=0; x<len; x++) {
char aChar = theString.charAt(x);
// Handle common case first, selecting largest block that
// avoids the specials below
if ((aChar > 61) && (aChar < 127)) {
if (aChar == '\\') {
outBuffer.append('\\'); outBuffer.append('\\');
continue;
}
outBuffer.append(aChar);
continue;
}
switch(aChar) {
case ' ':
if (x == 0 || escapeSpace)
outBuffer.append('\\');
outBuffer.append(' ');
break;
case '\t':outBuffer.append('\\'); outBuffer.append('t');
break;
case '\n':outBuffer.append('\\'); outBuffer.append('n');
break;
case '\r':outBuffer.append('\\'); outBuffer.append('r');
break;
case '\f':outBuffer.append('\\'); outBuffer.append('f');
break;
case '=': // Fall through
case ':': // Fall through
case '#': // Fall through
case '!':
outBuffer.append('\\'); outBuffer.append(aChar);
break;
default:
if ((aChar < 0x0020) || (aChar > 0x007e)) {
outBuffer.append('\\');
outBuffer.append('u');
outBuffer.append(toHex((aChar >> 12) & 0xF));
outBuffer.append(toHex((aChar >> 8) & 0xF));
outBuffer.append(toHex((aChar >> 4) & 0xF));
outBuffer.append(toHex( aChar & 0xF));
} else {
outBuffer.append(aChar);
}
}
}
return outBuffer.toString();
}
/**
* ?Unicode 码{换成~码前的Ҏ字符丌Ӏ?br /> * @param in Unicode~码的字W数l?br /> * @param off 转换的v始偏U量?br /> * @param len 转换的字W长度?br /> * @param convtBuf 转换的缓存字W数l?br /> * @return 完成转换Q返回编码前的特D字W串?br /> */
public String fromUnicode(char[] in, int off, int len, char[] convtBuf) {
if (convtBuf.length < len) {
int newLen = len * 2;
if (newLen < 0) {
newLen = Integer.MAX_VALUE;
}
convtBuf = new char[newLen];
}
char aChar;
char[] out = convtBuf;
int outLen = 0;
int end = off + len;
while (off < end) {
aChar = in[off++];
if (aChar == '\\') {
aChar = in[off++];
if (aChar == 'u') {
// Read the xxxx
int value = 0;
for (int i = 0; i < 4; i++) {
aChar = in[off++];
switch (aChar) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
value = (value << 4) + aChar - '0';
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
value = (value << 4) + 10 + aChar - 'a';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
value = (value << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
}
}
out[outLen++] = (char) value;
} else {
if (aChar == 't') {
aChar = '\t';
} else if (aChar == 'r') {
aChar = '\r';
} else if (aChar == 'n') {
aChar = '\n';
} else if (aChar == 'f') {
aChar = '\f';
}
out[outLen++] = aChar;
}
} else {
out[outLen++] = (char) aChar;
}
}
return new String(out, 0, outLen);
}
}
更新内容Q?/p>
1、上L中环、外环以内的数据dQ这样一来整个上L数据全了,大家惛_哪,可以看到哪了?/p>
2、三l实景窗口变大,看高g那么累了Q)
3、操作按钮重新设计,q样大家可以方便实现在街道中行走、全屏浏览等很酷的体验?/p>
4、实景地囑ֈ享:可以方便在地图添加文字表qͼ如“我的家”,q过msnQqqQblogQ论坛等方式与他人分?/p>
界面先睹为快Q?/p>