2013-12-06 4 views
2

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

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" 
     } 

ответ

0

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

+1

Options.YesNoCancel работает для трех вариантов, но падает на четвертом. –

+0

Можете ли вы уточнить? Что происходит? –

+0

После использования трех доступных ответов (Result.Yes, Result.No, Result.Cancel) единственная оставшаяся вещь, которую я могу найти, - это _. Поэтому после этого я использую «case _ =>». Я могу сопоставить три действительных ответа на «красный», «желтый», «зеленый», но если я нажму «синий», я получу «java.util.NoSuchElementException: ключ не найден: 3» вместо моего последнего случая. –

1

Да, это одна из многих ошибок дизайна в 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.

+0

Это работает. Я закончил использование JOptionPane напрямую, так как я больше знаком с ним. Тем не менее, я не могу не задаться вопросом, действительно ли это ошибка, или я просто не нашел правильного заклинания, чтобы showOptions принимал мои типы аргументов. –

+0

Это ошибка, потому что она интерпретирует результат в терминах перечисления «OptionPane.Result», которое не будет выполнено для любых индексов, превышающих это перечисление. –

Смежные вопросы