0

我正在构建一个具有可变数量和按钮配置的应用程序,该应用程序需要监听按钮单击事件并处理它们。

由于按钮数量和配置的要求,我觉得我必须在范围内调用listenTo刚刚动态创建的按钮。BoxPanel但是我发现按钮的事件不会被接收。

但是,如果我记得一个创建的按钮,并listenTo在 的范围之外调用BoxPanel,那么它的事件将被接收。

我想知道为什么listenTo不在 BoxPanel 的范围内工作是怎么回事?无论如何,我没有看到这种用法的任何编译器错误。

下面是我的示例代码:

import scala.swing._
import scala.swing.event._

object TouchSelectUI extends SimpleSwingApplication {
  val touchMap = Vector(
    Vector("a", "b", "c"),
    Vector("d", "e", "g")
    // more may be defined in the future
  )
  val keyDemension = new Dimension(40, 25)
  def top = new MainFrame {
    title = "Touch Select Experiment"
    val input = new TextArea {
      columns = 80
      text = ""
    }
    var aButtonRemebered = new Button()
    contents = new FlowPanel {
      require(touchMap.size > 0, {println("The touch key definition is empty!")})
      for (c <- 0 until touchMap(0).size) {
    contents += new BoxPanel(Orientation.Vertical) {
      for (r <- 0 until touchMap.size) {
        val key = new Button {
        text = touchMap(r)(c)
          }
        contents += key
        aButtonRemebered = key
        listenTo(key) // listenTo here does not work.
      }
    }
      }
    contents += input 
    }

    //listenTo(aButtonRemebered) // Here listTo would work to deliver the event to the following reaction!
    reactions += {
      case ButtonClicked(b) => {
    println(s"Button clicked!")
    val c = b.text
    input.text = input.text + c
      }
    }
  }
}

非常感谢你的帮助!

4

1 回答 1

1

你是这个意思吗?

object TouchSelectUI extends SimpleSwingApplication {

  //..

  def top = new MainFrame {

    val main = this

    //..

    contents = new FlowPanel {
      //..
      for (c <- 0 until touchMap(0).size) {
        contents += new BoxPanel(Orientation.Vertical) {
          for (r <- 0 until touchMap.size) {
            val key = new Button
            //..
            main listenTo key
          }
        }
      }
    }
  }
}

编辑

Luigi Plinge有一个很好的建议,而不是这个:

  def top = new MainFrame {

    val main = this

你也可以这样做:

  def top = new MainFrame { main =>

他还提供了以下链接:

于 2013-02-16T09:34:17.200 回答