1

ここに投稿されたこの以前のコードに基づいて新しい質問を投稿します(スライダーと最小/最大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機能と他のソースコードについて :TextInputControlBehaviorhttps://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")
          }
        }
      }
    })

誰かがそれを行うためのより良い方法を見つけたら、私は答えを検証します:)

4

1 に答える 1

1

私は現在、Scalaソリューションを使用したJavaFXにも取り組んでいるので、あなたの例を試してみたいのですが、コンパイルできません。具体的doubleFieldvalue.setは不明です!

私はいくつかのヒントを持っています-最初に:ケースに条件を追加することで簡単に解決できる明らかなコードの重複があります-最初のケースは条件(範囲内のd)が満たされた場合にのみ成り立ちます

case Some(d: Double) if (doubleField.minValue <= d && d <= doubleField.maxValue) ⇒
  value.set(d)
case _ ⇒ 
  doubleField.getSkin.asInstanceOf[TextInputControlSkin[_, _]].getBehavior.asInstanceOf[TextInputControlBehavior[_]].callAction("Undo")

2番目:Javaで匿名内部クラスのラッパーを提供します-たとえば、上記のChangeListenerは次のようにラップできます。

implicit def unit2ChangeListener[T](f: (ObservableValue[_ <: T], T, T) => Unit) =
  new ChangeListener[T] {
    override def changed(observable: ObservableValue[_ <: T], oldValue: T, newValue: T) {
      f(observable, oldValue, newValue)
    }
}

これらの暗黙の変換は、utilクラス(素敵なunit2EventHandlerと共に)に隠されて、アプリケーションにインポートされる可能性があります。これにより、もう少し読みやすくなります(ただし、それでも少し苦痛になります)。

myTextField.focusedProperty().addListener(
  (observable: ObservableValue[_ <: java.lang.Boolean], 
     oldValue: java.lang.Boolean, newValue: java.lang.Boolean) =>
     if (!newValue) { ... }
)

おそらくScalaFxはすでにこのようなものを提供していますが、私はまだ試していません。

于 2013-02-09T13:54:10.067 に答える