您的位置:首页 > 编程语言 > Java开发

java JTextField 只能输入数字(控制小数点位数)

2008-02-29 17:30 435 查看
package util;

import javax.swing.text.PlainDocument;
import javax.swing.text.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JTNumEdit extends JTextField
{
  private boolean initialized = true;

  // Assign defalut value
  private int gDecimalLenght = -1;//精确控制小数点输入位数
  private int nMaxStringLen = 14;
  private String Formatter = "#,##0.00";
  private boolean zero2100 = false;//只能输入0~100之间的值
  private boolean noFS = false;

  public JTNumEdit()
  {
    super();
    init();
  }

  // The maximal string length of TextFiled is given by caller

  public JTNumEdit(int MaxStringLen)
  {
    super();
    init();
    this.nMaxStringLen = MaxStringLen;
  }

 // The maximal string length of TextFiled and decimal formatter is given by caller

  public JTNumEdit(int MaxStringLen, String Formatter)
  {
    super();
    init();
    this.nMaxStringLen = MaxStringLen;
    this.Formatter = Formatter;
  }

  //精确控制小数点输入位数
  public JTNumEdit(int MaxStringLen,int decimalLenght, String Formatter)
  {
    super();
    init();
    this.nMaxStringLen = MaxStringLen;
    this.Formatter = Formatter;
    this.gDecimalLenght = decimalLenght;
  }

  //精确控制小数点输入位数并且只能输入0~100之间的值
  public JTNumEdit(int MaxStringLen,int decimalLenght, String Formatter,boolean zero2100)
  {
    super();
    init();
    this.nMaxStringLen = MaxStringLen;
    this.Formatter = Formatter;
    this.gDecimalLenght = decimalLenght;
    this.zero2100 = zero2100;
  }

  public JTNumEdit(int MaxStringLen, String Formatter,boolean noFS)
  {
    super();
    init();
    this.nMaxStringLen = MaxStringLen;
    this.Formatter = Formatter;
    this.noFS = noFS;
  }

  // initialize

  private void init()
  {
//    this.setText(this.getText()) ;
    this.setHorizontalAlignment(SwingConstants.RIGHT);

    // Add focust lost listener

    this.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(FocusEvent e)
            {
                NumEdit_FocusLost(e);
            }
        });

    this.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(FocusEvent e)
            {
                NumEdit_FocusGained(e);
            }
        });
  }

  // After the focus is lost, the string is formatted

  void NumEdit_FocusLost(FocusEvent e)
  {
    if (!this.getText().trim().equals(""))
     setValueToTextField(getValueFromTextField());
  }

  // After the focus is gained, the string is selected

  void NumEdit_FocusGained(FocusEvent e)
  {
     this.selectAll();
  }
  // override the setText function of TextField

  public void setText(String text)
  {
    setValueToTextField(Convert(text));
  }

  // Get a double value from TextField

  public double getValueFromTextField()
  {
     return Convert(this.getText());
  }

  // Put a double value to TextField

  public void setValueToTextField(double d)
  {
     String ss = this.getText();
     String tt = FormattedText(d);
     if (!ss.equals(tt))
       super.setText(tt);
     System.out.println();
  }

  // Put a string value to TextField

  public void setValueToTextField(String s)
  {
     String ss = this.getText();
     String tt = FormattedText(Convert(s));
     if (!ss.equals(tt))
       this.setText(tt);
  }

  // Format the string according to decimal formatter

  public String FormattedText(double Value)
  {
      String ValueText=null;
      java.text.DecimalFormat dfStandard=new java.text.DecimalFormat(Formatter);
      ValueText=dfStandard.format(Value);
      return ValueText;
  }

  // Convert a string to double

  public static double Convert(String TextString)
  {
     double d = 0;
     TextString = TextString.replaceAll(",","");
     String TempString = "";
     TempString = TextString.replaceAll("-","");
     if (!TempString.trim().equals(""))
       try{
         d = Double.parseDouble(TextString);
       }catch(Exception ex){
         d = 0;
       }
     return d;
  }

  // Add document

  protected Document createDefaultModel()
  {
     return new NumCheck();
  }

  public void setDocument(Document d)
  {
      if (!initialized || d instanceof NumCheck)  // allow calls during initialization of base class
         super.setDocument(d);
      else
        throw new UnsupportedOperationException();
  }

  // Check the number in entering the char

  private class NumCheck extends PlainDocument
  {
    public void insertString(int offs,String str,AttributeSet a)
    throws BadLocationException
    {
        //"."=46; ","=44; "-"=45; "0"=48;
        if(getLength()>nMaxStringLen-1)
        {
            return;
        }

        if (str.equals("")||str==null)
        {
          super.insertString(offs,str,a);
        }
        else
        {
          if (offs==0)
          {
            if (noFS){
                if (((int) str.charAt(0) == 45) && ((int) str.charAt(0) != 46) &&
                    ((int) str.charAt(0) < 48 || (int) str.charAt(0) > 57)) {
                    return;
                }
            }else{
                if (((int) str.charAt(0) != 45) && ((int) str.charAt(0) != 46) &&
                    ((int) str.charAt(0) < 48 || (int) str.charAt(0) > 57)) {
                    return;
                }
            }
            if (str.length()>1)
            {
                for (int i=1; i<str.length(); i++)
                {
                    if (((int)str.charAt(i)<48||(int)str.charAt(i)>57)&&
                    ((int)str.charAt(i)!=44)&&((int)str.charAt(i)!=46))
                    {
                      return;
                    }
                }
            }
          }
          else
          {
            if (offs==1)
            {
                for (int i=0; i<str.length(); i++)
                {
                    if ((((int)getText(0,1).charAt(0))<48 || ((int)getText(0,1).charAt(0))>57) &&
                      (((int)str.charAt(i)<48 || (int)str.charAt(i)>57) &&
                        ((int)str.charAt(i)!=44)))
                    {
                          return;
                    }

                }
            }

            for (int i=0; i<str.length(); i++)
            {
                if (((int)str.charAt(i)<48||(int)str.charAt(i)>57)&&
                ((int)str.charAt(i)!=44)&&((int)str.charAt(i)!=46))
                {
                  return;
                }

                if (((int)str.charAt(i)==46))
                {
                  String strOld=getText(0,getLength());
                  for (int j=0; j<strOld.length(); j++)
                  {
                    if ((int)strOld.charAt(j)==46)
                    {
                      return;
                    }
                  }
                }
            }
          }
          for (int i=0; i<str.length(); i++)
          {
               if (((int)str.charAt(i)==46))
                {
                  String strOld=getText(0,getLength());
                  for (int j=0; j<strOld.length(); j++)
                  {
                    if ((int)strOld.charAt(j)==46)
                    {
                      return;
                    }
                  }
                }

                if (((int)str.charAt(i)==45))
                {
                  String strOld=getText(0,getLength());
                  for (int j=0; j<strOld.length(); j++)
                  {
                    if ((int)strOld.charAt(j)==45)
                    {
                      return;
                    }
                  }
                }
          }
          int iFlag=str.lastIndexOf(".");
          if (iFlag>=0)
          {
              if ((str.length()-iFlag)>10)
              {
                  str=str.substring(0,iFlag+11);
              }
          }

          String oldString=getText(0,getLength());
          String newString=oldString.substring(0,offs)+str+oldString.substring(offs);
          iFlag=newString.lastIndexOf(".");

          if (iFlag>=0)
          {
            if ((getLength()-iFlag)>10)
            {
              return;
            }
          }
          if(gDecimalLenght>-1){//精确控制小数点输入位数
            int decimalPosition = newString.lastIndexOf(".");
            if (decimalPosition > -1) {
              if ((newString.length() - (decimalPosition+1)) > gDecimalLenght)
                return;
            }
          }
          if(zero2100){//只能输入0~100之间的值
            if(str.equals("-")) return;
            if (newString.equals("")) newString = "0";
            newString = newString.replaceAll(",","");
            double value = 0;
            if(!newString.equals("."))
              value = new Double(Double.parseDouble(newString)).doubleValue();
            if(value<0||value>=100)
              return;
          }
          super.insertString(offs,str,a);
        }
    }
  }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息