我试图从该线程的答案中了解以下类的工作原理:Scala 弹出菜单 https://stackoverflow.com/questions/938753/scala-popup-menu/6440072#6440072
由于该线程很旧,我决定开始一个新问题。我是 Scala 新手,有 Java 背景,我想知道这个类是如何工作的。我读到一个与类同名的对象就像一个带有单例对象的类?我不确定这如何适合实现包装器。(为什么我们需要该对象?)
SuperMixin 特性到底有什么作用? API 表示“此特征用于将某些调用从对等方重定向到包装器并返回。对于公开可通过重写进行自定义的方法很有用。”这并不能很好地向初学者解释。
如果有人能帮助向初学者解释这个类和对象(在我看来,神奇地)如何为我提供 JPopupMenu 的包装类,并让我调用使 popupMenu 出现在屏幕上的 show 方法,我将非常感激。 .并且似乎我可以设置其内容(contents+= some 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 */
}
The 伴生对象 for PopupMenu
除了充当辅助特征的名称空间之外,这里没有任何特定目的JPopupMenuMixin
。然后可以通过使其“隐藏”此特征private[PopupMenu]
,所以只有类知道PopupMenu
及其伴生对象。
坦白说,我不明白这个特性的目的。它定义了一个方法popupMenuWrapper
指向外部 Scala Swing 组件,但根本没有使用该方法。因此,一个不太令人困惑的版本很简单:
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)
}
Test:
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
并覆盖peer
与底层资产的价值javax.swing
成分。混音with SuperMixin
重写一些方法 https://github.com/scala/scala/blob/v2.10.3/src/swing/scala/swing/Component.scala#L51该组件的,例如paintComponent
,以便将它们转发到外包装组件。就这样。
包装纸混合在SequentialContainer.Wrapper
这允许contents +=
添加菜单项的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)