S-JIS[2011-04-09] 変更履歴

Scala TabbedPane(Swing)

ScalaSwingのタブのメモ。


サンプル

タブを増減させる例。

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を取得しようとすると例外が発生するので注意。


Scala Swingへ戻る / Scala目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま