#scala #scala-swing
#scala #scala-swing
Вопрос:
Я пытаюсь создать окно входа в систему для приложения, которое я делаю. Я весь день искал пример, но, похоже, не могу найти ничего, что помогло бы. Моя базовая структура выглядит следующим образом:
// App.scala
object App extends SimpleSwingApplication {
val ui = new BorderPanel {
//content
}
def top = new MainFrame {
title = "title"
contents = ui
}
}
Итак, какова стратегия создания окна входа в систему без отображения мэйнфрейма и закрытия его после входа в систему и отображения мэйнфрейма. Спасибо
Ответ №1:
Вот рабочий пример. Взял его из одного из моих проектов и немного скорректировал для вас:
import swing._
import scala.swing.BorderPanel.Position._
object App extends SimpleSwingApplication {
val ui = new BorderPanel {
//content
}
def top = new MainFrame {
title = "title"
contents = ui
}
val auth = new LoginDialog().auth.getOrElse(throw new IllegalStateException("You should login!!!"))
}
case class Auth(userName: String, password: String)
class LoginDialog extends Dialog {
var auth: Option[Auth] = None
val userName = new TextField
val password = new PasswordField
title = "Login"
modal = true
contents = new BorderPanel {
layout(new BoxPanel(Orientation.Vertical) {
border = Swing.EmptyBorder(5,5,5,5)
contents = new Label("User Name:")
contents = userName
contents = new Label("Password:")
contents = password
}) = Center
layout(new FlowPanel(FlowPanel.Alignment.Right)(
Button("Login") {
if (makeLogin()) {
auth = Some(Auth(userName.text, password.text))
close()
} else {
Dialog.showMessage(this, "Wrong username or password!", "Login Error", Dialog.Message.Error)
}
}
)) = South
}
def makeLogin() = true // here comes you login logic
centerOnScreen()
open()
}
Как вы можете видеть, я обычно использую модальный диалог, поэтому он блокируется во время инициализации приложения. Есть 2 результата: либо пользователь успешно входит в систему и видит ваш основной фрейм, либо он закрывает диалоговое окно входа и IllegalStateException
будет выброшен.