我張貼在此基礎上以前的代碼貼在這裏(Filter users values on TextField input after a BindDirectional strategy betwen a Slider and min/max 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約撤消文本字段/文本區域和其他源代碼functionnality約TextInputControlBehavior
:https://forums.oracle.com/forums/thread.jspa?threadID=2438759&tstart=45
我發現在javafx 2.2中實現的撤銷行爲的描述這裏http://javafx-jira.kenai.com/browse/RT-7547但我不能找到示例代碼...
更新2:
我找到公共撤消控制API(路線固定2.2.6)爲TextInputControl
的一則訊息:http://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:
Tadam!
終於讓我找到我驗證答案的可怕的方式做到這一點,我希望公共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")
}
}
}
})
,如果有人找到一個更好的方法來做到那:) :)
聽起來像你已經有了答案。 –
@ Andy-till我不是javafx的專家,或者具有構建事件的UI:/我搜索正確的方式來執行此行爲,但如果它是唯一的方法,那麼我考慮在此處發佈源代碼以幫助社區。我編輯了一些討論路徑.. – reyman64