我正在尝试验证TextField,我只想在TextField上允许数字。我的代码如下所示:
public void handle(KeyEvent evt) {
String character = evt.getCharacter();
if(!character.equals("1")) {
JOptionPane.showMessageDialog(null,evt.getCharacter());
evt.consume();
}
}
这不消耗事件:(这是一个错误吗?还有另一种方法吗?
答案 0 :(得分:3)
试试这个有用..
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 :(得分:2)
从JavaFX 8u40开始,限制文本字段输入的最佳方法是在文本字段上设置TextFormatter。有关详细信息,请参阅this answer。无需手动添加事件过滤器或使用事件。
答案 2 :(得分:1)
我认为消费关键事件是错误的做法。过滤输入的一种可以说更简单,侵入性更小的方法是在text属性上安装一个监听器,并在需要时将其恢复:
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);
}
}