`

带数据输入校验 、长度的JTextField

 
阅读更多
带数据输入校验 、长度的JTextField
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

import org.apache.commons.lang.StringUtils;

import com.sf.framework.i18n.Messages;
import com.sf.module.pcss.core.message.MessageManager;

/**
 * 可配置长度输入框</p>  
 * 输入长度 控制,默认最大输入100</p>
 * @author luojialin
 * @since 2014-2-24
 */
public class SFTextField extends JTextField {
	private static final long serialVersionUID = 1547141437224361583L;

	/**
	 * 最大输入数
	 */
	private int defaultMaxChar = 100;
	
	/**
	 * 最小输入数据长度
	 */
	private int defaultMinChar = 0;
	
	/**
	 * 自定义输入约束
	 */
	private String restrict ="";
	
	
	private String defaultinputtype = "ignore";	
	/**
	 *任意输入 
	 */
	public static String IGNORE = "ignore";
	/**
	 * 大写、小写输入
	 */
	public static String LETTER = "letter";
	/**
	 * 数字
	 */
	public static String NUMBER = "number";
	/**
	 * 数字 字母 输入
	 */
	public static String NUMBER_LETTER = "number_letter";
	
	
	public SFTextField(){
		
		initMenuItem();
		this.addKeyListener(new KeyAdapter(){
			
			public void keyTyped(KeyEvent e) { 
				if(defaultinputtype.equals(SFTextField.NUMBER)){
					String numStr = "0123456789." + (char) 8;
		            if (numStr.indexOf(e.getKeyChar()) < 0) {
		                e.consume();
		            }
				}
				else if(defaultinputtype.equals(SFTextField.NUMBER_LETTER)){
					String str = "0123456789ABCDEFGHIZKLMNOPQRSTUVWXYZabcdefghizklmnopqrstuvwxyz";
					if (str.indexOf(e.getKeyChar()) < 0) {
		                e.consume();
		            }
				}
				else if(defaultinputtype.equals(SFTextField.LETTER)){
					String str = "ABCDEFGHIZKLMNOPQRSTUVWXYZabcdefghizklmnopqrstuvwxyz";
					if (str.indexOf(e.getKeyChar()) < 0) {
		                e.consume();
		            }
				}
				
				int ch = e.getKeyChar();
				
				//1:ctrl+A  3:ctrl+C   22:ctrl+V
				if(ch == 1 || ch == 3|| ch == 22){
					
				}else{
					boolean isall = isSelectAll();
					if(isall){
						clear();
					}
				}
				
				if (getText().trim().length() >= defaultMaxChar){
					e.consume();
				}
				
				if(getText().trim().length() < defaultMinChar){
					MessageManager.getInstance().error("",Messages.getString("error.minchar.length")+defaultMinChar);				
				}
			}
		});
	}
	
	/**
	 * 判断文本框是否为全选状态
	 */
	public boolean isSelectAll(){
		String seltext = getSelectedText();
		String text = getText();
		if(seltext != null && seltext.equals(text)){
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 清除文本框数据
	 */
	public void clear(){
		setText(StringUtils.EMPTY);
	}

	/**
	 * 获取最大的输入长度
	 * @return
	 */
	public int getDefaultMaxChar() {
		return defaultMaxChar;
	}


	/**
	 * 设置只能输入的最大长度
	 * @param defaultMaxChar
	 */
	public void setDefaultMaxChar(int defaultMaxChar) {
		this.defaultMaxChar = defaultMaxChar;
	}




	public String getDefaultinputtype() {
		return defaultinputtype;
	}


	public void setDefaultinputtype(String defaultinputtype) {
		this.defaultinputtype = defaultinputtype;
	}


	/**
	 * 获取输入约束
	 * @return
	 */
	public String getRestrict() {
		return restrict;
	}


	/**
	 * 设置输入约束
	 * @param restrict
	 */
	public void setRestrict(String restrict) {
		this.restrict = restrict;
	}


	public int getDefaultMinChar() {
		return defaultMinChar;
	}


	public void setDefaultMinChar(int defaultMinChar) {
		this.defaultMinChar = defaultMinChar;
	}
	
	
	// 右键菜单
		private JPopupMenu pop;
		// 弹出菜单
		private JMenuItem copy = null, paste = null, cut = null ,selectAll = null; // 三个功能菜单

		private void initMenuItem() {
			pop = new JPopupMenu();
			pop.add(copy = new JMenuItem("复制"));
			pop.add(paste = new JMenuItem("粘贴"));
			pop.add(cut = new JMenuItem("剪切"));
			pop.add(selectAll = new JMenuItem("全选"));
			copy.setAccelerator(KeyStroke.getKeyStroke('C', InputEvent.CTRL_MASK));
			paste.setAccelerator(KeyStroke.getKeyStroke('V', InputEvent.CTRL_MASK));
			cut.setAccelerator(KeyStroke.getKeyStroke('X', InputEvent.CTRL_MASK));
			selectAll.setAccelerator(KeyStroke.getKeyStroke('A', InputEvent.CTRL_MASK));
			copy.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					menuAction(1);
				}
			});
			paste.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					menuAction(2);
				}
			});
			cut.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					menuAction(3);
				}
			});
			selectAll.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					menuAction(4);
				}
			});
			this.add(pop);
			this.addMouseListener(new MouseAdapter() {
				@Override
				public void mousePressed(MouseEvent e) {
					if (e.getButton() == MouseEvent.BUTTON3) {
						menuPop(e.getX(), e.getY());
					}
				}
			});
		}

		/**
		 * 菜单动作
		 * 
		 * @param type
		 */
		private void menuAction(int type) {
			if (type == 1)
				this.copy();
			else if (type == 2)
				this.paste();
			else if (type == 3)
				this.cut();
			else if (type == 4){
				this.selectAll();
			}
		}

		
		
		/**
		 * 弹出右键菜单
		 * 
		 * @param x
		 * @param y
		 */
		private void menuPop(int x, int y) {
			copy.setEnabled(isCanCopy());
			paste.setEnabled(isClipboardString() && this.isEnabled()
					&& this.isEditable());
			cut.setEnabled(isCanCopy() && this.isEnabled() && this.isEditable());
			pop.show(this, x, y);
		}

		/**
		 * 剪切板中是否有文本数据可供粘贴
		 * 
		 * @return true
		 */
		private boolean isClipboardString() {
			Clipboard clipboard = this.getToolkit().getSystemClipboard();
			Transferable content = clipboard.getContents(this);
			try {
				if (content.getTransferData(DataFlavor.stringFlavor) instanceof String) {
					return true;
				}
			} catch (Exception e) {
			}
			return false;
		}

		/**
		 * 文本组件中是否具备复制的条件
		 * 
		 * @return true为具备
		 */
		private boolean isCanCopy() {
			int start = this.getSelectionStart();
			int end = this.getSelectionEnd();
			return start != end;
		}
	
	
}
 
JTextArea  
import java.awt.Font;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.im.InputMethodRequests;

import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;

public class SFTextArea extends JTextArea {
	private static final long serialVersionUID = -7624053424295389747L;

	public SFTextArea(int rows, int columns) {
		super(rows,columns);
		this.setFont(new Font("微软雅黑", Font.PLAIN, 14));
		initMenuItem();
	}
	
	public SFTextArea() {
		super();
		this.setFont(new Font("微软雅黑", Font.PLAIN, 14));
		initMenuItem();
	}

	@Override
	public InputMethodRequests getInputMethodRequests() {
		return null;
	}

	// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
	// 右键菜单
	private JPopupMenu pop;
	// 弹出菜单
	private JMenuItem copy = null, paste = null, cut = null,selectAll = null; // 三个功能菜单

	private void initMenuItem() {
		pop = new JPopupMenu();
		pop.add(copy = new JMenuItem("复制"));
		pop.add(paste = new JMenuItem("粘贴"));
		pop.add(cut = new JMenuItem("剪切"));
		pop.add(selectAll = new JMenuItem("全选"));
		copy.setAccelerator(KeyStroke.getKeyStroke('C', InputEvent.CTRL_MASK));
		paste.setAccelerator(KeyStroke.getKeyStroke('V', InputEvent.CTRL_MASK));
		cut.setAccelerator(KeyStroke.getKeyStroke('X', InputEvent.CTRL_MASK));
		selectAll.setAccelerator(KeyStroke.getKeyStroke('A', InputEvent.CTRL_MASK));
		copy.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				menuAction(1);
			}
		});
		paste.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				menuAction(2);
			}
		});
		cut.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				menuAction(3);
			}
		});
		selectAll.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				menuAction(4);
			}
		});
		this.add(pop);
		this.addMouseListener(new MouseAdapter() {
			@Override
			public void mousePressed(MouseEvent e) {
				if (e.getButton() == MouseEvent.BUTTON3) {
					menuPop(e.getX(), e.getY());
				}
			}
		});
	}

	/**
	 * 菜单动作
	 * 
	 * @param type
	 */
	private void menuAction(int type) {
		if (type == 1)
			this.copy();
		else if (type == 2)
			this.paste();
		else if (type == 3)
			this.cut();
		else if (type == 4){
			this.selectAll();
		}
	}

	/**
	 * 弹出右键菜单
	 * 
	 * @param x
	 * @param y
	 */
	private void menuPop(int x, int y) {
		copy.setEnabled(isCanCopy());
		paste.setEnabled(isClipboardString() && this.isEnabled()
				&& this.isEditable());
		cut.setEnabled(isCanCopy() && this.isEnabled() && this.isEditable());
		pop.show(this, x, y);
	}

	/**
	 * 剪切板中是否有文本数据可供粘贴
	 * 
	 * @return true
	 */
	private boolean isClipboardString() {
		Clipboard clipboard = this.getToolkit().getSystemClipboard();
		Transferable content = clipboard.getContents(this);
		try {
			if (content.getTransferData(DataFlavor.stringFlavor) instanceof String) {
				return true;
			}
		} catch (Exception e) {
		}
		return false;
	}

	/**
	 * 文本组件中是否具备复制的条件
	 * 
	 * @return true为具备
	 */
	private boolean isCanCopy() {
		int start = this.getSelectionStart();
		int end = this.getSelectionEnd();
		return start != end;
	}
}
 
分享到:
评论

相关推荐

    文本框输入不合理数据时进行验证.rar

    "文本框输入不合理数据时进行验证"这个主题涉及到的是前端和后端开发中的数据验证技术,确保用户输入的数据符合预设的规则,防止错误、非法或恶意的数据进入系统。以下是对这一主题的详细阐述: 1. **前端验证**: ...

    如何在Java NetBeans中为JTextField设置最大字符长度

    在实际应用中,我们可能需要限制用户在`JTextField`中输入的最大字符数,以确保数据的有效性和防止不必要的错误。在NetBeans IDE中,虽然没有直接的图形化方式来设置`JTextField`的最大字符长度,但可以通过编程方式...

    JAVA文本框验证大全

    - Apache Commons项目提供了一套BeanUtils工具,其中包含了数据校验的功能,可以用于文本框验证。 8. **JSR 303/JSR 349 (Bean Validation)**: - 在Web应用中,可以利用Bean Validation框架进行服务器端验证,将...

    swing 山寨版验证框架

    通过这样的设计,开发者可以方便地将`MQDocument`应用于Swing的`JTextField`或其他基于`Document`的组件,实现对用户输入的有效控制,保证数据的质量和系统的稳定性。同时,由于框架的灵活性,它可以适应各种不同的...

    基于netbeans的Java gui人事管理系统

    2. **注册校验**:在注册过程中,系统需要确保输入的数据符合预设规则,例如,用户名长度限制、密码强度验证等。这些校验可以通过编写自定义验证函数或者使用现有的验证框架如Apache Commons Lang的Validator类来...

    仿Windows的IP和MAC输入框

    在设计用户界面时,为用户提供专门的输入框来输入这些地址可以提高用户体验和数据的准确性。 要创建仿Windows的IP输入框,我们可以使用`JFormattedTextField`,它允许我们限制用户输入的格式。对于IP地址,我们需要...

    学生信息管理系统 java

    - 数据校验:输入合法性检查,如学号格式、姓名长度等。 - 错误处理:对于文件读写异常、网络通信错误等情况,需有合理的异常处理机制。 - 用户权限:区分不同用户的角色,如管理员、教师、学生,控制各自可访问的...

    java调用MD5加密方式计算摘要值(有界面)

    在Java中,MD5主要用于数据的完整性校验和密码存储,因为其不可逆性,即使原始数据被篡改,通过MD5计算出的摘要值也会有所不同。 在Java中,我们可以使用`java.security.MessageDigest`类来实现MD5加密。这个类提供...

    denglu.rar_源码

    3. **服务器端验证**:通常使用Java Web框架如Spring MVC、Struts等处理POST请求,校验用户输入并进行登录操作。 4. **会话管理**:登录成功后,服务器通常会创建一个会话(session),存储用户信息,以便在后续请求...

    Jave Swing 窗体图书管理系统,完美,毕业设计案例

    2. **用户信息校验**:在窗体登录部分,系统会对用户输入的信息进行校验,这可能涉及到字符串验证(如非空检查、长度限制)以及密码安全处理(如密码的加密存储和比较)。此外,可能还会实现错误提示,如当用户名或...

Global site tag (gtag.js) - Google Analytics