2013-05-25 3 views
1

В настоящее время я запускаю программу решения sudoku в графический интерфейс с scala.swing и сталкиваюсь с некоторыми проблемами с использованием различных функций. То есть у меня есть функция для полного решения головоломки, другая - для ввода подсказки, а другая - для сброса сетки. Интерфейс состоит из 81 отдельных ComboBox'ов (см.: http://i.imgur.com/45vzpei.png) и трех кнопок, которые выполняют указанные функции. Моя проблема заключается в том, что, в то время как отдельные реакции/случаи связаны с конкретными кнопками/функциями для прослушивания, любая кнопка вызывает все функции. Мой код для каждого из слушателей/кнопок выглядит примерно следующийScala.swing GUI - Как отделить несколько случаев реакции

listenTo(solve,comb11,comb12,comb13,comb14,comb15,comb16,comb17,comb18,comb19,comb21,comb22,comb23,comb24,comb25,comb26,comb27,comb28,comb29,comb31,comb32,comb33,comb34,comb35,comb36,comb37,comb38,comb39,comb41,comb42,comb43,comb44,comb45,comb46,comb47,comb48,comb49,comb51,comb52,comb53,comb54,comb55,comb56,comb57,comb58,comb59,comb61,comb62,comb63,comb64,comb65,comb66,comb67,comb68,comb69,comb71,comb72,comb73,comb74,comb75,comb76,comb77,comb78,comb79,comb81,comb82,comb83,comb84,comb85,comb86,comb87,comb88,comb89,comb91,comb92,comb93,comb94,comb95,comb96,comb97,comb98,comb99) 
    reactions += { 
    case ButtonClicked(solve) => 
    ...[working code for solve function]... 
    } 

(The «гребенки ##» s является исчерпывающим 81 ComboBoxes и «решают» кнопка, которая решает все головоломки.) Если Я избавляюсь от всех, кроме одного из блоков слушателя/реакции кода, нажатие оставшейся кнопки работает отлично. Если я попытаюсь включить два или все блоки кода слушателя/реакции, то каждая кнопка вызывает ВСЕ функции, которые явно запутывают и нежелательны.

ответ

2

Не уверен, что я понимаю вашу проблему. Но если вы используете lower case names in pattern matching extraction, это свежие переменные и не имеют ничего общего со значениями одного и того же имени, определенными в другом месте. Таким образом, чтобы реагировать на кнопку solve, вы должны соответствовать со значением solve, которые вы можете сделать, поместив его в спине клещи:

listenTo(allMyButtons: _*) 
reactions += { 
    case ButtonClicked(`solve`) => // note the back ticks! 
    ...[working code for solve function]... 
} 

В противном случае, почему вы не просто держать каждую реакцию с каждым со списком?

val combos = Vector.tabulate(81) { i => 
    new ComboBox(1 to 9) { 
    listenTo(this) 
    reactions += { 
     case ButtonClicked(_) => 
     ... // not important to check the button - we only listen to one! 
    } 
    } 
} 
0

Существует также более короткий способ определения реакции на нажатую кнопку.

import swing.{MainFrame, FlowPanel, Button} 

val frame = new MainFrame { 
    contents = new FlowPanel { 
    contents += Button("solve")(println("solve")) 
    } 
    visible = true 
} 
Смежные вопросы