猿问

在JavaFX中创建数字TextField的推荐方法是什么?

在JavaFX中创建数字TextField的推荐方法是什么?

我需要将输入限制为TextField为整数。有什么建议?



料青山看我应如是
浏览 3023回答 3
3回答

明月笑刀无情

非常旧的线程,但这似乎更整洁,如果粘贴,剥去非数字字符。//&nbsp;force&nbsp;the&nbsp;field&nbsp;to&nbsp;be&nbsp;numeric&nbsp;only textField.textProperty().addListener(new&nbsp;ChangeListener<String>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;changed(ObservableValue<?&nbsp;extends&nbsp;String>&nbsp;observable,&nbsp;String&nbsp;oldValue,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;newValue)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!newValue.matches("\\d*"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textField.setText(newValue.replaceAll("[^\\d]",&nbsp;"")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}});

守候你守候我

我知道这是一个相当古老的线程,但对于未来的读者来说,这是另一个我发现非常直观的解决方案:public&nbsp;class&nbsp;NumberTextField&nbsp;extends&nbsp;TextField{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;replaceText(int&nbsp;start,&nbsp;int&nbsp;end,&nbsp;String&nbsp;text) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(validate(text)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.replaceText(start,&nbsp;end,&nbsp;text); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;replaceSelection(String&nbsp;text) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(validate(text)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.replaceSelection(text); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;validate(String&nbsp;text) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;text.matches("[0-9]*"); &nbsp;&nbsp;&nbsp;&nbsp;}}

暮色呼如

在这个要点中有一些这样的例子,我复制了下面的一个例子://&nbsp;helper&nbsp;text&nbsp;field&nbsp;subclass&nbsp;which&nbsp;restricts&nbsp;text&nbsp;input&nbsp;to&nbsp;a&nbsp;given&nbsp;range&nbsp;of&nbsp;natural&nbsp;int&nbsp;numbers//&nbsp;and&nbsp;exposes&nbsp;the&nbsp;current&nbsp;numeric&nbsp;int&nbsp;value&nbsp;of&nbsp;the&nbsp;edit&nbsp;box&nbsp;as&nbsp;a&nbsp;value&nbsp;property.class&nbsp;IntField&nbsp;extends&nbsp;TextField&nbsp;{ &nbsp;&nbsp;final&nbsp;private&nbsp;IntegerProperty&nbsp;value; &nbsp;&nbsp;final&nbsp;private&nbsp;int&nbsp;minValue; &nbsp;&nbsp;final&nbsp;private&nbsp;int&nbsp;maxValue; &nbsp;&nbsp;//&nbsp;expose&nbsp;an&nbsp;integer&nbsp;value&nbsp;property&nbsp;for&nbsp;the&nbsp;text&nbsp;field. &nbsp;&nbsp;public&nbsp;int&nbsp;&nbsp;getValue()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;return&nbsp;value.getValue();&nbsp;} &nbsp;&nbsp;public&nbsp;void&nbsp;setValue(int&nbsp;newValue)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;value.setValue(newValue);&nbsp;} &nbsp;&nbsp;public&nbsp;IntegerProperty&nbsp;valueProperty()&nbsp;{&nbsp;return&nbsp;value;&nbsp;} &nbsp;&nbsp;IntField(int&nbsp;minValue,&nbsp;int&nbsp;maxValue,&nbsp;int&nbsp;initialValue)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(minValue&nbsp;>&nbsp;maxValue)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"IntField&nbsp;min&nbsp;value&nbsp;"&nbsp;+&nbsp;minValue&nbsp;+&nbsp;"&nbsp;greater&nbsp;than&nbsp;max&nbsp;value&nbsp;"&nbsp;+&nbsp;maxValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(maxValue&nbsp;<&nbsp;minValue)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"IntField&nbsp;max&nbsp;value&nbsp;"&nbsp;+&nbsp;minValue&nbsp;+&nbsp;"&nbsp;less&nbsp;than&nbsp;min&nbsp;value&nbsp;"&nbsp;+&nbsp;maxValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!((minValue&nbsp;<=&nbsp;initialValue)&nbsp;&&&nbsp;(initialValue&nbsp;<=&nbsp;maxValue)))&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"IntField&nbsp;initialValue&nbsp;"&nbsp;+&nbsp;initialValue&nbsp;+&nbsp;"&nbsp;not&nbsp;between&nbsp;"&nbsp;+&nbsp;minValue&nbsp;+&nbsp;"&nbsp;and&nbsp;"&nbsp;+&nbsp;maxValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;initialize&nbsp;the&nbsp;field&nbsp;values. &nbsp;&nbsp;&nbsp;&nbsp;this.minValue&nbsp;=&nbsp;minValue; &nbsp;&nbsp;&nbsp;&nbsp;this.maxValue&nbsp;=&nbsp;maxValue; &nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;new&nbsp;SimpleIntegerProperty(initialValue); &nbsp;&nbsp;&nbsp;&nbsp;setText(initialValue&nbsp;+&nbsp;""); &nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;IntField&nbsp;intField&nbsp;=&nbsp;this; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;make&nbsp;sure&nbsp;the&nbsp;value&nbsp;property&nbsp;is&nbsp;clamped&nbsp;to&nbsp;the&nbsp;required&nbsp;range &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;and&nbsp;update&nbsp;the&nbsp;field's&nbsp;text&nbsp;to&nbsp;be&nbsp;in&nbsp;sync&nbsp;with&nbsp;the&nbsp;value. &nbsp;&nbsp;&nbsp;&nbsp;value.addListener(new&nbsp;ChangeListener<Number>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;public&nbsp;void&nbsp;changed(ObservableValue<?&nbsp;extends&nbsp;Number>&nbsp;observableValue,&nbsp;Number&nbsp;oldValue,&nbsp;Number&nbsp;newValue)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(newValue&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intField.setText(""); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(newValue.intValue()&nbsp;<&nbsp;intField.minValue)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.setValue(intField.minValue); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(newValue.intValue()&nbsp;>&nbsp;intField.maxValue)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.setValue(intField.maxValue); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(newValue.intValue()&nbsp;==&nbsp;0&nbsp;&&&nbsp;(textProperty().get()&nbsp;==&nbsp;null&nbsp;||&nbsp;"".equals(textProperty().get())))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;no&nbsp;action&nbsp;required,&nbsp;text&nbsp;property&nbsp;is&nbsp;already&nbsp;blank,&nbsp;we&nbsp;don't&nbsp;need&nbsp;to&nbsp;set&nbsp;it&nbsp;to&nbsp;0. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intField.setText(newValue.toString()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;restrict&nbsp;key&nbsp;input&nbsp;to&nbsp;numerals. &nbsp;&nbsp;&nbsp;&nbsp;this.addEventFilter(KeyEvent.KEY_TYPED,&nbsp;new&nbsp;EventHandler<KeyEvent>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;public&nbsp;void&nbsp;handle(KeyEvent&nbsp;keyEvent)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!"0123456789".contains(keyEvent.getCharacter()))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyEvent.consume(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;ensure&nbsp;any&nbsp;entered&nbsp;values&nbsp;lie&nbsp;inside&nbsp;the&nbsp;required&nbsp;range. &nbsp;&nbsp;&nbsp;&nbsp;this.textProperty().addListener(new&nbsp;ChangeListener<String>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;public&nbsp;void&nbsp;changed(ObservableValue<?&nbsp;extends&nbsp;String>&nbsp;observableValue,&nbsp;String&nbsp;oldValue,&nbsp;String&nbsp;newValue)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(newValue&nbsp;==&nbsp;null&nbsp;||&nbsp;"".equals(newValue))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.setValue(0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;intValue&nbsp;=&nbsp;Integer.parseInt(newValue); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(intField.minValue&nbsp;>&nbsp;intValue&nbsp;||&nbsp;intValue&nbsp;>&nbsp;intField.maxValue)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textProperty().setValue(oldValue); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.set(Integer.parseInt(textProperty().get())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;}}
随时随地看视频慕课网APP
我要回答