2011-07-23 71 views
2

這是我第一次使用Swing和Scala進行的實驗,並且在下面有幾個關於我的代碼的問題。它所做的只是生成一個帶有彩色矩形的窗口,該窗口會改變顏色。請隨時回答一個或任何問題。斯卡拉擺動新手問題

App window

1)我用下面一個Java的ActionListener,因爲我無法工作,如何讓javax.swing.Timer中爲發佈商合作。有沒有辦法使用Scala模型,即listenTo() - 或者這是做到這一點的方法嗎?

2)我重寫的preferredSize面板中的值似乎不起作用:窗口出現最小化。在我的Java版本中,我重寫了getPreferredSize方法,但面板中沒有這種方法,所以我認爲這是實現方法,但爲什麼它不起作用?

3)paintComponent根本沒有記錄在Scala API文檔中。我認爲這是因爲它在Java中是protected訪問,但它看起來像一個疏忽。我是否正確覆蓋paintComponent或者它是隱藏的,因爲我應該使用記錄的paint方法?

4)斯卡拉似乎並沒有對成分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() 
} 

回答

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
+0

謝謝,非常有幫助 –