我根据之前在此处发布的代码发布了新问题(在 Slider 和 min/max TextField 之间的 BindDirectional 策略之后过滤 TextField 输入上的用户值)
我的目标很简单,TextField
在用户失去对我的价值的焦点事件后,撤消错误价值(基于自定义验证)的最佳方法是什么。
唯一的方法是在用户用另一个焦点事件覆盖之前访问 oldValue 吗?
其实我有这个简单的代码:
val myTextField = new TextField ()
def parseDouble(s: String) = try {
Some(s.toDouble)
} catch {
case _ ⇒ None
}
myTextField.focusedProperty().addListener(
new ChangeListener[java.lang.Boolean]() {
override def changed(observable: ObservableValue[_ <: java.lang.Boolean], oldValue: java.lang.Boolean, newValue: java.lang.Boolean) {
if (!newValue) {
parseDouble(myTextField.textProperty().get()) match {
case Some(d: Double) ⇒ // test on the double value entered by user
case _ ⇒ // code to reset to old value ??
}
}
}
})
更新 1:
我在这里找到讨论:https ://forums.oracle.com/forums/thread.jspa?threadID=2382472 关于TextField/TextArea 的撤消功能和其他源代码TextInputControlBehavior
:https ://forums.oracle.com/forums/thread .jspa?threadID=2438759&tstart=45
我在这里http://javafx-jira.kenai.com/browse/RT-7547找到了 javafx 2.2 中实现的撤消行为的描述,但我找不到示例代码...
更新 2:
我在这里找到了公共撤消控制 API 的帖子(路线图固定为 2.2.6) :http TextInputControl
: //javafx-jira.kenai.com/browse/RT-26575
TextInputBehaviorControl
可以在这里看到:https ://bitbucket.org/shemnon/openjfx-rt/src/6696e9cea59c401d2637d82f9cf96a515d210203/javafx-ui-controls/src/com/sun/javafx/scene/control/behavior/TextInputControlBehavior.java
更新 3:
塔达姆!
最后我找到了一个可怕的方法来做到这一点,我希望公共 API 适用于 2.2.6 版本的 javaFX ...
val myTextField = new TextField ()
def parseDouble(s: String) = try {
Some(s.toDouble)
} catch {
case _ ⇒ None
}
myTextField.focusedProperty().addListener(
new ChangeListener[java.lang.Boolean]() { db ⇒
override def changed(observable: ObservableValue[_ <: java.lang.Boolean], oldValue: java.lang.Boolean, newValue: java.lang.Boolean) {
if (!newValue) {
parseDouble(myTextField.textProperty().get()) match {
case Some(d: Double) ⇒
if (myTextField.minValue > d || d > myTextField.maxValue) {
doubleField.getSkin.asInstanceOf[TextInputControlSkin[_, _]].getBehavior.asInstanceOf[TextInputControlBehavior[_]].callAction("Undo")
} else {
// Here you change value property of textField
}
case _ ⇒ myTextField.getSkin.asInstanceOf[TextInputControlSkin[_, _]].getBehavior.asInstanceOf[TextInputControlBehavior[_]].callAction("Undo")
}
}
}
})
如果有人找到更好的方法,我会验证答案:)