Как создать диалоговое окно параметров в Scala

Я пытался создать диалоговое окно параметров, которое не ограничивается двумя или тремя вариантами (Option.YesNo или Option.YesNoCancel), но мне не удалось найти способ использовать что-либо, кроме этих встроенных параметров. В частности, следующий отказывается принимать все, что я могу поставить для optionType:

    object Choices extends Enumeration {
      type Choice = Value
      val red, yellow, green, blue = Value
    }
        val options = List("Red", "Yellow", "Green", "Blue")
        label.text = showOptions(null,
                    "What is your favorite color?",
                    "Color preference",
                    optionType = Choices.Value,
                    entries = options, 
                    initial = 2) match {
          case Choice.red => "Red"
          case Choice.yellow => "Yellow"
          case Choice.green => "Green"
          case Choice.blue => "Blue"
          case _ => "Some other color"
        }

2 ответа

Да, это одна из многих ошибок дизайна в Scala-Swing. Вы можете написать свой собственный showOptions метод:

import swing._
import Swing._
import javax.swing.{UIManager, JOptionPane, Icon}

def showOptions[A <: Enumeration](
                parent: Component = null, 
                message: Any, 
                title: String = UIManager.getString("OptionPane.titleText"),  
                messageType: Dialog.Message.Value = Dialog.Message.Question, 
                icon: Icon = EmptyIcon, 
                entries: A,
                initial: A#Value): Option[A#Value] = {
  val r = JOptionPane.showOptionDialog(
                  if (parent == null) null else parent.peer,  message, title, 0, 
                  messageType.id, Swing.wrapIcon(icon),  
                  entries.values.toArray[AnyRef], initial)
  if (r < 0) None else Some(entries(r))
}

val res = showOptions(message = "Color", entries = Choices, initial = Choices.green)

Если вы хотите вместо этого передавать строки, измените на entries: Seq[Any], initial: Intиспользовать entries(initial) в вызове, и просто вернуть r из Int,

optionType не для передачи в типе Scala, и на самом деле я не уверен, какова его цель в этом API. Но вы можете просто установить optionType = Options.YesNoCancelи это должно сработать, я думаю.

Другие вопросы по тегам