这是我第一次使用Swing和Scala进行的实验,并且对我的代码有一些疑问。它所做的只是生成一个带有颜色变化颜色的矩形的窗口。请随时回答一个或任何问题。
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.width
和size.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()
}
答案 0 :(得分:3)
ActionListener
,而是向该面板添加特定方法,例如def animateColor() { ... }
preferredSize = new Dimension(200, 200)
Dimension
。但是,如果您仔细查看SID示例,它会使用size.height
。在超高性能代码中,您可能希望直接调用底层对等(peer.getWidth
)