2014-02-12 27 views
2

我試圖瞭解從回答這個線程採取以下類是如何工作的: Scala Popup Menu如何用SuperMixin創建Scala swing包裝類?

由於線程是很老,我決定剛開始一個新的問題。我是新來的Java背景的Scala,我想知道這個類是如何工作的。我讀過一個與類相同名稱的對象就像一個帶有單例對象的類?我不知道這是如何適合於實現包裝雖然..(爲什麼我們需要的對象?)

什麼是SuperMixin特質呢?這個API說:「這個特徵用來將某些調用從對等端重定向到包裝和後端,用於暴露可以通過覆蓋來定製的方法。」這對於初學者來說並沒有很好的解釋。

如果有人可以幫助向初學者解釋這個類和對象(在我看來,神奇地)爲JPopupMenu給我一個包裝類並讓我調用showmen方法讓popupMenu出現在屏幕上..它也似乎我可以設置其內容(內容+ =一些scala.swing.menuItem)沒有在下面的類中定義?

import javax.swing.JPopupMenu 
import scala.swing.{ Component, MenuItem } 
import scala.swing.SequentialContainer.Wrapper 

object PopupMenu { 
    private[PopupMenu] trait JPopupMenuMixin { def popupMenuWrapper: PopupMenu } 
} 

class PopupMenu extends Component with Wrapper { 

    override lazy val peer: JPopupMenu = new JPopupMenu with PopupMenu.JPopupMenuMixin with SuperMixin { 
    def popupMenuWrapper = PopupMenu.this 
    } 

    def show(invoker: Component, x: Int, y: Int): Unit = peer.show(invoker.peer, x, y) 

    /* Create any other peer methods here */ 
} 

回答

2

PopupMenu同伴對象這裏不服務於任何特定的目的,除了作爲輔助性狀JPopupMenuMixin一個名字空間的作用。然後這個特徵可以通過使其private[PopupMenu]「隱藏」,所以它只被類別PopupMenu及其伴侶對象所知。

坦率地說,我沒有看到那個特質的目的。它定義了一個指向外部Scala Swing組件的方法popupMenuWrapper,但根本沒有使用該方法。因此,一個減少混亂的版本將是簡單的:

import scala.swing._ 
import javax.swing.JPopupMenu 

class PopupMenu extends Component with SequentialContainer.Wrapper { 
    override lazy val peer: JPopupMenu = new JPopupMenu with SuperMixin 

    def show(invoker: Component, x: Int, y: Int): Unit = peer.show(invoker.peer, x, y) 
} 

測試:

val pop = new PopupMenu { 
    contents += new MenuItem("Foo") 
} 
lazy val but: Button = Button("Test") { 
    pop.show(but, 0, 0) 
} 
val f = new Frame { 
    contents = but 
    pack().centerOnScreen() 
    open() 
} 

必要的包裝,唯一的事情是延長scala.swing.Component和與底層javax.swing組件覆蓋peer值。該組件的mixin with SuperMixinoverrides a few methods,例如paintComponent,以便將它們轉發到外部包裝組件。就這樣。

包裝混合在SequentialContainer.Wrapper允許contents +=操作添加菜單項。

+0

謝謝,這樣做更有意義 – user3301485

+0

注意:PopupMenu似乎是[2.11版股票scala.swing]的一部分(http://www.scala-lang.org/api/2.11.1/scala-swing/的index.html#scala.swing.PopupMenu)。 – Suma