【问题标题】:Restricting input in textfield by template通过模板限制文本字段中的输入
【发布时间】:2015-02-08 18:54:52
【问题描述】:

我正在寻找如何通过模板重新限制文本字段中的输入的解决方案。例如,我有文本字段,用户只需输入日期 (dd/MM/yyyy) 或时间 (mm:hh)。我怎么做到的? !1

我正在使用 JavaFx 8。

【问题讨论】:

  • 查看以下 oracle 页面 [DatePicker][1] [1]:stackoverflow.com/questions/22940371/…
  • 如果您可以使用 JDK 8 update 40(在撰写本文时它处于早期版本,但将在大约一个月后进入 GA),它有一个设计为 TextFormatter正是这个用例。

标签: javafx textfield


【解决方案1】:

这是我在 DatePicker 的 TextField 对象上使用的 solition:DatePicker 对象允许在文本字段中插入任​​何类型的文本。 我认为这个解决方案也可以阻止你。 在示例中,我在 DatePicker 和 TextField 对象上执行此操作。

MyControllerClass.java

@Fxml
private DatePicker datePik;
@Fxml
private TextField textF;

@Override
    public void initialize(URL url, ResourceBundle rb) {  
        String pattern = "dd-MM-yyyy";
        datePik.setPromptText(pattern.toLowerCase());      
        datePik.getEditor().focusedProperty().addListener(new ChangeListener<Boolean>()//focus on the TextField object of the DatePicker
            {   
                @Override
                public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue){
                    if (newPropertyValue == false){
                        try {
                            SimpleDateFormat sdf = new SimpleDateFormat(datePik.getEditor().getText());
                            sdf.setLenient(false);
                            //if not valid, it will throw ParseException
                            Date date = sdf.parse(datePik.getEditor().getText());
                            //System.out.println(date);
                        } catch (Exception e) {
                            e.printStackTrace();
                            datePik.getEditor().setText("");
                        }
                            }
                        };
            }); 


        textF.focusedProperty().addListener(new ChangeListener<Boolean>()//focus on the TextField object
            {   
                @Override
                public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue){
                    if (newPropertyValue == false){
                        try {
                            SimpleDateFormat sdf = new SimpleDateFormat(textF.getText());
                            sdf.setLenient(false);
                            //if not valid, it will throw ParseException
                            Date date = sdf.parse(textF.getText());
                            //System.out.println(date);
                        } catch (Exception e) {
                            e.printStackTrace();
                            textF.setText("");
                        }
                            }
                        };
            }); 
}

您也可以使用对象 SimpleDateFormat 来检查正确的时间http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html 再见

【讨论】:

    【解决方案2】:

    这个答案很容易理解并适应任何文本模式。实现的模式是dd.mm.yyyy

    import java.awt.Toolkit;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import javafx.geometry.Side;
    import javafx.scene.control.ContextMenu;
    import javafx.scene.control.MenuItem;
    import javafx.scene.control.TextField;
    
    public class DateTextField extends TextField
    {
    Pattern patt1 = Pattern.compile("[0-3]");
    Pattern patt2 = Pattern.compile("[0-3][0-9]");
    Pattern patt3 = Pattern.compile("[0-3][0-9][.]");
    Pattern patt4 = Pattern.compile("[0-3][0-9][.][0-1]");
    Pattern patt5 = Pattern.compile("[0-3][0-9][.][0-1][0-9]");
    Pattern patt6 = Pattern.compile("[0-3][0-9][.][0-1][0-9][.]");
    Pattern patt7 = Pattern.compile("[0-3][0-9][.][0-1][0-9][.][1-2]");
    Pattern patt8 = Pattern.compile("[0-3][0-9][.][0-1][0-9][.][1-2][0-9]");
    Pattern patt9 = Pattern.compile("[0-3][0-9][.][0-1][0-9][.][1-2][0-9][0-9]");
    Pattern patt10 = Pattern.compile("[0-3][0-9][.][0-1][0-9][.][1-2][0-9][0-9][0-9]");
    
    public DateTextField()
    {
        super();
    }
    
    public void replaceText(int start, int end, String text)
    {       
        String text2 = this.getText()+text;
        if( compare(text2) || start != end)
        {
            super.replaceText( start, end, text );
        }
        else
        {
            Toolkit.getDefaultToolkit().beep();
            zeige();
        }
    
    }
    
    public void replaceSelection(String text)
    {
        String text2 = this.getText()+text;
        if(compare(text2))
        {
            super.replaceSelection( text );
        }
        else
        {
            Toolkit.getDefaultToolkit().beep();
            zeige();
        }
    }
    
    private boolean compare(String text)
    {
        Matcher match = patt1.matcher(text);
        if(match.matches()) return true;
        match = patt2.matcher(text);
        if(match.matches()) return true;
        match = patt3.matcher(text);
        if(match.matches()) return true;
        match = patt4.matcher(text);
        if(match.matches()) return true;
        match = patt5.matcher(text);
        if(match.matches()) return true;
        match = patt6.matcher(text);
        if(match.matches()) return true;
        match = patt7.matcher(text);
        if(match.matches()) return true;
        match = patt8.matcher(text);
        if(match.matches()) return true;
        match = patt9.matcher(text);
        if(match.matches()) return true;
        match = patt10.matcher(text);
        if(match.matches()) return true;
        return false;
    }
    
    private void zeige()
    {
        final ContextMenu menu = new ContextMenu();
        menu.getItems().add(new MenuItem("dd.mm.yyyy"));
        menu.show(this, Side.BOTTOM, 0, 0);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 2017-05-17
      • 2022-11-21
      • 2014-03-18
      • 2015-05-20
      • 2017-01-23
      • 2016-02-16
      • 2012-01-22
      相关资源
      最近更新 更多