Swing 如何在Scala中检测/侦听已更改的选项卡窗格?

Swing 如何在Scala中检测/侦听已更改的选项卡窗格?,swing,scala,event-handling,Swing,Scala,Event Handling,背景 在这里,我看到可以在JTabbedPane上使用更改侦听器来检测新激活选项卡的索引I 在Scala文档中,我可以看到,对于名为tp的TabbedPane,tp.selection.index将为我提供所需的I,但我如何连接代码以正确侦听 我试图遵循Scala似乎使用的反应列表范例,但在找到合适的事件类型时遇到了问题。如果你点击并点击已知的子类,有一个事件列表,我可以将其插入到反应中,但它们似乎都没有改变 下面是我的尝试,让这个工作 代码 private val tp = new Tab

背景

在这里,我看到可以在
JTabbedPane
上使用更改侦听器来检测新激活选项卡的索引
I

在Scala文档中,我可以看到,对于名为
tp
TabbedPane
tp.selection.index
将为我提供所需的
I
,但我如何连接代码以正确侦听

我试图遵循Scala似乎使用的
反应列表
范例,但在找到合适的事件类型时遇到了问题。如果你点击并点击已知的子类,有一个事件列表,我可以将其插入到反应中,但它们似乎都没有改变

下面是我的尝试,让这个工作

代码

  private val tp = new TabbedPane() {
    pages += new TabbedPane.Page("Deck0",new ScrollPane(tables(0)))
    pages += new TabbedPane.Page("Deck1",new ScrollPane(tables(1)))

    reactions += {   // not sure what to put under reactions
      case e => println("%s => %s" format(e.getClass.getSimpleName, e.toString))
    }
  }
  listenTo( tp.selection )  // don't know if this is right
更新

  private val tp = new TabbedPane() {
    pages += new TabbedPane.Page("Deck0",new ScrollPane(tables(0)))
    pages += new TabbedPane.Page("Deck1",new ScrollPane(tables(1)))

    reactions += {   // not sure what to put under reactions
      case e => println("%s => %s" format(e.getClass.getSimpleName, e.toString))
    }
  }
  listenTo( tp.selection )  // don't know if this is right
我已经设法用谷歌搜索了。下面是相关的片段——我正试图找出我的问题的含义

  /**
   * The current page selection
   */
  object selection extends Publisher {
    def page: Page = pages(index)
    def page_=(p: Page) { index = p.index }

    def index: Int = peer.getSelectedIndex
    def index_=(n: Int) { peer.setSelectedIndex(n) }

    peer.addChangeListener(new javax.swing.event.ChangeListener {
      def stateChanged(e: javax.swing.event.ChangeEvent) { 
        publish(SelectionChanged(TabbedPane.this))
      }
    })
  }

进一步研究我添加到OP(source tells all)中的更新,我可以简单地找到一个解决方案:

import swing.event.SelectionChanged

private val tp = new TabbedPane() {
  pages += new TabbedPane.Page("Deck0",new ScrollPane(tables(0)))
  pages += new TabbedPane.Page("Deck1",new ScrollPane(tables(1)))
}

reactions += {
  case SelectionChanged( x ) => println( "changed to %d" format(tp.selection.index))
  case e => println("%s => %s" format(e.getClass.getSimpleName, e.toString))
}

listenTo( tp.selection )  // this is required

那更好。不是很直观;它只是不能像你期望的那样工作。