ここに投稿されたこの以前のコードに基づいて新しい質問を投稿します(スライダーと最小/最大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のundo機能と他のソースコードについて :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:
タダム!
最後に、それを行うための恐ろしい方法を見つけました。パブリック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")
}
}
}
})
誰かがそれを行うためのより良い方法を見つけたら、私は答えを検証します:)