Java.use(better); Episode#21 ファインダーを作成する

前の記事記事一覧次の記事
Java.use(better, Scala);


Episode#21

ファインダーを作成する:開け胡麻



自分が楽しまないと本当の仕事はできない
自分が楽しんで仕事をすれば、それが会社の為にも世の中の為にもなる
Takeo Fukui - Wikipedia

《関連記事》

┃開け胡麻:ツリーを利用する

コンポーネントの動作を確認する

新たに作成した TreeView の動作を確認するために、簡単なアプリケーションを作成します。これを起動すると、次のようなウインドーが現れます。

$ scala cherry.pie.Tips


任意のツリー項目を選択すると、それに合わせてタイトルが変化します。

たとえば、ツリー項目 blue を選択すると、タイトルが blue に変化します。

  9: import swing._
 10: object AppWindow extends MainFrame {
 14:   title = "TreeView"
 15:   contents = new View(this)
 16:   peer.setLocationRelativeTo(null)
 17: }
 20: class View(frame: Frame) extends BorderPanel {
 21: self_ =>
 22:   val treeView = new TreeView {
 23:     new Publisher {
 24:       reactions += {
 25:         case TreeSelectionChanged(source) => update(source)
 26:       }
 27:     }.listenTo(this)
 28:   }
 29:   new ScrollPane(treeView) {
 30:     import java.awt.Dimension
 31:     preferredSize = new Dimension(200,150)
 32:     self_.add(this, BorderPanel.Position.Center)
 33:   }
 34:   def update(source: TreeView) {
 35:     frame.title =
 36:       source.peer.getLastSelectedPathComponent.toString
 37:   }
 38: }

[22-28]新たに作成した TreeView を利用するときも、パッケージ scala.swing が提供する他のコンポーネントと同様です。コンポーネントを作成するときに、どのイベントに呼応して何をしたいかを記述するだけです。

[23]Publisher は、[27]これから生成しようとするコンポーネント自身 this で発生したイベントに傾聴 listenTo することで、[24]reactions に登録したイベントに呼応できます。[25]コンストラクターパターンから、イベント TreeSelectionChanged が発生したコンポーネント source を特定できるので、それに対して適切な処理を行います。

[34-37]イベント処理の詳細をここに記述します。ここでは、選択したリスト項目の情報を、ウインドーのタイトルに反映させます。[36]また、peer を介して既存のコンポーネントにアクセスする代わりに(必要なら)これを TreeView の新たなメソッドとして定義できます。たとえば、

   : class TreeView extends Component {
   :   def selectedPath = peer.getLastSelectedPathComponent.toString

新たなメソッド selectedPath を定義するだけで、

   :   def update(source: TreeView) {
   :     frame.title = source.selectedPath
   :   }

前述したコードの断片は、より簡潔で見通しが良くなります。

Scala では、Java で構築した既存のパッケージ javax.swing を再利用するための仕掛を、パッケージ scala.swing に用意してあるので、新たなコンポーネントを追加/拡張するのも容易です。


》作業中です《

 ↑ TOP

Created: 2010/05/23|Last updated: 2013/06/04 12:00:29