1

我目前正在使用 scala.swing 将数独求解程序转换为 GUI,并且在使用不同功能时遇到了一些麻烦。也就是说,我有一个完全解决谜题的功能,另一个提供提示条目的功能,还有一个重置网格的功能。该界面由 81 个单独的 ComboBox'es(参见:http: //i.imgur.com/45vzpei.png)和执行上述功能的三个按钮组成。我的问题是,虽然涉及的单独反应/案例具体参考了要听哪些按钮/功能,但任何按钮都会激发所有功能。我的每个侦听器/按钮的代码如下所示

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]...
  }

('comb##'s 是详尽的 81 个 ComboBoxes,'solve' 是解决整个难题的按钮。)如果我摆脱除一个侦听器/反应代码块之外的所有代码块,单击其余按钮即可完美。如果我尝试包含两个或所有侦听器/反应代码块,那么每个按钮都会导致执行所有功能,这显然是令人困惑和不可取的。

4

2 回答 2

2

不确定我是否理解您的问题。但是,如果您在模式匹配提取中使用小写名称,这些都是新变量,与其他地方定义的同名值无关。因此,要对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!
    }
  }
}
于 2013-05-25T22:56:10.630 回答
0

还有一种更短的方法来定义对按下按钮的反应。

import swing.{MainFrame, FlowPanel, Button}

val frame = new MainFrame {
  contents = new FlowPanel {
    contents += Button("solve")(println("solve"))
  }
  visible = true
}
于 2013-05-25T23:13:20.600 回答