Scala React 的简单示例 [英] Simple Example for Scala React

查看:68
本文介绍了Scala React 的简单示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基于论文 使用 Scala.React 弃用观察者模式 我试图从论文中建立一个简单的例子,但是它在线程main"java.lang.AssertionError 中抛出了一个异常Exception: assertion failed: This method must be run on its domain scala.react.NilDebug@1502c065

Based on the paper Deprecating the Observer Pattern with Scala.React I tried to set up a simple example from the paper, but it throwed an exception Exception in thread "main" java.lang.AssertionError: assertion failed: This method must be run on its domain scala.react.NilDebug@1502c065

一个相关的问题是运行一个简单的 Scala.React 表达式.

如何设置一切以使用 scala react 库的强大功能?

How do I set up everything to use the great power of the scala react library?

除了库 scala-react,我还使用了以下示例:

Besides the library scala-react, I used the following example:

object MyFirstReact extends App {

  object MyDomain extends scala.react.Domain {
    protected val scheduler: Scheduler = new ManualScheduler
    protected val engine: Engine = new Engine
  }
  import MyDomain._

  case class MouseEvent(position: (Int, Int))
  class Path(var positions: Seq[(Int, Int)]) {
    def this(pos: (Int, Int)) = this(Seq(pos))
    def lineTo(pos: (Int, Int)) { positions = positions :+ pos }
    def close { positions = positions :+ positions.head }
  }

  val mouseDown: Events[MouseEvent] = Events.once(MouseEvent((0, 0)))
  val mouseMove: Events[MouseEvent] = Events.once(MouseEvent((1, 1)))
  val mouseUp: Events[MouseEvent] = Events.once(MouseEvent((2, 2)))
  def draw(path: Path) { /* ... */ }

  Reactor.loop { self =>
    // step 1
    val path = new Path((self await mouseDown).position)
    self.loopUntil(mouseUp) { // step 2
      val m = self awaitNext mouseMove
      path.lineTo(m.position)
      draw(path)
    }
    path.close // step 3
    draw(path)
  }

}

推荐答案

您得到了异常,因为 Reactor.loop 必须用 schedule { ... } 块包装.但这还不够(我得到了一个 java.lang.StackOverflowError).

You got the exception because Reactor.loop must be wrapped with a schedule { ... } block. But fixing that is not enough (I got an java.lang.StackOverflowError).

无论如何,我使用 scala-swing 准备了一个完整的工作示例,您实际上可以在其中使用与您拥有的反应器代码完全相同的代码绘制一条线.我将 sbt-buildable 副本与包含在 github 中的 scala-react 一起放入:https://github.com/zsoltdonca/scala-react-line-drawing

Anyhow, I prepared a full working example using a scala-swing in which you can actually draw a line with the very same reactor code that you have. I put a sbt-buildable copy with scala-react included to github: https://github.com/zsoltdonca/scala-react-line-drawing

package zsd

import scala.swing._
import java.awt.event.{MouseMotionAdapter, MouseEvent, MouseAdapter}
import java.awt.{Color, Point}
import scala.react.Domain

object MyDomain extends Domain {
  val scheduler = new SwingScheduler()
  val engine = new Engine
}

import MyDomain._

object ScalaReactLineDrawing extends SimpleSwingApplication with Observing {

  override def main(args: Array[String]) {
    schedule { startup(args) }
    start() // starts the scala-react engine
  }

  override def top: Frame = new MainFrame() {
    contents = new FlowPanel() {
      val mouseDown = EventSource[Point]
      val mouseMove = EventSource[Point]
      val mouseUp = EventSource[Point]

      val mainProgramFlow = Reactor.loop {
        self =>
        // step 1
          val path = new Path(self await mouseDown)
          self.loopUntil(mouseUp) {
            // step 2
            val m = self awaitNext mouseMove
            path.lineTo(m)
            draw(path)
          }
          path.close() // step 3
          draw(path)
      }

      peer.addMouseListener(new MouseAdapter {
        override def mousePressed(e: MouseEvent): Unit = mouseDown << e.getPoint
        override def mouseReleased(e: MouseEvent): Unit = mouseUp << e.getPoint
      })
      peer.addMouseMotionListener(new MouseMotionAdapter {
        override def mouseDragged(e: MouseEvent): Unit = mouseMove << e.getPoint
      })

      class Path(var positions: Seq[Point]) {
        def this(pos: Point) = this(Seq(pos))

        def lineTo(pos: Point) {
          positions = positions :+ pos
        }

        def close() {
          positions = positions :+ positions.head
        }
      }

      var pathDrawn = new Path(new Point(0, 0))
      def draw(path: Path) {
        pathDrawn = path
        repaint()
      }

      override protected def paintComponent(g: swing.Graphics2D): Unit = {
        super.paintComponent(g)

        val xPoints = pathDrawn.positions.map(pos => pos.x).toArray
        val yPoints = pathDrawn.positions.map(pos => pos.y).toArray
        g.setColor(Color.BLACK)
        g.drawPolyline(xPoints, yPoints, pathDrawn.positions.length)
      }
    }
    preferredSize = new Dimension(400, 300)
    pack()
  }
}

这篇关于Scala React 的简单示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆