2013-03-16 53 views
1

我想驗證一個TextField,我只想讓TextField上的數字。我的代碼如下:??從TextField消耗JavaFX KeyTyped事件

public void handle(KeyEvent evt) { 
    String character = evt.getCharacter(); 
    if(!character.equals("1")) { 
     JOptionPane.showMessageDialog(null,evt.getCharacter()); 
     evt.consume();     
    }           
} 

這不消耗情況:(這是一個錯誤是有另一種方式來做到這一點

回答

1

我覺得消費的關鍵事件是錯誤的做法這可以說是一個簡單,創傷小,以過濾輸入方式是在文本屬性安裝監聽器,並恢復它如果需要的話:

public class Test extends Application { 
    @Override 
    public void start(final Stage stage) throws Exception { 
     final Pattern wholeNumberPattern = Pattern.compile("\\d*"); 
     final TextField tf = new TextField(); 
     tf.textProperty().addListener(new ChangeListener<String>() { 
      public void changed(final ObservableValue<? extends String> observableValue, final String oldValue, 
           final String newValue) { 
       if (!wholeNumberPattern.matcher(newValue).matches()) 
        tf.setText(oldValue); 
      } 
     }); 
     stage.setScene(new Scene(tf)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     System.out.println(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion()); 
     Application.launch(args); 
    } 
} 
+0

這隻適用於如果您的偵聽器是唯一的偵聽器。一旦你需要阻止事件傳播,你需要事件過濾器 - 這就是爲什麼它們可用。 – specializt 2014-08-22 13:24:02

2

試試這個工作它..

txtMobile.addEventFilter(KeyEvent.KEY_TYPED, new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     String character=event.getCharacter(); 


     if(!valid.checkNumeric(character)) 
      event.consume();      
    }}); 

和數字功能...

public boolean checkNumeric(String value) { 
    String number=value.replaceAll("\\s+",""); 
    for(int j = 0 ; j<number.length();j++){ 
      if(!(((int)number.charAt(j)>=47 && (int)number.charAt(j)<=57))) 
      { 
       return false; 
      } 
    }  
    return true; 
} 
1

使用JavaFX 8u40,限制的文本字段中輸入的最佳方式開始是對文本字段設置一個TextFormatter。詳情請參閱this answer。無需手動添加事件過濾器或消耗事件。