ScalaとSwingでテキストエディタを作ってみる

Scala言語の普及のために・・・というより自己満足でテキストエディタを作ってみることにしました。
ScalaではJavaのクラスがそのまま使えるので、Swingが使えます。
しかし、いくつか注意が必要です。
・booleanをBooleanと書かないとワーニングが出る
・instanceofが使えない 代わりにmatchを使う
などに気をつける必要があります。

Scalaでは無名関数(クロージャとかラムダとかいうやつ)が使えるので、イベント処理などに役に立ちます。
無名関数を使うと、少しコードが短くなる気がします。

というわけで書いてみたエディタですが、まだファイル保存すらできません。テキスト入力欄ができただけです。
codelogyさんの記事や、
ひしだまさんのホームページJTextPaneのページを参考にして書いてみました。
一応コードを書いておきます。

import javax.swing._
import java.awt._
import java.awt.event._

class Listener (f: ActionEvent => Unit) extends ActionListener {
  override def actionPerformed (e: ActionEvent) = {f (e)}
}

// 折り返さないJTextPane
class JNoWrapPane extends JTextPane {
  // booleanではなくBoolean(最初が大文字)ではないとワーニングが出る
  override def getScrollableTracksViewportWidth (): Boolean = {
    // 文字が右端に届かない時はtrueを返す、それ以外の時はfalse
    val parent = getParent ()
    if (parent match {
      case p: JViewport => true
      case _ => false
    }) {
      val port = parent
      val w = port.getWidth ()
      val ui = getUI ()
      val size = ui.getPreferredSize (this)
      if (size.width < w) {
        return true
      }
    }
    return false
  }
}

object SimpleEditor {
  def main (args: Array[String]) = {
    val frame = new JFrame ("SimpleEditor")

    // メニュー関係
    val menuBar = new JMenuBar ();
    val fileMenu = new JMenu ("ファイル")
    val menuExit = new JMenuItem ("終了")

    menuExit.addActionListener (new Listener (ev => System.exit(0)))

    fileMenu.add (menuExit)
    menuBar.add (fileMenu)
    frame.setJMenuBar (menuBar)

    // テキストの入力欄
    val text = new JNoWrapPane ()
    val pane = new JScrollPane (text)
    
    frame.getContentPane().add(pane)

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE)
    frame.setSize (new Dimension (320, 240))
    frame.setVisible (true)
  }
}