1

ユーザーが整数/浮動小数点数などしか入力できないように、scala.swing.TextComponentに入力するフィルターを追加する便利な方法はありますか?特に、ペーストをテキストフィールドにフィルタリングする方法はありますか?Javaでは、これを行うためにDocumentFilterを使用しました。私はこれについていくつかのバリエーションを試しました:

object inputField extends TextField{

   peer.getDocument.asInstanceOf[AbstractDocument].setDocumentFilter(new DocumentFilter{

      def insertString(fb: FilterBypass, offs: Integer, str: String, a: AttributeSet){
         if(str.forall((c)=>c.isDigit)) super.insertString(fb, offs, str, a)
      }

      def replace(fb: FilterBypass, offs: Integer, l: Integer, str: String, a: AttributeSet){
         if(str.forall((c)=>c.isDigit)) super.replace(fb, offs, l, str, a)
      }
   })
}

これは機能していません。私はそれを間違っていますか、それともScalaはドキュメントフィルターを無視しますか?これを行う別の方法はありますか?それが必要な場合は、完全にjava.swingGUIを使用しても大丈夫かもしれません。

4

2 に答える 2

2

これは、リアクションを使用して実現できます。

import swing._
import swing.event._

object SwingApp extends SimpleSwingApplication {
  def top = new MainFrame {
    contents = new TextField {
      listenTo(keys)
      reactions += { case e: KeyTyped =>
        if (!e.char.isDigit) e.consume
      }
    }
  }
}

更新:ああ、私は同意します、それは比較的些細な場合にのみ当てはまります。元のソリューションに問題があることがわかりました。Intが必要な場所で整数を使用しているため、メソッドは単なる新しいメソッドであり、抽象クラスのメソッドの実装ではありません。これが私にとってどのように機能するかです:

contents = new TextField {
  object IntegralFilter extends DocumentFilter {
    override def insertString(fb: FilterBypass, offs: Int, str: String, a: AttributeSet){
       if(str.forall((c)=>c.isDigit)) super.insertString(fb, offs, str, a)
    }    
    override def replace(fb: FilterBypass, offs: Int, l: Int, str: String, a: AttributeSet){
       if(str.forall((c)=>c.isDigit)) super.replace(fb, offs, l, str, a)
    }
  }

  peer.getDocument().asInstanceOf[AbstractDocument].setDocumentFilter(IntegralFilter)
}

「オーバーライド」の使用に注意してください。これが、コンパイラエラーとそれに対応するIDEのヒントを取得した方法です。これで何かを本当にオーバーライドしたい場合は、署名を変更する必要があります。

于 2012-12-18T06:01:16.827 に答える
1

これは、指数を除くすべての有効な数値を正しく処理するクラスです。

class NumberField(initialValue: Double) extends TextField(initialValue.toString) {
  // Note: exponents are not allowed
  val numberFormatException = new NumberFormatException
  listenTo(keys)
  reactions += {
    case event: KeyTyped => {
      try {
        // Don't allow "d" or "f" in the string even though it parses, e.g. 3.5d
        if (event.char.isLetter)
          throw numberFormatException
        // Don't allow string that doesn't parse to a double
        (text.substring(0, caret.position) +
          event.char +
          text.substring(caret.position)).toDouble
      } catch {
        case exception: NumberFormatException => event.consume()
      }
    }
  }

  def value : Double = text.toDouble
}
于 2017-01-19T15:38:13.090 に答える