S-JIS[2011-04-09] 変更履歴
タブを増減させる例。
import scala.swing._
object TabSample extends SimpleSwingApplication {
override def top = new MainFrame {
title = "タブサンプル"
val tabPane = new TabbedPane {
preferredSize = new Dimension(256, 212)
}
contents = tabPane
var n = 0
menuBar = new MenuBar {
contents += new MenuItem(Action("タブ追加") {
n += 1
val title = "実験" + n
tabPane.pages += new TabbedPane.Page(
title,
new Label(new java.util.Date().toString))
})
contents += new MenuItem(Action("タブ削除") {
val i = tabPane.selection.index
if (i >= 0) {
tabPane.pages.remove(i)
}
})
}
}
}
フレームのcontentsにタブペインを指定している。
何も無い状態のタブペインから始める場合、preferredSize(推奨サイズ)を指定しておくのが良いと思う。
タブの新規追加は、TabbedPaneのpagesの「+=メソッド」を呼び出す。
追加するのに使うクラスはTabbedPane.Page。
Pageのコンストラクターの第1引数がタブ名、第2引数が本体。今回の例ではLabelを指定しているが、実際はPanelとかのもっと複雑なコンポーネントになるだろう。
タブの削除はpagesのremoveメソッドを使う。
TabbedPane.selectionは現在選択されているタブを表している。
TabbedPaneの中ではTabbedPane.Pageそのものは保持していない。
タブの追加時は、peerであるJTabbedPaneの追加メソッドを呼び出して追加している。
pagesのapplyメソッドで(pages(0)
とか)でPageを取得することが出来るが、このPageインスタンスはapplyの中で新しく作っている。
つまり、タブペインの中で保持されているのはあくまでもpeer(java.swing)のコンポーネントだけであり、TabbedPane.Pageは一時的に使われるのみ。
どこか別の場所にTabbedPane.Pageを保持しておいて比較する、といった使い方は出来ない。
タブの選択が行われた時のイベントを捕捉する例。
val tabPane = new TabbedPane { preferredSize = new Dimension(256, 212) listenTo(this.selection) reactions += { case event.SelectionChanged(source) => if (selection.index >= 0) { val page = selection.page println(page.title) } } }
TabbedPane.selectionがタブ選択のイベント(SelectionChanged)を送信するので、listenToで指定してやる。
なお、タブが全て削除されて選択されたタブが無くなった場合はselection.indexが-1になる。
この状態でselection.pageを取得しようとすると例外が発生するので注意。