加一个监听器,监听change事件,当变化时,取得内容,检查是否含有非法的字符,如有,则创建一个对话框。

解决方案 »

  1.   

    extends PlainDocumentrefer to the following
    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import javax.swing.text.*;
    import java.awt.event.*;public class TimeControl extends JPanel
    {
    private FixLenthTextField inYear;
    private FixLenthTextField inMonth;
    private FixLenthTextField inDay;
    private FixLenthTextField inHour;
    private FixLenthTextField inMinute;
    private FixLenthTextField inSecond;
    private JLabel  sDeli;
    public TimeControl()
    {
    createControl();
    }
    public void setColor(Color bkclr,Color foreclr)
    {
    super.setBorder(BorderFactory.createEmptyBorder());
    super.setBackground(bkclr);
    Container c=this;
    Component[] components=c.getComponents();
    if(components==null)
    return;
    int num=components.length;
    for(int i=0;i<num;i++)
    {
    components[i].setBackground(bkclr);
    components[i].setForeground(foreclr);
    if(components[i] instanceof JTextField)
    {
    JTextField jc=(JTextField)components[i];
    jc.setBorder(BorderFactory.createEmptyBorder());
    jc.setCaretColor(foreclr);

    }
    }
    }
    public Calendar getTime()
    { //should only use value of hour:minute:second
    Calendar cal=Calendar.getInstance();
    cal.set(cal.HOUR,getField(cal.HOUR));
    cal.set(cal.MINUTE,getField(cal.MINUTE));
    cal.set(cal.SECOND,getField(cal.SECOND));
    return cal;

    }
    public void setTime(Calendar c)
    { //only values of hour:minute:second of calendar object are used
    if(c!=null)
    {
    setStrField(Calendar.HOUR,""+c.get(Calendar.HOUR));
    setStrField(Calendar.MINUTE,""+c.get(Calendar.MINUTE));
    setStrField(Calendar.SECOND,""+c.get(Calendar.SECOND));
    }
    }
    public int getField(int fieldid)
    { //parameter in: Calendar.HOUR,Calendar.MINUTE,Calendar.SECOND
    int nret=0;
    try
    {
    nret=Integer.parseInt(getStrField(fieldid));
    }
    catch(Exception e)
    {
    setStrField(fieldid,"0");
    }
    return nret;
    }
    private String getStrField(int fieldid)
    { //return null if parameter is wrong
    //valid fieldid : Calendar.HOUR,Calendar.MINUTE,Calendar.SECOND
    String sret=null;
    switch(fieldid)
    {
    case Calendar.HOUR:
    sret=inHour.getText();
    break;
    case Calendar.MINUTE:
    sret=inMinute.getText();
    break;
    case Calendar.SECOND:
    sret=inSecond.getText();
    break;
    default:
    break;
    }
    return sret;
    }
    private void setStrField(int fieldid,String s)
    {
    //valid fieldid : Calendar.HOUR,Calendar.MINUTE,Calendar.SECOND
    switch(fieldid)
    {
    case Calendar.HOUR:
    inHour.setText(s);
    break;
    case Calendar.MINUTE:
    inMinute.setText(s);
    break;
    case Calendar.SECOND:
    inSecond.setText(s);
    break;
    default:
    break;
    }
    }
    private void createControl()
    {
    inYear = new FixLenthTextField(4);
    inMonth=new FixLenthTextField(2);
    inDay=new FixLenthTextField(2);
    inHour=new FixLenthTextField(2);
    inMinute=new FixLenthTextField(2);
    inDay = new FixLenthTextField(2);
    inSecond=new FixLenthTextField(2);
    setControlValueRange();
    Container container=this;
    container.setLayout(new GridBagLayout());
    GridBagConstraints gbc=new GridBagConstraints();
    gbc.gridx=0;
    gbc.gridy=0;
    container.add(inHour,gbc);
    gbc.gridx++;
    container.add(new JLabel(":"),gbc);
    gbc.gridx++;
    container.add(inMinute,gbc);
    gbc.gridx++;
    container.add(new JLabel(":"),gbc);
    gbc.gridx++;
    container.add(inSecond,gbc);
    }
    private void setControlValueRange()
    {
    inMonth.setValueRange(1,12);
    inDay.setValueRange(1,31);
    inHour.setValueRange(0,23);
    inMinute.setValueRange(0,59);
    inSecond.setValueRange(0,59);

    }
    public static void main(String args[])
    {
    JFrame jf=new JFrame();
    Container c=jf.getContentPane();
    c.setLayout(new FlowLayout());
    final TimeControl timectrl=new TimeControl();
    timectrl.setColor(Color.black,Color.red);
    c.add(timectrl);
    JButton jb=new JButton("get time");
    jb.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    System.out.println(timectrl.getTime());
    }
    });
    c.add(jb);
    jf.setSize(400,400);
    jf.setVisible(true);
    }
    class FixLenthTextField extends JTextField
    {
    private int nMaxVal;//max value can be allowed to enter
    private int nMinVal;
    public FixLenthTextField(int cols) 
    {
    super(cols);
    nMaxVal=Integer.MAX_VALUE;
    nMinVal=Integer.MIN_VALUE;
    System.out.println("if it works,it is written by masterz, otherwise I don't know who write it");
    }
    public void setValueRange(int nmin,int nmax)
    {
    nMaxVal=nmax;
    nMinVal=nmin;
    }
    private int isValidValue(String s)
    {
    //return 0: OK
    //return 1: void string
    //return -1: not number
    //return -2: exceed max
    //return -3: exceed min
    if(s==null||s.length()<1)
    return 1;
    int nret=0;
    try
    {
    int nval=Integer.parseInt(s);
    if(nval>nMaxVal)
    nret=-2;
    else
    if(nval<nMinVal)
    nret=-3;
    }
    catch(Exception e)
    {
    nret=-1;
    }
    return nret;
    }
    protected Document createDefaultModel() 
    {
    return new FixLengthDocument();
    }

    class FixLengthDocument extends PlainDocument 
    {

    public void insertString(int offs, String str, AttributeSet a) 
    throws BadLocationException 
    {
    if (str == null||str.length() <1)
    return;
    int strlen=str.length();
    try
    {
    int test=Integer.parseInt(str);
    }
    catch(NumberFormatException e)
    {
    doBeep();
    return;
    }
    int maxlen=FixLenthTextField.this.getColumns();
    super.insertString(offs, str, a);
    int len=getLength();
    if(len>maxlen)
    {
    this.remove(maxlen,len-maxlen);
    len=maxlen;
    }
    String scontent=super.getText(0,len);
    if(isValidValue(scontent)>=0)
    {
    return;
    }
    while(scontent!=null&&scontent.length()>0)
    {
    if(len>0)
    {
    len--;
    scontent=scontent.substring(0,len);
    if(isValidValue(scontent)>=0)
    {
    break;
    }

    }
    else
    break;
    }
    super.remove(0,super.getLength());
    if(scontent!=null)
    super.insertString(0,scontent,a);

    }
    protected void doBeep()
    {
    Toolkit.getDefaultToolkit().beep();
    }

    }

    }
    }
      

  2.   

    不让输入其它字符倒是可以,只需控制输入字符的ascii码即可,但是怎么控制粘贴?以前用vb,我是判断剪贴板里是否为字符,但是在java里怎么实现这个功能?