2015-02-08 37 views
0

我正在尋找解決方案如何通過模板在文本字段中解析輸入。例如,我有文本框,用戶只需輸入日期(日/月/年)或時間(毫米:小時)。我怎麼那樣做? ! 1通過模板限制文本字段中的輸入

我使用JavaFX 8

+0

查閱以下Oracle頁[的DatePicker] [1] [1]:http://stackoverflow.com/questions/22940371/javafx -8-datepicker-features – Inge 2015-02-09 05:29:09

+1

如果你可以使用JDK 8 update 40(這是在編寫本書時的早期版本,但由於在大約一個月內在GA),它有一個['TextFormatter'](http ://download.java.net/jdk9/jfxdocs/index.html?javafx/scene/control/TextFormatter.html)就是專門爲這個用例設計的。 – 2015-02-09 12:22:26

回答

0

的工作,這是我在我的DatePicker的TextField對象所使用的孤子:允許插入任何類型的文本在文本框的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 再見

1

這個答案是很容易理解和適應任何文本模式。實現的圖案爲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); 
} 
} 
相關問題