scala/ScalaBook/chapter-06/textFields.scala

import scala.swing._
import scala.swing.event._


object text extends SimpleGUIApplication {
  val user_name = "apostolos"
  val password  = "lala" //"HYa9gj"
  var editDone = false  
  def top = new MainFrame {
    title = "Login Screen"
    val user_label = new Label("User Name ")
    val user_field = new MaskedTextField("LLLLLLLL") {
      columns = 10
    }
    val pass_label = new Label("Password ")
    val pass_field = new PasswordField(10) {
      echoChar = '•'
    }
    val error_label = new Label("         ")
    contents = new GridBagPanel {
      var c = new Constraints
      c.gridwidth = java.awt.GridBagConstraints.RELATIVE
      add(user_label,c)
      add(user_field,c)
      c.gridwidth = java.awt.GridBagConstraints.REMAINDER
      add(Swing.VStrut(50), c)
      c.gridwidth = java.awt.GridBagConstraints.RELATIVE
      add(pass_label,c)
      add(pass_field,c)
      c.gridwidth = java.awt.GridBagConstraints.REMAINDER
      add(Swing.VStrut(50), c)
      add(error_label,c)
      border = Swing.EmptyBorder(50, 50, 50, 50)
    }
    listenTo(pass_field)
    reactions += {
      case EditDone(`pass_field`) => {
        if ( user_field.text.length > 0  ) 
          if (user_field.text == user_name && 
              pass_field.password.deepMkString("") == password)
            error_label.text = "Welcome!"
          else {
            import scala.actors.Actor._
            val delayGUI = actor {
              error_label.text = "Wrong Username/Password" 
              Thread.sleep(2500)
              error_label.text = "Please retry."
            }         
            user_field.text = ""
            user_field.requestFocus      
          }
      }
    }
  }
}

class MaskedTextField(format: String) extends TextComponent.HasColumns {
  var formatter : javax.swing.text.MaskFormatter = null 
  try {
    formatter = new javax.swing.text.MaskFormatter(format)
  } catch {
    case e : java.text.ParseException =>
      println("bad formatter")
      exit(-1)
  }   
  override lazy val peer: javax.swing.JFormattedTextField = 
    new javax.swing.JFormattedTextField(formatter)
  def columns: Int = peer.getColumns
  def columns_=(n: Int) = peer.setColumns(n)
}