只能输入文件名和只能输入数字的文本框

本文介绍了一种用于限制用户输入的文本框组件,包括只能输入文件名或指定路径的文本框及仅能输入指定范围内数字的文本框。通过自定义Document子类实现了输入验证功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.browser;



import java.awt.Toolkit;

import java.io.File;

import java.util.StringTokenizer;



import javax.swing.JTextField;

import javax.swing.text.AttributeSet;

import javax.swing.text.BadLocationException;

import javax.swing.text.Document;

import javax.swing.text.PlainDocument;



/**

 * 只能输入文件名的文本框

 * @author dl

 */

public class JFileNameTextField extends javax.swing.JTextField{

	public static void main(String[] args) {

		// TODO Auto-generated method stub	

		//测试代码

		/*JFrame frame = new JFrame("文本框的内容限制测试");

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		

		frame.add(new JFileNameTextField(true), BorderLayout.CENTER);

		frame.add(new JNumTextField(1, 999), BorderLayout.NORTH);

		frame.setSize(300, 150);

		frame.setVisible(true);*/

	}

	

	/**

     *<br>方法说明:初始化

     *<br>输入参数:isPath 是否可以输入带目录的文件名

     *<br>返回类型:

     */

	public JFileNameTextField(boolean isPath)   {  

		super(); 

		FileNameDocument fd = (FileNameDocument)this.getDocument();

		fd.setIsPath(isPath);

	}  

  

	protected Document createDefaultModel()   {  

		return new FileNameDocument(this);  

	}   

}





/**

 * 判断输入字符是否符合文件名规范的过滤实现

 * @author dl

 */

class FileNameDocument extends PlainDocument {

	private boolean isPath = false; /**是否可以输入带目录的文件名*/

	private JTextField parent = null; /**PlainDocument所在的文本框*/

	private static Toolkit toolkit = Toolkit.getDefaultToolkit();



	public FileNameDocument(JTextField field) {

		super();

		this.parent = field;

	}



	public void setIsPath(boolean isPath) {

		this.isPath = isPath;

	}



	public void insertString(int offset, String text, AttributeSet attributes)

			throws BadLocationException {

		//得到当前文本框的内容

		String strValue = parent.getText();

		strValue = strValue.substring(0, offset) + text

				+ strValue.substring(offset, strValue.length());



		//判断得到的文本是否符合文件名的语法规范

		if (isPath) {

			if (!isNormallyPathString(strValue)) {

				toolkit.beep();

				return;

			}



		} else {

			if (!isNormallyNameString(strValue)) {

				toolkit.beep();

				return;

			}

		}

		super.insertString(offset, text, attributes);

	}

	

	/**

     *<br>方法说明:判断文件路径是否合法

     *<br>输入参数:strName 文件路径

     *<br>返回类型:符合语法规则的文件路径

     */

	public static boolean isNormallyPathString(String strName) {

		int pos = strName.indexOf(":");

		if (strName.indexOf("////") != -1)

			return false;

		if (pos == -1) {

			StringTokenizer st = new StringTokenizer(strName, "//");

			while (st.hasMoreTokens()) {

				String strTemp = st.nextToken();

				if (!isNormallyNameString(strTemp)) {

					return false;

				}

			}

		} else {

			String strPath = strName.substring(0, pos);

			if (strPath.length() == 1) {

				java.lang.Character fq = strPath.toLowerCase().charAt(0);

				java.lang.Character fq1 = strName.toLowerCase().charAt(pos);

				if (fq1 != ':')

					return false;

				if (strName.length() > pos + 1) {

					java.lang.Character fq2 = strName.toLowerCase().charAt(

							pos + 1);

					if (fq2 != '//')

						return false;

				}

				if (fq >= 'c' && fq <= 'z') {

					if (!new File(fq + ":").exists())

						return false;

				}

			} else {

				return false;

			}



			StringTokenizer st = new StringTokenizer(strName.substring(pos + 1,

					strName.length()), "//");

			while (st.hasMoreTokens()) {

				String strTemp = st.nextToken();

				if (!isNormallyNameString(strTemp)) {

					return false;

				}

			}

		}

		return true;

	}



	/**

     *<br>方法说明:判断文件名是否合法

     *<br>输入参数:strName 文件名

     *<br>返回类型:符合语法规则的文件名

     */

	public static boolean isNormallyNameString(String strName) {

		int pos = strName.indexOf("://");

		if (pos == -1) {



		}



		String strText = "/t/r/n///:*?/"<>|^___FCKpd___0quot;;

		for (int i = 0; i < strName.length(); ++i) {

			String ch = String.valueOf(strName.charAt(i));

			if (strText.indexOf(ch) != -1) {

				return false;

			}

		}

		return true;

	}

}  

package com.browser;



import java.awt.Toolkit;

import javax.swing.JTextField;

import javax.swing.text.AttributeSet;

import javax.swing.text.BadLocationException;

import javax.swing.text.Document;

import javax.swing.text.PlainDocument;



/**

 * 只能输入数字的文本框

 * @author dl

 */

public class JNumTextField extends javax.swing.JTextField {

	

	/**

     *<br>方法说明:初始化

     *<br>输入参数:min 允许输入的数值的最小值; max 允许输入的数值的最大值

     *<br>返回类型:

     */

	public JNumTextField(int min, int max) {

		super();

		NumericDocument nd = (NumericDocument) this.getDocument();

		nd.setMax(max);

		nd.setMin(min);

		nd.setTextField(this);

	}



	protected Document createDefaultModel() {

		return new NumericDocument(0, 100);

	}

}



/**

 * 判断输入内容是否属于允许范围内的数值的过滤实现

 * @author dl

 */

class NumericDocument extends PlainDocument {

	protected int maxDigits = -1; /**允许输入的数值的最大值*/

	protected int minDigits = -1; /**允许输入的数值的最小值*/

	protected JTextField parent = null; /**PlainDocument所在的文本框*/

	protected static Toolkit toolkit = Toolkit.getDefaultToolkit();



	public NumericDocument(int min, int max) {

		super();

		maxDigits = max;

		minDigits = min;

	}



	public void setMax(int max) {

		maxDigits = max;

	}



	public void setMin(int min) {

		minDigits = min;

	}



	public void setTextField(JTextField parent) {

		this.parent = parent;

	}



	public void insertString(int offset, String text, AttributeSet attributes)

			throws BadLocationException {

		//得到当前文本框的内容

		String strValue = parent.getText();

		strValue = strValue.substring(0, offset) + text

				+ strValue.substring(offset, strValue.length());

		

		//判断输入内容是否属于允许范围内的数值

		int value = -1;

		try {

			value = Integer.parseInt(strValue);

		} catch (NumberFormatException ex) {

			toolkit.beep();

			return;

		}

		if (value > maxDigits || value < minDigits) {

			toolkit.beep();

			return;

		}



		super.insertString(offset, text, attributes);

	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值