背景
在这篇文章中,我看到可以在JTabbedPane
上使用更改侦听器来检测新激活的选项卡的索引i
在Scala文档中,我可以看到,对于名为tp
的TabbedPane
,tp.selection.index
将为我提供所需的i
,但我如何连接代码以正确侦听?
我尝试遵循Scala似乎使用的reactions-listenTo
范式,但在找到合适的事件类型时遇到了问题。如果你点击这个链接并点击已知的子类,我可以将一个事件列表插入到反应中,但它们似乎都没有表示TabChanged。
下面是我尝试让它发挥作用。
代码
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
更新
我已经设法在谷歌上搜索了TabbedPane.scala的代码。下面是相关的片段——我正在努力找出对我的问题的影响。
/**
* 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中的UPDATE(源代码告诉所有(以及这些附加信息,我能够简单地找到一个解决方案:
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