创建自定义组件 - 扩展到JFormattedField

时间:2016-06-27 16:52:11

标签: java jformattedtextfield maskformatter

我正在处理一个应用程序,我对我的界面有一定的要求:时间输入。

我需要我的控件使用JFormattedTextField接受12小时到24小时的输入,并发现:

 MaskFormatter mask = new MaskFormatter("##:##");
 mask.setPlaceHolderCharacter('0');

现在我创建了一个扩展到JFormattedTextField

的类
 public class JayTimeInput extends JFormattedTextField{....

现在我偷看了JFormattedTextField的源代码,发现了这样的东西:

public JFormattedTextField(Object mask){...

我的问题是:如何创建自动拥有掩码格式化程序的JayTimeInput类?我尝试在我的构造函数中声明它,但我不确定:

public JayTimeInput(){
     try{
          MaskFormatter mask = new MaskFormatter("##:##");
          mask.setPlaceHolderCharacter('0');
          new JFormattedTextField(mask);
     }catch(Exception e){e.printStackTrace()}
}

我已经看过如何使用MaskFormatter的例子,我发现的唯一方法就是声明它:

MaskFormatter mask = new MaskFormatter("##:##");
mask.setPlaceHolderCharacter('0');
JFormattedTextField jformat = new JFormattedTextField(mask);

我不确定我的actionlistener是否已正确完成,但我需要首先使用它。

有人帮帮我吗?我仍然是通过扩展现有的波动来创建我自己的控件的新手。

更新

我正在查看自定义JFormattedTextField的错误方法。我应该使用FormatFactory。已为任何需要的人发布了答案代码。

1 个答案:

答案 0 :(得分:0)

//if you found this usefull, please dont remove this
//and credit my work for this
//James C. Castillo
//zeinzu21@gmail.com

import java.awt.event.KeyEvent;
import javax.swing.JFormattedTextField;
import javax.swing.text.MaskFormatter;

public final class JayTimeInput extends JFormattedTextField{



public JayTimeInput(){
    myFormat();
    addKeyListener(new java.awt.event.KeyAdapter() {
        @Override
        public void keyTyped(java.awt.event.KeyEvent evt) {
            verify(evt);
        }
    });

}

public void myFormat() {
    try {
        MaskFormatter format = new MaskFormatter("##:##");
        format.setPlaceholderCharacter('0');
        this.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(format));
    } catch (java.text.ParseException ex) {
        ex.printStackTrace();
    }
}

public String getTime(){
    return this.getText();
}

public void setTime(String x){
    this.setText(x);
}

public void resetTime(){
    this.setText("00:00");
}

public void setFocus(boolean f){
    this.setFocusable(f);
    this.setVerifyInputWhenFocusTarget(f);
}
public void verify(KeyEvent evt){
    try {
            int carret = this.getCaretPosition();
            char c = evt.getKeyChar();

            if(carret==0){
                int hour = Integer.parseInt(c+"");
                if(hour>1){
                    evt.consume();
                }
            }

            if(carret==1){
                int hour = Integer.parseInt(c+"");
                if(hour>2){
                    evt.consume();
                }
            }

            if(carret==3){
                int min = Integer.parseInt(c+"");
                if(min>5){
                    evt.consume();
                }
            }
    } catch (Exception e) {
        //do nothing. nothing to catch since its keyevent
    }
}
}