Scala摆动新手问题

时间:2011-07-23 01:56:54

标签: swing scala timer

这是我第一次使用Swing和Scala进行的实验,并且对我的代码有一些疑问。它所做的只是生成一个带有颜色变化颜色的矩形的窗口。请随时回答一个或任何问题。

App window

1)我在下面使用了一个Java ActionListener,因为我无法弄清楚如何让javax.swing.Timer作为Publisher工作。有没有办法使用Scala模型,即listenTo() - 还是这样做?

2)Panel中被覆盖的preferredSize值似乎不起作用:窗口最小化。在我的Java版本中,我覆盖了getPreferredSize方法,但是在Panel中没有这样的方法,所以我认为这是实现它的方法,但为什么它不起作用?

3)Scala API文档中根本没有记录paintComponent。我认为这是因为它在Java中是protected访问权限,但它似乎是一种疏忽。我是否正确覆盖paintComponent或者它是否隐藏,因为我应该使用记录的paint方法?

4)Scala在组件上似乎没有getWidth()getHeight()方法 - 使用size.widthsize.height是否标准?

import swing._
import java.awt.{Graphics, Color}
import java.awt.event.{ActionEvent, ActionListener}
import javax.swing.Timer

object ColorPanel extends SimpleSwingApplication {
  private var c: Color = new Color(0)

  def top = new MainFrame {
    title = "Flash!"
    contents = p
  }

  val p = new Panel with ActionListener {
    override val preferredSize = new Dimension(200, 200)

    override def paintComponent(g: Graphics2D) {
      g.setColor(c)
      g.fillRect(0, 0, size.width, size.height)
    }

    def actionPerformed(e: ActionEvent) {
      c = new Color((c.getRGB() + 1000) % 16777216)
      repaint
    }
  }

  val timer = new Timer(100, p)
  timer.start()
}

1 个答案:

答案 0 :(得分:3)

  1. 没有立即回答。但你的方法当然可以。我不明白为什么你的观察者应该成为小组。我会直接使用计时器创建匿名ActionListener,而是向该面板添加特定方法,例如def animateColor() { ... }
  2. 您可以使用preferredSize = new Dimension(200, 200)
  3. 根据这份准官方文件,是:http://www.scala-lang.org/sid/8(第6节自定义绘画)
  4. 确实有点愚蠢地实例化一个新的Dimension。但是,如果您仔细查看SID示例,它会使用size.height。在超高性能代码中,您可能希望直接调用底层对等(peer.getWidth